From af661cf543921fab3e6e904290419d27d6f57c9b Mon Sep 17 00:00:00 2001 From: Chneemann Date: Sun, 12 May 2024 11:57:51 +0200 Subject: [PATCH] first commit --- .editorconfig | 16 + .gitignore | 48 + .vscode/extensions.json | 4 + .vscode/launch.json | 20 + .vscode/tasks.json | 42 + README.md | 27 + angular.json | 92 + firebase.json | 1 + package-lock.json | 13515 ++++++++++++++++ package.json | 45 + src/app/app.component.html | 3 + src/app/app.component.scss | 0 src/app/app.component.spec.ts | 29 + src/app/app.component.ts | 17 + src/app/app.config.ts | 38 + src/app/app.routes.ts | 22 + .../channel-informations.component.html | 163 + .../channel-informations.component.scss | 317 + .../channel-informations.component.spec.ts | 23 + .../channel-informations.component.ts | 236 + .../chat-content/chat-content.component.html | 39 + .../chat-content/chat-content.component.scss | 73 + .../chat-content.component.spec.ts | 23 + .../chat-content/chat-content.component.ts | 179 + .../chat-msg-box/chat-msg-box.component.html | 132 + .../chat-msg-box/chat-msg-box.component.scss | 241 + .../chat-msg-box.component.spec.ts | 23 + .../chat-msg-box/chat-msg-box.component.ts | 358 + .../main-chat/info/info.component.html | 75 + .../main-chat/info/info.component.scss | 70 + .../main-chat/info/info.component.spec.ts | 23 + .../main-chat/info/info.component.ts | 84 + .../main-chat/main-chat.component.html | 179 + .../main-chat/main-chat.component.scss | 296 + .../main-chat/main-chat.component.spec.ts | 23 + .../main-chat/main-chat.component.ts | 365 + ...pen-send-prv-message-window.component.html | 91 + ...pen-send-prv-message-window.component.scss | 188 + ...-send-prv-message-window.component.spec.ts | 23 + .../open-send-prv-message-window.component.ts | 100 + .../show-channel-member.component.html | 130 + .../show-channel-member.component.scss | 344 + .../show-channel-member.component.spec.ts | 23 + .../show-channel-member.component.ts | 193 + .../attachments/attachments.component.html | 68 + .../attachments/attachments.component.scss | 71 + .../attachments/attachments.component.spec.ts | 23 + .../attachments/attachments.component.ts | 54 + .../edit-msg/edit-msg.component.html | 65 + .../edit-msg/edit-msg.component.scss | 162 + .../edit-msg/edit-msg.component.spec.ts | 23 + .../edit-msg/edit-msg.component.ts | 160 + .../options-menu/options-menu.component.html | 137 + .../options-menu/options-menu.component.scss | 137 + .../options-menu.component.spec.ts | 23 + .../options-menu/options-menu.component.ts | 200 + .../reaction-emojis.component.html | 91 + .../reaction-emojis.component.scss | 134 + .../reaction-emojis.component.spec.ts | 23 + .../reaction-emojis.component.ts | 225 + .../single-chat/single-chat.component.html | 147 + .../single-chat/single-chat.component.scss | 216 + .../single-chat/single-chat.component.spec.ts | 23 + .../single-chat/single-chat.component.ts | 176 + .../choose-avatar.component.html | 57 + .../choose-avatar.component.scss | 146 + .../choose-avatar.component.spec.ts | 23 + .../choose-avatar/choose-avatar.component.ts | 96 + .../main-login/login/login.component.html | 102 + .../main-login/login/login.component.scss | 249 + .../main-login/login/login.component.spec.ts | 23 + .../main-login/login/login.component.ts | 62 + .../main-login/main-login.component.html | 5 + .../main-login/main-login.component.scss | 3 + .../main-login/main-login.component.spec.ts | 23 + .../main-login/main-login.component.ts | 20 + .../password-forget.component.html | 61 + .../password-forget.component.scss | 170 + .../password-forget.component.spec.ts | 23 + .../password-forget.component.ts | 77 + .../password-reset.component.html | 83 + .../password-reset.component.scss | 111 + .../password-reset.component.spec.ts | 23 + .../password-reset.component.ts | 95 + .../register/register.component.html | 117 + .../register/register.component.scss | 135 + .../register/register.component.spec.ts | 23 + .../main-login/register/register.component.ts | 95 + src/app/components/main/main.component.html | 76 + src/app/components/main/main.component.scss | 129 + .../components/main/main.component.spec.ts | 22 + src/app/components/main/main.component.ts | 114 + .../secondary-chat.component.html | 66 + .../secondary-chat.component.scss | 129 + .../secondary-chat.component.spec.ts | 23 + .../secondary-chat.component.ts | 164 + .../searchbar/searchbar.component.html | 9 + .../searchbar/searchbar.component.scss | 54 + .../searchbar/searchbar.component.spec.ts | 23 + .../sidebar/searchbar/searchbar.component.ts | 38 + .../show-all-users.component.html | 34 + .../show-all-users.component.scss | 66 + .../show-all-users.component.spec.ts | 23 + .../show-all-users.component.ts | 93 + .../add-new-channel.component.html | 150 + .../add-new-channel.component.scss | 343 + .../add-new-channel.component.spec.ts | 23 + .../add-new-channel.component.ts | 219 + .../sidebar-channels.component.html | 59 + .../sidebar-channels.component.scss | 168 + .../sidebar-channels.component.spec.ts | 23 + .../sidebar-channels.component.ts | 87 + ...idebar-direct-messages-user.component.html | 81 + ...idebar-direct-messages-user.component.scss | 59 + ...bar-direct-messages-user.component.spec.ts | 23 + .../sidebar-direct-messages-user.component.ts | 117 + .../sidebar-direct-messages.component.html | 39 + .../sidebar-direct-messages.component.scss | 87 + .../sidebar-direct-messages.component.spec.ts | 23 + .../sidebar-direct-messages.component.ts | 64 + .../sidebar-toggle.component.html | 6 + .../sidebar-toggle.component.scss | 44 + .../sidebar-toggle.component.spec.ts | 23 + .../sidebar-toggle.component.ts | 43 + .../components/sidebar/sidebar.component.html | 45 + .../components/sidebar/sidebar.component.scss | 61 + .../sidebar/sidebar.component.spec.ts | 23 + .../components/sidebar/sidebar.component.ts | 75 + src/app/highlight.pipe.spec.ts | 8 + src/app/highlight.pipe.ts | 22 + src/app/interface/channel.interface.ts | 20 + src/app/interface/chat.interface.ts | 33 + src/app/interface/user.interface.ts | 9 + src/app/service/channle.service.ts | 163 + src/app/service/chat.service.ts | 192 + src/app/service/download-files.service.ts | 65 + src/app/service/language.service.ts | 26 + src/app/service/login.service.ts | 390 + src/app/service/overlay.service.ts | 16 + src/app/service/shared.service.ts | 12 + src/app/service/toggle-boolean.service.ts | 25 + src/app/service/user.service.ts | 174 + .../emoji-picker/emoji-picker.component.html | 7 + .../emoji-picker/emoji-picker.component.scss | 0 .../emoji-picker.component.spec.ts | 23 + .../emoji-picker/emoji-picker.component.ts | 35 + .../edit-user-details.component.html | 109 + .../edit-user-details.component.scss | 194 + .../edit-user-details.component.spec.ts | 23 + .../edit-user-details.component.ts | 176 + .../header/edit-user/edit-user.component.html | 55 + .../header/edit-user/edit-user.component.scss | 192 + .../edit-user/edit-user.component.spec.ts | 23 + .../header/edit-user/edit-user.component.ts | 55 + .../components/header/header.component.html | 65 + .../components/header/header.component.scss | 217 + .../header/header.component.spec.ts | 23 + .../components/header/header.component.ts | 90 + .../search-bar/search-bar.component.html | 86 + .../search-bar/search-bar.component.scss | 193 + .../search-bar/search-bar.component.spec.ts | 23 + .../header/search-bar/search-bar.component.ts | 237 + .../components/imprint/imprint.component.html | 74 + .../components/imprint/imprint.component.scss | 105 + .../imprint/imprint.component.spec.ts | 21 + .../components/imprint/imprint.component.ts | 25 + .../login/footer/footer.component.html | 4 + .../login/footer/footer.component.scss | 33 + .../login/footer/footer.component.spec.ts | 23 + .../login/footer/footer.component.ts | 14 + .../login/header/header.component.html | 5 + .../login/header/header.component.scss | 13 + .../login/header/header.component.spec.ts | 23 + .../login/header/header.component.ts | 10 + .../shared/components/login/mixins/mixin.scss | 137 + .../start-header/start-header.component.html | 55 + .../start-header/start-header.component.scss | 308 + .../start-header.component.spec.ts | 23 + .../start-header/start-header.component.ts | 88 + .../components/overlay/overlay.component.html | 17 + .../components/overlay/overlay.component.scss | 37 + .../overlay/overlay.component.spec.ts | 23 + .../components/overlay/overlay.component.ts | 67 + .../privacy-policy.component.html | 229 + .../privacy-policy.component.scss | 139 + .../privacy-policy.component.spec.ts | 23 + .../privacy-policy.component.ts | 25 + .../small-btn/small-btn.component.html | 19 + .../small-btn/small-btn.component.scss | 17 + .../small-btn/small-btn.component.spec.ts | 23 + .../small-btn/small-btn.component.ts | 19 + .../components/user/user.component.html | 28 + .../components/user/user.component.scss | 88 + .../components/user/user.component.spec.ts | 23 + .../shared/components/user/user.component.ts | 22 + src/assets/.gitkeep | 0 src/assets/fonts/figtree-v5-latin-500.woff2 | Bin 0 -> 11580 bytes src/assets/fonts/figtree-v5-latin-600.woff2 | Bin 0 -> 11644 bytes src/assets/fonts/figtree-v5-latin-700.woff2 | Bin 0 -> 11600 bytes .../fonts/figtree-v5-latin-regular.woff2 | Bin 0 -> 11488 bytes .../fonts/nunito-sans-v15-latin-200.woff2 | Bin 0 -> 13336 bytes .../nunito-sans-v15-latin-200italic.woff2 | Bin 0 -> 13888 bytes .../fonts/nunito-sans-v15-latin-300.woff2 | Bin 0 -> 13724 bytes .../nunito-sans-v15-latin-300italic.woff2 | Bin 0 -> 14492 bytes .../fonts/nunito-sans-v15-latin-500.woff2 | Bin 0 -> 13932 bytes .../nunito-sans-v15-latin-500italic.woff2 | Bin 0 -> 14836 bytes .../fonts/nunito-sans-v15-latin-600.woff2 | Bin 0 -> 14048 bytes .../nunito-sans-v15-latin-600italic.woff2 | Bin 0 -> 14820 bytes .../fonts/nunito-sans-v15-latin-700.woff2 | Bin 0 -> 13800 bytes .../nunito-sans-v15-latin-700italic.woff2 | Bin 0 -> 14648 bytes .../fonts/nunito-sans-v15-latin-800.woff2 | Bin 0 -> 13888 bytes .../nunito-sans-v15-latin-800italic.woff2 | Bin 0 -> 14712 bytes .../fonts/nunito-sans-v15-latin-900.woff2 | Bin 0 -> 13972 bytes .../nunito-sans-v15-latin-900italic.woff2 | Bin 0 -> 14884 bytes .../fonts/nunito-sans-v15-latin-italic.woff2 | Bin 0 -> 14700 bytes .../fonts/nunito-sans-v15-latin-regular.woff2 | Bin 0 -> 13860 bytes src/assets/fonts/nunito-v26-latin-200.woff2 | Bin 0 -> 15004 bytes .../fonts/nunito-v26-latin-200italic.woff2 | Bin 0 -> 15648 bytes src/assets/fonts/nunito-v26-latin-300.woff2 | Bin 0 -> 16068 bytes .../fonts/nunito-v26-latin-300italic.woff2 | Bin 0 -> 16948 bytes src/assets/fonts/nunito-v26-latin-500.woff2 | Bin 0 -> 16504 bytes .../fonts/nunito-v26-latin-500italic.woff2 | Bin 0 -> 17312 bytes src/assets/fonts/nunito-v26-latin-600.woff2 | Bin 0 -> 16540 bytes .../fonts/nunito-v26-latin-600italic.woff2 | Bin 0 -> 17444 bytes src/assets/fonts/nunito-v26-latin-700.woff2 | Bin 0 -> 16312 bytes .../fonts/nunito-v26-latin-700italic.woff2 | Bin 0 -> 17164 bytes src/assets/fonts/nunito-v26-latin-800.woff2 | Bin 0 -> 16488 bytes .../fonts/nunito-v26-latin-800italic.woff2 | Bin 0 -> 17524 bytes src/assets/fonts/nunito-v26-latin-900.woff2 | Bin 0 -> 16656 bytes .../fonts/nunito-v26-latin-900italic.woff2 | Bin 0 -> 17500 bytes .../fonts/nunito-v26-latin-italic.woff2 | Bin 0 -> 17152 bytes .../fonts/nunito-v26-latin-regular.woff2 | Bin 0 -> 16292 bytes src/assets/i18n/de.json | 291 + src/assets/i18n/en.json | 292 + src/assets/img/add-reaction.svg | 8 + src/assets/img/add.svg | 3 + src/assets/img/addIcon.svg | 3 + src/assets/img/addPerson.svg | 3 + src/assets/img/answer.svg | 3 + src/assets/img/arrowLeft.png | Bin 0 -> 173 bytes src/assets/img/arrowRight.png | Bin 0 -> 174 bytes src/assets/img/atIcon.svg | 3 + src/assets/img/attachments/doc.png | Bin 0 -> 24936 bytes src/assets/img/attachments/pdf.png | Bin 0 -> 24484 bytes src/assets/img/attachments/txt.png | Bin 0 -> 24384 bytes src/assets/img/charater1.svg | 17 + src/assets/img/clap-hands.svg | 16 + src/assets/img/closeIcon.svg | 3 + src/assets/img/documentIcon.svg | 1 + src/assets/img/hashtag.svg | 3 + src/assets/img/home-icon.svg | 32 + src/assets/img/imgIcon.svg | 1 + src/assets/img/keyboardArrowDown.svg | 3 + src/assets/img/language.svg | 1 + src/assets/img/login/arrow-back.png | Bin 0 -> 188 bytes src/assets/img/login/arrow-back.svg | 8 + src/assets/img/login/box-checked-hover.png | Bin 0 -> 1914 bytes src/assets/img/login/box-checked.png | Bin 0 -> 394 bytes src/assets/img/login/box-hover.png | Bin 0 -> 543 bytes src/assets/img/login/box.png | Bin 0 -> 1425 bytes src/assets/img/login/close-eye.svg | 1 + src/assets/img/login/email-send-btn.svg | 24 + src/assets/img/login/google.svg | 6 + src/assets/img/login/lock.png | Bin 0 -> 400 bytes src/assets/img/login/logo-animation.svg | 19 + src/assets/img/login/logo.png | Bin 0 -> 3461 bytes src/assets/img/login/logo.svg | 32 + src/assets/img/login/mail.png | Bin 0 -> 419 bytes src/assets/img/login/open-eye.svg | 1 + src/assets/img/login/person-filled.png | Bin 0 -> 447 bytes src/assets/img/mail-icon.svg | 8 + src/assets/img/mail-iconBlack.svg | 3 + src/assets/img/messageIcon.svg | 3 + src/assets/img/more-vertical.svg | 3 + src/assets/img/mp3Icon.svg | 1 + src/assets/img/offlineRing.svg | 3 + src/assets/img/okay.svg | 4 + src/assets/img/onlineRing.svg | 3 + src/assets/img/pdfIcon.svg | 1 + src/assets/img/pencil.svg | 3 + src/assets/img/personCircle.svg | 3 + src/assets/img/radioButtonChecked.svg | 11 + src/assets/img/radioButtonUnchecked.svg | 10 + src/assets/img/save.svg | 3 + src/assets/img/search-icon.svg | 3 + src/assets/img/sendIcon.svg | 3 + src/assets/img/sidebar/account-circle.svg | 3 + src/assets/img/sidebar/add-circle.svg | 3 + src/assets/img/sidebar/arrow-drop-down.svg | 3 + src/assets/img/sidebar/arrow_right.png | Bin 0 -> 208 bytes src/assets/img/sidebar/bubbles.svg | 8 + src/assets/img/sidebar/new-chat.svg | 8 + src/assets/img/sidebar/toggle.svg | 5 + src/assets/img/sidebar/workspace-logo.svg | 38 + src/assets/img/smileIcon.svg | 3 + src/assets/img/user-icons/female-1.svg | 18 + src/assets/img/user-icons/female-2.svg | 19 + src/assets/img/user-icons/guest.svg | 9 + src/assets/img/user-icons/male-1.svg | 16 + src/assets/img/user-icons/male-2.svg | 17 + src/assets/img/user-icons/male-3.svg | 18 + src/assets/img/user-icons/male-4.svg | 17 + src/assets/img/verticalLine.svg | 3 + src/assets/img/videoIcon.svg | 1 + src/favicon.ico | Bin 0 -> 15406 bytes src/index.html | 21 + src/main.ts | 6 + src/styles.scss | 352 + tsconfig.app.json | 14 + tsconfig.json | 33 + tsconfig.spec.json | 14 + 311 files changed, 31070 insertions(+) create mode 100644 .editorconfig create mode 100644 .gitignore create mode 100644 .vscode/extensions.json create mode 100644 .vscode/launch.json create mode 100644 .vscode/tasks.json create mode 100644 README.md create mode 100644 angular.json create mode 100644 firebase.json create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 src/app/app.component.html create mode 100644 src/app/app.component.scss create mode 100644 src/app/app.component.spec.ts create mode 100644 src/app/app.component.ts create mode 100644 src/app/app.config.ts create mode 100644 src/app/app.routes.ts create mode 100644 src/app/components/main-chat/channel-informations/channel-informations.component.html create mode 100644 src/app/components/main-chat/channel-informations/channel-informations.component.scss create mode 100644 src/app/components/main-chat/channel-informations/channel-informations.component.spec.ts create mode 100644 src/app/components/main-chat/channel-informations/channel-informations.component.ts create mode 100644 src/app/components/main-chat/chat-content/chat-content.component.html create mode 100644 src/app/components/main-chat/chat-content/chat-content.component.scss create mode 100644 src/app/components/main-chat/chat-content/chat-content.component.spec.ts create mode 100644 src/app/components/main-chat/chat-content/chat-content.component.ts create mode 100644 src/app/components/main-chat/chat-msg-box/chat-msg-box.component.html create mode 100644 src/app/components/main-chat/chat-msg-box/chat-msg-box.component.scss create mode 100644 src/app/components/main-chat/chat-msg-box/chat-msg-box.component.spec.ts create mode 100644 src/app/components/main-chat/chat-msg-box/chat-msg-box.component.ts create mode 100644 src/app/components/main-chat/info/info.component.html create mode 100644 src/app/components/main-chat/info/info.component.scss create mode 100644 src/app/components/main-chat/info/info.component.spec.ts create mode 100644 src/app/components/main-chat/info/info.component.ts create mode 100644 src/app/components/main-chat/main-chat.component.html create mode 100644 src/app/components/main-chat/main-chat.component.scss create mode 100644 src/app/components/main-chat/main-chat.component.spec.ts create mode 100644 src/app/components/main-chat/main-chat.component.ts create mode 100644 src/app/components/main-chat/show-channel-member/open-send-prv-message-window/open-send-prv-message-window.component.html create mode 100644 src/app/components/main-chat/show-channel-member/open-send-prv-message-window/open-send-prv-message-window.component.scss create mode 100644 src/app/components/main-chat/show-channel-member/open-send-prv-message-window/open-send-prv-message-window.component.spec.ts create mode 100644 src/app/components/main-chat/show-channel-member/open-send-prv-message-window/open-send-prv-message-window.component.ts create mode 100644 src/app/components/main-chat/show-channel-member/show-channel-member.component.html create mode 100644 src/app/components/main-chat/show-channel-member/show-channel-member.component.scss create mode 100644 src/app/components/main-chat/show-channel-member/show-channel-member.component.spec.ts create mode 100644 src/app/components/main-chat/show-channel-member/show-channel-member.component.ts create mode 100644 src/app/components/main-chat/single-chat/attachments/attachments.component.html create mode 100644 src/app/components/main-chat/single-chat/attachments/attachments.component.scss create mode 100644 src/app/components/main-chat/single-chat/attachments/attachments.component.spec.ts create mode 100644 src/app/components/main-chat/single-chat/attachments/attachments.component.ts create mode 100644 src/app/components/main-chat/single-chat/edit-msg/edit-msg.component.html create mode 100644 src/app/components/main-chat/single-chat/edit-msg/edit-msg.component.scss create mode 100644 src/app/components/main-chat/single-chat/edit-msg/edit-msg.component.spec.ts create mode 100644 src/app/components/main-chat/single-chat/edit-msg/edit-msg.component.ts create mode 100644 src/app/components/main-chat/single-chat/options-menu/options-menu.component.html create mode 100644 src/app/components/main-chat/single-chat/options-menu/options-menu.component.scss create mode 100644 src/app/components/main-chat/single-chat/options-menu/options-menu.component.spec.ts create mode 100644 src/app/components/main-chat/single-chat/options-menu/options-menu.component.ts create mode 100644 src/app/components/main-chat/single-chat/reaction-emojis/reaction-emojis.component.html create mode 100644 src/app/components/main-chat/single-chat/reaction-emojis/reaction-emojis.component.scss create mode 100644 src/app/components/main-chat/single-chat/reaction-emojis/reaction-emojis.component.spec.ts create mode 100644 src/app/components/main-chat/single-chat/reaction-emojis/reaction-emojis.component.ts create mode 100644 src/app/components/main-chat/single-chat/single-chat.component.html create mode 100644 src/app/components/main-chat/single-chat/single-chat.component.scss create mode 100644 src/app/components/main-chat/single-chat/single-chat.component.spec.ts create mode 100644 src/app/components/main-chat/single-chat/single-chat.component.ts create mode 100644 src/app/components/main-login/choose-avatar/choose-avatar.component.html create mode 100644 src/app/components/main-login/choose-avatar/choose-avatar.component.scss create mode 100644 src/app/components/main-login/choose-avatar/choose-avatar.component.spec.ts create mode 100644 src/app/components/main-login/choose-avatar/choose-avatar.component.ts create mode 100644 src/app/components/main-login/login/login.component.html create mode 100644 src/app/components/main-login/login/login.component.scss create mode 100644 src/app/components/main-login/login/login.component.spec.ts create mode 100644 src/app/components/main-login/login/login.component.ts create mode 100644 src/app/components/main-login/main-login.component.html create mode 100644 src/app/components/main-login/main-login.component.scss create mode 100644 src/app/components/main-login/main-login.component.spec.ts create mode 100644 src/app/components/main-login/main-login.component.ts create mode 100644 src/app/components/main-login/password-forget/password-forget.component.html create mode 100644 src/app/components/main-login/password-forget/password-forget.component.scss create mode 100644 src/app/components/main-login/password-forget/password-forget.component.spec.ts create mode 100644 src/app/components/main-login/password-forget/password-forget.component.ts create mode 100644 src/app/components/main-login/password-reset/password-reset.component.html create mode 100644 src/app/components/main-login/password-reset/password-reset.component.scss create mode 100644 src/app/components/main-login/password-reset/password-reset.component.spec.ts create mode 100644 src/app/components/main-login/password-reset/password-reset.component.ts create mode 100644 src/app/components/main-login/register/register.component.html create mode 100644 src/app/components/main-login/register/register.component.scss create mode 100644 src/app/components/main-login/register/register.component.spec.ts create mode 100644 src/app/components/main-login/register/register.component.ts create mode 100644 src/app/components/main/main.component.html create mode 100644 src/app/components/main/main.component.scss create mode 100644 src/app/components/main/main.component.spec.ts create mode 100644 src/app/components/main/main.component.ts create mode 100644 src/app/components/secondary-chat/secondary-chat.component.html create mode 100644 src/app/components/secondary-chat/secondary-chat.component.scss create mode 100644 src/app/components/secondary-chat/secondary-chat.component.spec.ts create mode 100644 src/app/components/secondary-chat/secondary-chat.component.ts create mode 100644 src/app/components/sidebar/searchbar/searchbar.component.html create mode 100644 src/app/components/sidebar/searchbar/searchbar.component.scss create mode 100644 src/app/components/sidebar/searchbar/searchbar.component.spec.ts create mode 100644 src/app/components/sidebar/searchbar/searchbar.component.ts create mode 100644 src/app/components/sidebar/show-all-users/show-all-users.component.html create mode 100644 src/app/components/sidebar/show-all-users/show-all-users.component.scss create mode 100644 src/app/components/sidebar/show-all-users/show-all-users.component.spec.ts create mode 100644 src/app/components/sidebar/show-all-users/show-all-users.component.ts create mode 100644 src/app/components/sidebar/sidebar-channels/add-new-channel/add-new-channel.component.html create mode 100644 src/app/components/sidebar/sidebar-channels/add-new-channel/add-new-channel.component.scss create mode 100644 src/app/components/sidebar/sidebar-channels/add-new-channel/add-new-channel.component.spec.ts create mode 100644 src/app/components/sidebar/sidebar-channels/add-new-channel/add-new-channel.component.ts create mode 100644 src/app/components/sidebar/sidebar-channels/sidebar-channels.component.html create mode 100644 src/app/components/sidebar/sidebar-channels/sidebar-channels.component.scss create mode 100644 src/app/components/sidebar/sidebar-channels/sidebar-channels.component.spec.ts create mode 100644 src/app/components/sidebar/sidebar-channels/sidebar-channels.component.ts create mode 100644 src/app/components/sidebar/sidebar-direct-messages-user/sidebar-direct-messages-user.component.html create mode 100644 src/app/components/sidebar/sidebar-direct-messages-user/sidebar-direct-messages-user.component.scss create mode 100644 src/app/components/sidebar/sidebar-direct-messages-user/sidebar-direct-messages-user.component.spec.ts create mode 100644 src/app/components/sidebar/sidebar-direct-messages-user/sidebar-direct-messages-user.component.ts create mode 100644 src/app/components/sidebar/sidebar-direct-messages/sidebar-direct-messages.component.html create mode 100644 src/app/components/sidebar/sidebar-direct-messages/sidebar-direct-messages.component.scss create mode 100644 src/app/components/sidebar/sidebar-direct-messages/sidebar-direct-messages.component.spec.ts create mode 100644 src/app/components/sidebar/sidebar-direct-messages/sidebar-direct-messages.component.ts create mode 100644 src/app/components/sidebar/sidebar-toggle/sidebar-toggle.component.html create mode 100644 src/app/components/sidebar/sidebar-toggle/sidebar-toggle.component.scss create mode 100644 src/app/components/sidebar/sidebar-toggle/sidebar-toggle.component.spec.ts create mode 100644 src/app/components/sidebar/sidebar-toggle/sidebar-toggle.component.ts create mode 100644 src/app/components/sidebar/sidebar.component.html create mode 100644 src/app/components/sidebar/sidebar.component.scss create mode 100644 src/app/components/sidebar/sidebar.component.spec.ts create mode 100644 src/app/components/sidebar/sidebar.component.ts create mode 100644 src/app/highlight.pipe.spec.ts create mode 100644 src/app/highlight.pipe.ts create mode 100644 src/app/interface/channel.interface.ts create mode 100644 src/app/interface/chat.interface.ts create mode 100644 src/app/interface/user.interface.ts create mode 100644 src/app/service/channle.service.ts create mode 100644 src/app/service/chat.service.ts create mode 100644 src/app/service/download-files.service.ts create mode 100644 src/app/service/language.service.ts create mode 100644 src/app/service/login.service.ts create mode 100644 src/app/service/overlay.service.ts create mode 100644 src/app/service/shared.service.ts create mode 100644 src/app/service/toggle-boolean.service.ts create mode 100644 src/app/service/user.service.ts create mode 100644 src/app/shared/components/emoji-picker/emoji-picker.component.html create mode 100644 src/app/shared/components/emoji-picker/emoji-picker.component.scss create mode 100644 src/app/shared/components/emoji-picker/emoji-picker.component.spec.ts create mode 100644 src/app/shared/components/emoji-picker/emoji-picker.component.ts create mode 100644 src/app/shared/components/header/edit-user/edit-user-details/edit-user-details.component.html create mode 100644 src/app/shared/components/header/edit-user/edit-user-details/edit-user-details.component.scss create mode 100644 src/app/shared/components/header/edit-user/edit-user-details/edit-user-details.component.spec.ts create mode 100644 src/app/shared/components/header/edit-user/edit-user-details/edit-user-details.component.ts create mode 100644 src/app/shared/components/header/edit-user/edit-user.component.html create mode 100644 src/app/shared/components/header/edit-user/edit-user.component.scss create mode 100644 src/app/shared/components/header/edit-user/edit-user.component.spec.ts create mode 100644 src/app/shared/components/header/edit-user/edit-user.component.ts create mode 100644 src/app/shared/components/header/header.component.html create mode 100644 src/app/shared/components/header/header.component.scss create mode 100644 src/app/shared/components/header/header.component.spec.ts create mode 100644 src/app/shared/components/header/header.component.ts create mode 100644 src/app/shared/components/header/search-bar/search-bar.component.html create mode 100644 src/app/shared/components/header/search-bar/search-bar.component.scss create mode 100644 src/app/shared/components/header/search-bar/search-bar.component.spec.ts create mode 100644 src/app/shared/components/header/search-bar/search-bar.component.ts create mode 100644 src/app/shared/components/imprint/imprint.component.html create mode 100644 src/app/shared/components/imprint/imprint.component.scss create mode 100644 src/app/shared/components/imprint/imprint.component.spec.ts create mode 100644 src/app/shared/components/imprint/imprint.component.ts create mode 100644 src/app/shared/components/login/footer/footer.component.html create mode 100644 src/app/shared/components/login/footer/footer.component.scss create mode 100644 src/app/shared/components/login/footer/footer.component.spec.ts create mode 100644 src/app/shared/components/login/footer/footer.component.ts create mode 100644 src/app/shared/components/login/header/header.component.html create mode 100644 src/app/shared/components/login/header/header.component.scss create mode 100644 src/app/shared/components/login/header/header.component.spec.ts create mode 100644 src/app/shared/components/login/header/header.component.ts create mode 100644 src/app/shared/components/login/mixins/mixin.scss create mode 100644 src/app/shared/components/login/start-header/start-header.component.html create mode 100644 src/app/shared/components/login/start-header/start-header.component.scss create mode 100644 src/app/shared/components/login/start-header/start-header.component.spec.ts create mode 100644 src/app/shared/components/login/start-header/start-header.component.ts create mode 100644 src/app/shared/components/overlay/overlay.component.html create mode 100644 src/app/shared/components/overlay/overlay.component.scss create mode 100644 src/app/shared/components/overlay/overlay.component.spec.ts create mode 100644 src/app/shared/components/overlay/overlay.component.ts create mode 100644 src/app/shared/components/privacy-policy/privacy-policy.component.html create mode 100644 src/app/shared/components/privacy-policy/privacy-policy.component.scss create mode 100644 src/app/shared/components/privacy-policy/privacy-policy.component.spec.ts create mode 100644 src/app/shared/components/privacy-policy/privacy-policy.component.ts create mode 100644 src/app/shared/components/small-btn/small-btn.component.html create mode 100644 src/app/shared/components/small-btn/small-btn.component.scss create mode 100644 src/app/shared/components/small-btn/small-btn.component.spec.ts create mode 100644 src/app/shared/components/small-btn/small-btn.component.ts create mode 100644 src/app/shared/components/user/user.component.html create mode 100644 src/app/shared/components/user/user.component.scss create mode 100644 src/app/shared/components/user/user.component.spec.ts create mode 100644 src/app/shared/components/user/user.component.ts create mode 100644 src/assets/.gitkeep create mode 100644 src/assets/fonts/figtree-v5-latin-500.woff2 create mode 100644 src/assets/fonts/figtree-v5-latin-600.woff2 create mode 100644 src/assets/fonts/figtree-v5-latin-700.woff2 create mode 100644 src/assets/fonts/figtree-v5-latin-regular.woff2 create mode 100644 src/assets/fonts/nunito-sans-v15-latin-200.woff2 create mode 100644 src/assets/fonts/nunito-sans-v15-latin-200italic.woff2 create mode 100644 src/assets/fonts/nunito-sans-v15-latin-300.woff2 create mode 100644 src/assets/fonts/nunito-sans-v15-latin-300italic.woff2 create mode 100644 src/assets/fonts/nunito-sans-v15-latin-500.woff2 create mode 100644 src/assets/fonts/nunito-sans-v15-latin-500italic.woff2 create mode 100644 src/assets/fonts/nunito-sans-v15-latin-600.woff2 create mode 100644 src/assets/fonts/nunito-sans-v15-latin-600italic.woff2 create mode 100644 src/assets/fonts/nunito-sans-v15-latin-700.woff2 create mode 100644 src/assets/fonts/nunito-sans-v15-latin-700italic.woff2 create mode 100644 src/assets/fonts/nunito-sans-v15-latin-800.woff2 create mode 100644 src/assets/fonts/nunito-sans-v15-latin-800italic.woff2 create mode 100644 src/assets/fonts/nunito-sans-v15-latin-900.woff2 create mode 100644 src/assets/fonts/nunito-sans-v15-latin-900italic.woff2 create mode 100644 src/assets/fonts/nunito-sans-v15-latin-italic.woff2 create mode 100644 src/assets/fonts/nunito-sans-v15-latin-regular.woff2 create mode 100644 src/assets/fonts/nunito-v26-latin-200.woff2 create mode 100644 src/assets/fonts/nunito-v26-latin-200italic.woff2 create mode 100644 src/assets/fonts/nunito-v26-latin-300.woff2 create mode 100644 src/assets/fonts/nunito-v26-latin-300italic.woff2 create mode 100644 src/assets/fonts/nunito-v26-latin-500.woff2 create mode 100644 src/assets/fonts/nunito-v26-latin-500italic.woff2 create mode 100644 src/assets/fonts/nunito-v26-latin-600.woff2 create mode 100644 src/assets/fonts/nunito-v26-latin-600italic.woff2 create mode 100644 src/assets/fonts/nunito-v26-latin-700.woff2 create mode 100644 src/assets/fonts/nunito-v26-latin-700italic.woff2 create mode 100644 src/assets/fonts/nunito-v26-latin-800.woff2 create mode 100644 src/assets/fonts/nunito-v26-latin-800italic.woff2 create mode 100644 src/assets/fonts/nunito-v26-latin-900.woff2 create mode 100644 src/assets/fonts/nunito-v26-latin-900italic.woff2 create mode 100644 src/assets/fonts/nunito-v26-latin-italic.woff2 create mode 100644 src/assets/fonts/nunito-v26-latin-regular.woff2 create mode 100644 src/assets/i18n/de.json create mode 100644 src/assets/i18n/en.json create mode 100644 src/assets/img/add-reaction.svg create mode 100644 src/assets/img/add.svg create mode 100644 src/assets/img/addIcon.svg create mode 100644 src/assets/img/addPerson.svg create mode 100644 src/assets/img/answer.svg create mode 100644 src/assets/img/arrowLeft.png create mode 100644 src/assets/img/arrowRight.png create mode 100644 src/assets/img/atIcon.svg create mode 100644 src/assets/img/attachments/doc.png create mode 100644 src/assets/img/attachments/pdf.png create mode 100644 src/assets/img/attachments/txt.png create mode 100644 src/assets/img/charater1.svg create mode 100644 src/assets/img/clap-hands.svg create mode 100644 src/assets/img/closeIcon.svg create mode 100644 src/assets/img/documentIcon.svg create mode 100644 src/assets/img/hashtag.svg create mode 100644 src/assets/img/home-icon.svg create mode 100644 src/assets/img/imgIcon.svg create mode 100644 src/assets/img/keyboardArrowDown.svg create mode 100644 src/assets/img/language.svg create mode 100644 src/assets/img/login/arrow-back.png create mode 100644 src/assets/img/login/arrow-back.svg create mode 100644 src/assets/img/login/box-checked-hover.png create mode 100644 src/assets/img/login/box-checked.png create mode 100644 src/assets/img/login/box-hover.png create mode 100644 src/assets/img/login/box.png create mode 100644 src/assets/img/login/close-eye.svg create mode 100644 src/assets/img/login/email-send-btn.svg create mode 100644 src/assets/img/login/google.svg create mode 100644 src/assets/img/login/lock.png create mode 100644 src/assets/img/login/logo-animation.svg create mode 100644 src/assets/img/login/logo.png create mode 100644 src/assets/img/login/logo.svg create mode 100644 src/assets/img/login/mail.png create mode 100644 src/assets/img/login/open-eye.svg create mode 100644 src/assets/img/login/person-filled.png create mode 100644 src/assets/img/mail-icon.svg create mode 100644 src/assets/img/mail-iconBlack.svg create mode 100644 src/assets/img/messageIcon.svg create mode 100644 src/assets/img/more-vertical.svg create mode 100644 src/assets/img/mp3Icon.svg create mode 100644 src/assets/img/offlineRing.svg create mode 100644 src/assets/img/okay.svg create mode 100644 src/assets/img/onlineRing.svg create mode 100644 src/assets/img/pdfIcon.svg create mode 100644 src/assets/img/pencil.svg create mode 100644 src/assets/img/personCircle.svg create mode 100644 src/assets/img/radioButtonChecked.svg create mode 100644 src/assets/img/radioButtonUnchecked.svg create mode 100644 src/assets/img/save.svg create mode 100644 src/assets/img/search-icon.svg create mode 100644 src/assets/img/sendIcon.svg create mode 100644 src/assets/img/sidebar/account-circle.svg create mode 100644 src/assets/img/sidebar/add-circle.svg create mode 100644 src/assets/img/sidebar/arrow-drop-down.svg create mode 100644 src/assets/img/sidebar/arrow_right.png create mode 100644 src/assets/img/sidebar/bubbles.svg create mode 100644 src/assets/img/sidebar/new-chat.svg create mode 100644 src/assets/img/sidebar/toggle.svg create mode 100644 src/assets/img/sidebar/workspace-logo.svg create mode 100644 src/assets/img/smileIcon.svg create mode 100644 src/assets/img/user-icons/female-1.svg create mode 100644 src/assets/img/user-icons/female-2.svg create mode 100644 src/assets/img/user-icons/guest.svg create mode 100644 src/assets/img/user-icons/male-1.svg create mode 100644 src/assets/img/user-icons/male-2.svg create mode 100644 src/assets/img/user-icons/male-3.svg create mode 100644 src/assets/img/user-icons/male-4.svg create mode 100644 src/assets/img/verticalLine.svg create mode 100644 src/assets/img/videoIcon.svg create mode 100644 src/favicon.ico create mode 100644 src/index.html create mode 100644 src/main.ts create mode 100644 src/styles.scss create mode 100644 tsconfig.app.json create mode 100644 tsconfig.json create mode 100644 tsconfig.spec.json diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..59d9a3a --- /dev/null +++ b/.editorconfig @@ -0,0 +1,16 @@ +# Editor configuration, see https://editorconfig.org +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +insert_final_newline = true +trim_trailing_whitespace = true + +[*.ts] +quote_type = single + +[*.md] +max_line_length = off +trim_trailing_whitespace = false diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e11b341 --- /dev/null +++ b/.gitignore @@ -0,0 +1,48 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. + +# Compiled output +/dist +/tmp +/out-tsc +/bazel-out + +# Node +/node_modules +npm-debug.log +yarn-error.log + +# IDEs and editors +.idea/ +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# Visual Studio Code +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +.history/* + +# Miscellaneous +/.angular/cache +.sass-cache/ +/connect.lock +/coverage +/libpeerconnection.log +testem.log +/typings + +# System files +.DS_Store +Thumbs.db + +# Firebase +.firebase +*-debug.log +.runtimeconfig.json +/src/app/environments/config.ts \ No newline at end of file diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..77b3745 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,4 @@ +{ + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=827846 + "recommendations": ["angular.ng-template"] +} diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..925af83 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,20 @@ +{ + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "ng serve", + "type": "chrome", + "request": "launch", + "preLaunchTask": "npm: start", + "url": "http://localhost:4200/" + }, + { + "name": "ng test", + "type": "chrome", + "request": "launch", + "preLaunchTask": "npm: test", + "url": "http://localhost:9876/debug.html" + } + ] +} diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..a298b5b --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,42 @@ +{ + // For more information, visit: https://go.microsoft.com/fwlink/?LinkId=733558 + "version": "2.0.0", + "tasks": [ + { + "type": "npm", + "script": "start", + "isBackground": true, + "problemMatcher": { + "owner": "typescript", + "pattern": "$tsc", + "background": { + "activeOnStart": true, + "beginsPattern": { + "regexp": "(.*?)" + }, + "endsPattern": { + "regexp": "bundle generation complete" + } + } + } + }, + { + "type": "npm", + "script": "test", + "isBackground": true, + "problemMatcher": { + "owner": "typescript", + "pattern": "$tsc", + "background": { + "activeOnStart": true, + "beginsPattern": { + "regexp": "(.*?)" + }, + "endsPattern": { + "regexp": "bundle generation complete" + } + } + } + } + ] +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..2431214 --- /dev/null +++ b/README.md @@ -0,0 +1,27 @@ +# Dabubble + +This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 17.2.1. + +## Development server + +Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The application will automatically reload if you change any of the source files. + +## Code scaffolding + +Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`. + +## Build + +Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. + +## Running unit tests + +Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io). + +## Running end-to-end tests + +Run `ng e2e` to execute the end-to-end tests via a platform of your choice. To use this command, you need to first add a package that implements end-to-end testing capabilities. + +## Further help + +To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page. diff --git a/angular.json b/angular.json new file mode 100644 index 0000000..59051f4 --- /dev/null +++ b/angular.json @@ -0,0 +1,92 @@ +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "version": 1, + "newProjectRoot": "projects", + "projects": { + "dabubble": { + "projectType": "application", + "schematics": { + "@schematics/angular:component": { + "style": "scss" + } + }, + "root": "", + "sourceRoot": "src", + "prefix": "app", + "architect": { + "build": { + "builder": "@angular-devkit/build-angular:application", + "options": { + "outputPath": "dist/dabubble", + "index": "src/index.html", + "browser": "src/main.ts", + "polyfills": ["zone.js"], + "tsConfig": "tsconfig.app.json", + "inlineStyleLanguage": "scss", + "assets": ["src/favicon.ico", "src/assets"], + "styles": [ + "src/styles.scss", + "./node_modules/@ctrl/ngx-emoji-mart/picker.css" + ], + "scripts": [] + }, + "configurations": { + "production": { + "budgets": [ + { + "type": "initial", + "maximumWarning": "2mb", + "maximumError": "4mb" + }, + { + "type": "anyComponentStyle", + "maximumWarning": "16kb", + "maximumError": "32kb" + } + ], + "outputHashing": "all" + }, + "development": { + "optimization": false, + "extractLicenses": false, + "sourceMap": true + } + }, + "defaultConfiguration": "production" + }, + "serve": { + "builder": "@angular-devkit/build-angular:dev-server", + "configurations": { + "production": { + "buildTarget": "dabubble:build:production" + }, + "development": { + "buildTarget": "dabubble:build:development" + } + }, + "defaultConfiguration": "development" + }, + "extract-i18n": { + "builder": "@angular-devkit/build-angular:extract-i18n", + "options": { + "buildTarget": "dabubble:build" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "polyfills": ["zone.js", "zone.js/testing"], + "tsConfig": "tsconfig.spec.json", + "inlineStyleLanguage": "scss", + "assets": ["src/favicon.ico", "src/assets"], + "styles": [ + "src/styles.scss", + "./node_modules/@ctrl/ngx-emoji-mart/picker.css" + ], + "scripts": [] + } + } + } + } + } +} diff --git a/firebase.json b/firebase.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/firebase.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..0f09c59 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,13515 @@ +{ + "name": "dabubble", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "dabubble", + "version": "0.0.0", + "dependencies": { + "@angular/animations": "^17.2.0", + "@angular/cdk": "^17.3.1", + "@angular/common": "^17.2.0", + "@angular/compiler": "^17.2.0", + "@angular/core": "^17.2.0", + "@angular/fire": "^17.0.1", + "@angular/forms": "^17.2.0", + "@angular/platform-browser": "^17.2.0", + "@angular/platform-browser-dynamic": "^17.2.0", + "@angular/router": "^17.2.0", + "@ctrl/ngx-emoji-mart": "^9.2.0", + "@ngx-translate/core": "^15.0.0", + "@ngx-translate/http-loader": "^8.0.0", + "ng2-pdf-viewer": "^10.0.0", + "ngx-extended-pdf-viewer": "^19.6.6", + "rxjs": "~7.8.0", + "tslib": "^2.3.0", + "zone.js": "~0.14.3" + }, + "devDependencies": { + "@angular-devkit/build-angular": "^17.2.1", + "@angular/cli": "^17.2.1", + "@angular/compiler-cli": "^17.2.0", + "@types/jasmine": "~5.1.0", + "jasmine-core": "~5.1.0", + "karma": "~6.4.0", + "karma-chrome-launcher": "~3.2.0", + "karma-coverage": "~2.2.0", + "karma-jasmine": "~5.1.0", + "karma-jasmine-html-reporter": "~2.1.0", + "typescript": "~5.3.2" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@angular-devkit/architect": { + "version": "0.1703.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1703.2.tgz", + "integrity": "sha512-fT5gSzwDHOyGv8zF97t8rjeoYSGSxXjWWstl3rN1nXdO0qgJ5m6Sv0fupON+HltdXDCBLRH+2khNpqx/Fh0Qww==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "17.3.2", + "rxjs": "7.8.1" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/build-angular": { + "version": "17.3.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-17.3.2.tgz", + "integrity": "sha512-muPCUyL0uHvRkLH4NLWiccER6P2vCm/Q5DDvqyN4XOzzY3tAHHLrKrpvY87sgd2oNJ6Ci8x7GPNcfzR5KELCnw==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "2.3.0", + "@angular-devkit/architect": "0.1703.2", + "@angular-devkit/build-webpack": "0.1703.2", + "@angular-devkit/core": "17.3.2", + "@babel/core": "7.24.0", + "@babel/generator": "7.23.6", + "@babel/helper-annotate-as-pure": "7.22.5", + "@babel/helper-split-export-declaration": "7.22.6", + "@babel/plugin-transform-async-generator-functions": "7.23.9", + "@babel/plugin-transform-async-to-generator": "7.23.3", + "@babel/plugin-transform-runtime": "7.24.0", + "@babel/preset-env": "7.24.0", + "@babel/runtime": "7.24.0", + "@discoveryjs/json-ext": "0.5.7", + "@ngtools/webpack": "17.3.2", + "@vitejs/plugin-basic-ssl": "1.1.0", + "ansi-colors": "4.1.3", + "autoprefixer": "10.4.18", + "babel-loader": "9.1.3", + "babel-plugin-istanbul": "6.1.1", + "browserslist": "^4.21.5", + "copy-webpack-plugin": "11.0.0", + "critters": "0.0.22", + "css-loader": "6.10.0", + "esbuild-wasm": "0.20.1", + "fast-glob": "3.3.2", + "http-proxy-middleware": "2.0.6", + "https-proxy-agent": "7.0.4", + "inquirer": "9.2.15", + "jsonc-parser": "3.2.1", + "karma-source-map-support": "1.4.0", + "less": "4.2.0", + "less-loader": "11.1.0", + "license-webpack-plugin": "4.0.2", + "loader-utils": "3.2.1", + "magic-string": "0.30.8", + "mini-css-extract-plugin": "2.8.1", + "mrmime": "2.0.0", + "open": "8.4.2", + "ora": "5.4.1", + "parse5-html-rewriting-stream": "7.0.0", + "picomatch": "4.0.1", + "piscina": "4.4.0", + "postcss": "8.4.35", + "postcss-loader": "8.1.1", + "resolve-url-loader": "5.0.0", + "rxjs": "7.8.1", + "sass": "1.71.1", + "sass-loader": "14.1.1", + "semver": "7.6.0", + "source-map-loader": "5.0.0", + "source-map-support": "0.5.21", + "terser": "5.29.1", + "tree-kill": "1.2.2", + "tslib": "2.6.2", + "undici": "6.7.1", + "vite": "5.1.5", + "watchpack": "2.4.0", + "webpack": "5.90.3", + "webpack-dev-middleware": "6.1.2", + "webpack-dev-server": "4.15.1", + "webpack-merge": "5.10.0", + "webpack-subresource-integrity": "5.1.0" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "optionalDependencies": { + "esbuild": "0.20.1" + }, + "peerDependencies": { + "@angular/compiler-cli": "^17.0.0", + "@angular/localize": "^17.0.0", + "@angular/platform-server": "^17.0.0", + "@angular/service-worker": "^17.0.0", + "@web/test-runner": "^0.18.0", + "browser-sync": "^3.0.2", + "jest": "^29.5.0", + "jest-environment-jsdom": "^29.5.0", + "karma": "^6.3.0", + "ng-packagr": "^17.0.0", + "protractor": "^7.0.0", + "tailwindcss": "^2.0.0 || ^3.0.0", + "typescript": ">=5.2 <5.5" + }, + "peerDependenciesMeta": { + "@angular/localize": { + "optional": true + }, + "@angular/platform-server": { + "optional": true + }, + "@angular/service-worker": { + "optional": true + }, + "@web/test-runner": { + "optional": true + }, + "browser-sync": { + "optional": true + }, + "jest": { + "optional": true + }, + "jest-environment-jsdom": { + "optional": true + }, + "karma": { + "optional": true + }, + "ng-packagr": { + "optional": true + }, + "protractor": { + "optional": true + }, + "tailwindcss": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/build-webpack": { + "version": "0.1703.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1703.2.tgz", + "integrity": "sha512-w7rVFQcZK4iTCd/MLfQWIkDkwBOfAs++txNQyS9qYID8KvLs1V+oWYd2qDBRelRv1u3YtaCIS1pQx3GFKBC3OA==", + "dev": true, + "dependencies": { + "@angular-devkit/architect": "0.1703.2", + "rxjs": "7.8.1" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "webpack": "^5.30.0", + "webpack-dev-server": "^4.0.0" + } + }, + "node_modules/@angular-devkit/core": { + "version": "17.3.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-17.3.2.tgz", + "integrity": "sha512-1vxKo9+pdSwTOwqPDSYQh84gZYmCJo6OgR5+AZoGLGMZSeqvi9RG5RiUcOMLQYOnuYv0arlhlWxz0ZjyR8ApKw==", + "dependencies": { + "ajv": "8.12.0", + "ajv-formats": "2.1.1", + "jsonc-parser": "3.2.1", + "picomatch": "4.0.1", + "rxjs": "7.8.1", + "source-map": "0.7.4" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^3.5.2" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/schematics": { + "version": "17.3.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-17.3.2.tgz", + "integrity": "sha512-AYO6oc6QpFGigc1KiDzEVT1CeLnwvnIedU5Q/U3JDZ/Yqmvgc09D64g9XXER2kg6tV7iEgLxiYnonIAQOHq7eA==", + "dependencies": { + "@angular-devkit/core": "17.3.2", + "jsonc-parser": "3.2.1", + "magic-string": "0.30.8", + "ora": "5.4.1", + "rxjs": "7.8.1" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular/animations": { + "version": "17.3.1", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-17.3.1.tgz", + "integrity": "sha512-2TZ0M5J0IizhHpb404DeqArlv8Ki9BFz5ZUuET2uFROpKW8IMDCht8fSrn/DKHpjB9lvzPUhNFaRxNWEY6klnA==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0" + }, + "peerDependencies": { + "@angular/core": "17.3.1" + } + }, + "node_modules/@angular/cdk": { + "version": "17.3.1", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-17.3.1.tgz", + "integrity": "sha512-pHSN+KlCmdo2u9jY7Yxsry/ZK+EcjOYGzdwxXxcKragMzm7etY3BJiTl4N+qZRuV6cJlMj2PRkij8ABi/HQdEA==", + "dependencies": { + "tslib": "^2.3.0" + }, + "optionalDependencies": { + "parse5": "^7.1.2" + }, + "peerDependencies": { + "@angular/common": "^17.0.0 || ^18.0.0", + "@angular/core": "^17.0.0 || ^18.0.0", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/cli": { + "version": "17.3.2", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-17.3.2.tgz", + "integrity": "sha512-g6r4XZyGnh9P6GmWgaFh8RmR4L6UdQ408e3SpG3rjncuPRD57Ur8806GfCLPt6HIA9TARiKmaJ0EJ3RsIjag0g==", + "dev": true, + "dependencies": { + "@angular-devkit/architect": "0.1703.2", + "@angular-devkit/core": "17.3.2", + "@angular-devkit/schematics": "17.3.2", + "@schematics/angular": "17.3.2", + "@yarnpkg/lockfile": "1.1.0", + "ansi-colors": "4.1.3", + "ini": "4.1.2", + "inquirer": "9.2.15", + "jsonc-parser": "3.2.1", + "npm-package-arg": "11.0.1", + "npm-pick-manifest": "9.0.0", + "open": "8.4.2", + "ora": "5.4.1", + "pacote": "17.0.6", + "resolve": "1.22.8", + "semver": "7.6.0", + "symbol-observable": "4.0.0", + "yargs": "17.7.2" + }, + "bin": { + "ng": "bin/ng.js" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular/common": { + "version": "17.3.1", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-17.3.1.tgz", + "integrity": "sha512-HyUTJ4RxhE3bOmFRV6Fv2y01ixbrUb8Hd4MxPm8REbNMGKsWCfXhR3FfxFL18Sc03SAF+o0Md0wwekjFKTNKfQ==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0" + }, + "peerDependencies": { + "@angular/core": "17.3.1", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/compiler": { + "version": "17.3.1", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-17.3.1.tgz", + "integrity": "sha512-8qqlWPGZEyD2FY5losOW3Aocro+lFysPDzsf0LHgQUM6Ub1b+pq4jUOjH6w0vzaxG3TfxkgzOQ9aNdWtSV67Rg==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0" + }, + "peerDependencies": { + "@angular/core": "17.3.1" + }, + "peerDependenciesMeta": { + "@angular/core": { + "optional": true + } + } + }, + "node_modules/@angular/compiler-cli": { + "version": "17.3.1", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-17.3.1.tgz", + "integrity": "sha512-xLV9KU+zOpe57/2rQ59ku21EaStNpLSlR9+qkDYf8JR09fB+W9vY3UYbpi5RjHxAFIZBM5D9SFQjjll8rch26g==", + "dev": true, + "dependencies": { + "@babel/core": "7.23.9", + "@jridgewell/sourcemap-codec": "^1.4.14", + "chokidar": "^3.0.0", + "convert-source-map": "^1.5.1", + "reflect-metadata": "^0.2.0", + "semver": "^7.0.0", + "tslib": "^2.3.0", + "yargs": "^17.2.1" + }, + "bin": { + "ng-xi18n": "bundles/src/bin/ng_xi18n.js", + "ngc": "bundles/src/bin/ngc.js", + "ngcc": "bundles/ngcc/index.js" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0" + }, + "peerDependencies": { + "@angular/compiler": "17.3.1", + "typescript": ">=5.2 <5.5" + } + }, + "node_modules/@angular/compiler-cli/node_modules/@babel/core": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.9.tgz", + "integrity": "sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.23.9", + "@babel/parser": "^7.23.9", + "@babel/template": "^7.23.9", + "@babel/traverse": "^7.23.9", + "@babel/types": "^7.23.9", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@angular/compiler-cli/node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/@angular/compiler-cli/node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@angular/core": { + "version": "17.3.1", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-17.3.1.tgz", + "integrity": "sha512-Qf3/sgkXS1LHwOTtqAVYprySrn0YpPIZqerPc0tK+hyQfwAz5BQlpcBhbH8RWKlfCY8eO0cqo/j0+e8DQOgYfg==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0" + }, + "peerDependencies": { + "rxjs": "^6.5.3 || ^7.4.0", + "zone.js": "~0.14.0" + } + }, + "node_modules/@angular/fire": { + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/@angular/fire/-/fire-17.0.1.tgz", + "integrity": "sha512-bhbogL4m50AKzSVn4kdZX3/2XrYTMvpsgP/4xnTPuMoTFgOrjV24CDc+1lOL+Z0QXRIupj84/Pg4KNFD4lXXzQ==", + "dependencies": { + "@angular-devkit/schematics": "^17.0.0", + "@schematics/angular": "^17.0.0", + "firebase": "^10.7.0", + "fs-extra": "^8.0.1", + "fuzzy": "^0.1.3", + "inquirer": "^8.1.1", + "inquirer-autocomplete-prompt": "^1.0.1", + "jsonc-parser": "^3.0.0", + "node-fetch": "^2.6.1", + "open": "^8.0.0", + "ora": "^5.3.0", + "rxfire": "^6.0.5", + "semver": "^7.1.3", + "triple-beam": "^1.3.0", + "tslib": "^2.3.0", + "winston": "^3.0.0" + }, + "peerDependencies": { + "@angular/common": "^17.0.0", + "@angular/core": "^17.0.0", + "@angular/platform-browser": "^17.0.0", + "@angular/platform-browser-dynamic": "^17.0.0", + "firebase-tools": "^13.0.0", + "rxjs": "~7.8.0" + }, + "peerDependenciesMeta": { + "firebase-tools": { + "optional": true + } + } + }, + "node_modules/@angular/fire/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@angular/fire/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/@angular/fire/node_modules/cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/@angular/fire/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@angular/fire/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/@angular/fire/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@angular/fire/node_modules/inquirer": { + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.6.tgz", + "integrity": "sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==", + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.1", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^5.4.1", + "run-async": "^2.4.0", + "rxjs": "^7.5.5", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6", + "wrap-ansi": "^6.0.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@angular/fire/node_modules/inquirer-autocomplete-prompt": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/inquirer-autocomplete-prompt/-/inquirer-autocomplete-prompt-1.4.0.tgz", + "integrity": "sha512-qHgHyJmbULt4hI+kCmwX92MnSxDs/Yhdt4wPA30qnoa01OF6uTXV8yvH4hKXgdaTNmkZ9D01MHjqKYEuJN+ONw==", + "dependencies": { + "ansi-escapes": "^4.3.1", + "chalk": "^4.0.0", + "figures": "^3.2.0", + "run-async": "^2.4.0", + "rxjs": "^6.6.2" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "inquirer": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@angular/fire/node_modules/inquirer-autocomplete-prompt/node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/@angular/fire/node_modules/inquirer-autocomplete-prompt/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@angular/fire/node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" + }, + "node_modules/@angular/fire/node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/@angular/fire/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@angular/forms": { + "version": "17.3.1", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-17.3.1.tgz", + "integrity": "sha512-HndsO90k67sFHzd+sII+rhAUksffBvquFuAUCc6QR9WVjILxVg2fY7oBidgS1gKNqu0mptPG0GvuORnaW/0gSg==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0" + }, + "peerDependencies": { + "@angular/common": "17.3.1", + "@angular/core": "17.3.1", + "@angular/platform-browser": "17.3.1", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/platform-browser": { + "version": "17.3.1", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-17.3.1.tgz", + "integrity": "sha512-8ABAL8PElSGzkIparVwifsU0NSu0DdqnWYw9YvLhhZQ6lOuWbG+dTUo/DXzmWhA6ezQWJGNakEZPJJytFIIy+A==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0" + }, + "peerDependencies": { + "@angular/animations": "17.3.1", + "@angular/common": "17.3.1", + "@angular/core": "17.3.1" + }, + "peerDependenciesMeta": { + "@angular/animations": { + "optional": true + } + } + }, + "node_modules/@angular/platform-browser-dynamic": { + "version": "17.3.1", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-17.3.1.tgz", + "integrity": "sha512-ACW/npNaDxUNQtEomjjv/KIBY8jHEinePff5qosnAxLE0IpA4qE9eDp36zG35xoJqrPJPYjXbZCBRqqrzM7U7Q==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0" + }, + "peerDependencies": { + "@angular/common": "17.3.1", + "@angular/compiler": "17.3.1", + "@angular/core": "17.3.1", + "@angular/platform-browser": "17.3.1" + } + }, + "node_modules/@angular/router": { + "version": "17.3.1", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-17.3.1.tgz", + "integrity": "sha512-H6H7lY9i5Ppu0SFwwpeWqJbCFw8cILOj8Rd1+AGoCN5m3ivPtjD2Ltz62PI2zZkqx+WhQdk19l61Wm3oRqg70A==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0" + }, + "peerDependencies": { + "@angular/common": "17.3.1", + "@angular/core": "17.3.1", + "@angular/platform-browser": "17.3.1", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", + "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.24.2", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.1.tgz", + "integrity": "sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.0.tgz", + "integrity": "sha512-fQfkg0Gjkza3nf0c7/w6Xf34BW4YvzNfACRLmmb7XRLa6XHdR+K9AlJlxneFfWYf6uhOzuzZVTjF/8KfndZANw==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.24.0", + "@babel/parser": "^7.24.0", + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.0", + "@babel/types": "^7.24.0", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.23.6", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", + "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.1.tgz", + "integrity": "sha512-1yJa9dX9g//V6fDebXoEfEsxkZHk3Hcbm+zLhyu6qVgYFLvmTALTeV+jNU9e5RnYtioBrGEOdoI2joMSNQ/+aA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-member-expression-to-functions": "^7.23.0", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.24.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", + "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.1.tgz", + "integrity": "sha512-o7SDgTJuvx5vLKD6SFvkydkSMBvahDKGiNJzG22IZYXhiqoe9efY7zocICBgzHV4IRg5wdgl2nEL/tulKIEIbA==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", + "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", + "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", + "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", + "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-wrap-function": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.1.tgz", + "integrity": "sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-member-expression-to-functions": "^7.23.0", + "@babel/helper-optimise-call-expression": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", + "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", + "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", + "dev": true, + "dependencies": { + "@babel/helper-function-name": "^7.22.5", + "@babel/template": "^7.22.15", + "@babel/types": "^7.22.19" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.1.tgz", + "integrity": "sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg==", + "dev": true, + "dependencies": { + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.1", + "@babel/types": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", + "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.1.tgz", + "integrity": "sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==", + "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.24.1", + "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.24.1.tgz", + "integrity": "sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.1.tgz", + "integrity": "sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.24.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.1.tgz", + "integrity": "sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + }, + "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-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.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.1.tgz", + "integrity": "sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.1.tgz", + "integrity": "sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "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-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.1.tgz", + "integrity": "sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.9.tgz", + "integrity": "sha512-8Q3veQEDGe14dTYuwagbRtwxQDnytyg1JFu4/HwEMETeofocrB0U0ejBJIXoeG/t2oXZ8kzCyI0ZZfbT80VFNQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.20", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz", + "integrity": "sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.1.tgz", + "integrity": "sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.1.tgz", + "integrity": "sha512-h71T2QQvDgM2SmT29UYU6ozjMlAt7s7CSs5Hvy8f8cf/GM/Z4a2zMfN+fjVGaieeCrXR3EdQl6C4gQG+OgmbKw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.1.tgz", + "integrity": "sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.1.tgz", + "integrity": "sha512-FUHlKCn6J3ERiu8Dv+4eoz7w8+kFLSyeVG4vDAikwADGjUCoHw/JHokyGtr8OR4UjpwPVivyF+h8Q5iv/JmrtA==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.1.tgz", + "integrity": "sha512-ZTIe3W7UejJd3/3R4p7ScyyOoafetUShSf4kCqV0O7F/RiHxVj/wRaRnQlrGwflvcehNA8M42HkAiEDYZu2F1Q==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-replace-supers": "^7.24.1", + "@babel/helper-split-export-declaration": "^7.22.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.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.1.tgz", + "integrity": "sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/template": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.1.tgz", + "integrity": "sha512-ow8jciWqNxR3RYbSNVuF4U2Jx130nwnBnhRw6N6h1bOejNkABmcI5X5oz29K4alWX7vf1C+o6gtKXikzRKkVdw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.1.tgz", + "integrity": "sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.1.tgz", + "integrity": "sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.1.tgz", + "integrity": "sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.1.tgz", + "integrity": "sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw==", + "dev": true, + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.1.tgz", + "integrity": "sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@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-transform-for-of": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.1.tgz", + "integrity": "sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.1.tgz", + "integrity": "sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.1.tgz", + "integrity": "sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.1.tgz", + "integrity": "sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.1.tgz", + "integrity": "sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@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-transform-member-expression-literals": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.1.tgz", + "integrity": "sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.1.tgz", + "integrity": "sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.1.tgz", + "integrity": "sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-simple-access": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.1.tgz", + "integrity": "sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA==", + "dev": true, + "dependencies": { + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.1.tgz", + "integrity": "sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", + "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.1.tgz", + "integrity": "sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.1.tgz", + "integrity": "sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@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-transform-numeric-separator": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.1.tgz", + "integrity": "sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.1.tgz", + "integrity": "sha512-XjD5f0YqOtebto4HGISLNfiNMTTs6tbkFf2TOqJlYKYmbo+mN9Dnpl4SRoofiziuOWMIyq3sZEUqLo3hLITFEA==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.24.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.1.tgz", + "integrity": "sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-replace-supers": "^7.24.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.1.tgz", + "integrity": "sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@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-transform-optional-chaining": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.1.tgz", + "integrity": "sha512-n03wmDt+987qXwAgcBlnUUivrZBPZ8z1plL0YvgQalLm+ZE5BMhGm94jhxXtA1wzv1Cu2aaOv1BM9vbVttrzSg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.1.tgz", + "integrity": "sha512-8Jl6V24g+Uw5OGPeWNKrKqXPDw2YDjLc53ojwfMcKwlEoETKU9rU0mHUtcg9JntWI/QYzGAXNWEcVHZ+fR+XXg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.1.tgz", + "integrity": "sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.1.tgz", + "integrity": "sha512-pTHxDVa0BpUbvAgX3Gat+7cSciXqUcY9j2VZKTbSB6+VQGpNgNO9ailxTGHSXlqOnX1Hcx1Enme2+yv7VqP9bg==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0", + "@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-transform-property-literals": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.1.tgz", + "integrity": "sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.1.tgz", + "integrity": "sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "regenerator-transform": "^0.15.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.1.tgz", + "integrity": "sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.0.tgz", + "integrity": "sha512-zc0GA5IitLKJrSfXlXmp8KDqLrnGECK7YRfQBmEKg1NmBOQ7e+KuclBEKJgzifQeUYLdNiAw4B4bjyvzWVLiSA==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.24.0", + "babel-plugin-polyfill-corejs2": "^0.4.8", + "babel-plugin-polyfill-corejs3": "^0.9.0", + "babel-plugin-polyfill-regenerator": "^0.5.5", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.1.tgz", + "integrity": "sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.1.tgz", + "integrity": "sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.1.tgz", + "integrity": "sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.1.tgz", + "integrity": "sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.1.tgz", + "integrity": "sha512-CBfU4l/A+KruSUoW+vTQthwcAdwuqbpRNB8HQKlZABwHRhsdHZ9fezp4Sn18PeAlYxTNiLMlx4xUBV3AWfg1BA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.1.tgz", + "integrity": "sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.1.tgz", + "integrity": "sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.1.tgz", + "integrity": "sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.1.tgz", + "integrity": "sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.0.tgz", + "integrity": "sha512-ZxPEzV9IgvGn73iK0E6VB9/95Nd7aMFpbE0l8KQFDG70cOV9IxRP7Y2FUPmlK0v6ImlLqYX50iuZ3ZTVhOF2lA==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.23.5", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-validator-option": "^7.23.5", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.7", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@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.23.3", + "@babel/plugin-syntax-import-attributes": "^7.23.3", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@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-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.23.3", + "@babel/plugin-transform-async-generator-functions": "^7.23.9", + "@babel/plugin-transform-async-to-generator": "^7.23.3", + "@babel/plugin-transform-block-scoped-functions": "^7.23.3", + "@babel/plugin-transform-block-scoping": "^7.23.4", + "@babel/plugin-transform-class-properties": "^7.23.3", + "@babel/plugin-transform-class-static-block": "^7.23.4", + "@babel/plugin-transform-classes": "^7.23.8", + "@babel/plugin-transform-computed-properties": "^7.23.3", + "@babel/plugin-transform-destructuring": "^7.23.3", + "@babel/plugin-transform-dotall-regex": "^7.23.3", + "@babel/plugin-transform-duplicate-keys": "^7.23.3", + "@babel/plugin-transform-dynamic-import": "^7.23.4", + "@babel/plugin-transform-exponentiation-operator": "^7.23.3", + "@babel/plugin-transform-export-namespace-from": "^7.23.4", + "@babel/plugin-transform-for-of": "^7.23.6", + "@babel/plugin-transform-function-name": "^7.23.3", + "@babel/plugin-transform-json-strings": "^7.23.4", + "@babel/plugin-transform-literals": "^7.23.3", + "@babel/plugin-transform-logical-assignment-operators": "^7.23.4", + "@babel/plugin-transform-member-expression-literals": "^7.23.3", + "@babel/plugin-transform-modules-amd": "^7.23.3", + "@babel/plugin-transform-modules-commonjs": "^7.23.3", + "@babel/plugin-transform-modules-systemjs": "^7.23.9", + "@babel/plugin-transform-modules-umd": "^7.23.3", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.23.3", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.4", + "@babel/plugin-transform-numeric-separator": "^7.23.4", + "@babel/plugin-transform-object-rest-spread": "^7.24.0", + "@babel/plugin-transform-object-super": "^7.23.3", + "@babel/plugin-transform-optional-catch-binding": "^7.23.4", + "@babel/plugin-transform-optional-chaining": "^7.23.4", + "@babel/plugin-transform-parameters": "^7.23.3", + "@babel/plugin-transform-private-methods": "^7.23.3", + "@babel/plugin-transform-private-property-in-object": "^7.23.4", + "@babel/plugin-transform-property-literals": "^7.23.3", + "@babel/plugin-transform-regenerator": "^7.23.3", + "@babel/plugin-transform-reserved-words": "^7.23.3", + "@babel/plugin-transform-shorthand-properties": "^7.23.3", + "@babel/plugin-transform-spread": "^7.23.3", + "@babel/plugin-transform-sticky-regex": "^7.23.3", + "@babel/plugin-transform-template-literals": "^7.23.3", + "@babel/plugin-transform-typeof-symbol": "^7.23.3", + "@babel/plugin-transform-unicode-escapes": "^7.23.3", + "@babel/plugin-transform-unicode-property-regex": "^7.23.3", + "@babel/plugin-transform-unicode-regex": "^7.23.3", + "@babel/plugin-transform-unicode-sets-regex": "^7.23.3", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.8", + "babel-plugin-polyfill-corejs3": "^0.9.0", + "babel-plugin-polyfill-regenerator": "^0.5.5", + "core-js-compat": "^3.31.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/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.24.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.0.tgz", + "integrity": "sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", + "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz", + "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.24.1", + "@babel/generator": "^7.24.1", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.24.1", + "@babel/types": "^7.24.0", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/@babel/generator": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.1.tgz", + "integrity": "sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", + "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "dev": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@ctrl/ngx-emoji-mart": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/@ctrl/ngx-emoji-mart/-/ngx-emoji-mart-9.2.0.tgz", + "integrity": "sha512-q8B7DiXPfyTe+VOGO6Ix7eh5gKCuADxAsud2xXRTlECTfchoKGTmirSczyjaxIKE/xmB+/ZsnkpthZqUM7SAJQ==", + "dependencies": { + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular/core": ">=15.0.0-0" + } + }, + "node_modules/@dabh/diagnostics": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", + "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", + "dependencies": { + "colorspace": "1.1.x", + "enabled": "2.0.x", + "kuler": "^2.0.0" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.1.tgz", + "integrity": "sha512-m55cpeupQ2DbuRGQMMZDzbv9J9PgVelPjlcmM5kxHnrBdBx6REaEd7LamYV7Dm8N7rCyR/XwU6rVP8ploKtIkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.1.tgz", + "integrity": "sha512-4j0+G27/2ZXGWR5okcJi7pQYhmkVgb4D7UKwxcqrjhvp5TKWx3cUjgB1CGj1mfdmJBQ9VnUGgUhign+FPF2Zgw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.1.tgz", + "integrity": "sha512-hCnXNF0HM6AjowP+Zou0ZJMWWa1VkD77BXe959zERgGJBBxB+sV+J9f/rcjeg2c5bsukD/n17RKWXGFCO5dD5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.1.tgz", + "integrity": "sha512-MSfZMBoAsnhpS+2yMFYIQUPs8Z19ajwfuaSZx+tSl09xrHZCjbeXXMsUF/0oq7ojxYEpsSo4c0SfjxOYXRbpaA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.1.tgz", + "integrity": "sha512-Ylk6rzgMD8klUklGPzS414UQLa5NPXZD5tf8JmQU8GQrj6BrFA/Ic9tb2zRe1kOZyCbGl+e8VMbDRazCEBqPvA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.1.tgz", + "integrity": "sha512-pFIfj7U2w5sMp52wTY1XVOdoxw+GDwy9FsK3OFz4BpMAjvZVs0dT1VXs8aQm22nhwoIWUmIRaE+4xow8xfIDZA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.1.tgz", + "integrity": "sha512-UyW1WZvHDuM4xDz0jWun4qtQFauNdXjXOtIy7SYdf7pbxSWWVlqhnR/T2TpX6LX5NI62spt0a3ldIIEkPM6RHw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.1.tgz", + "integrity": "sha512-itPwCw5C+Jh/c624vcDd9kRCCZVpzpQn8dtwoYIt2TJF3S9xJLiRohnnNrKwREvcZYx0n8sCSbvGH349XkcQeg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.1.tgz", + "integrity": "sha512-LojC28v3+IhIbfQ+Vu4Ut5n3wKcgTu6POKIHN9Wpt0HnfgUGlBuyDDQR4jWZUZFyYLiz4RBBBmfU6sNfn6RhLw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.1.tgz", + "integrity": "sha512-cX8WdlF6Cnvw/DO9/X7XLH2J6CkBnz7Twjpk56cshk9sjYVcuh4sXQBy5bmTwzBjNVZze2yaV1vtcJS04LbN8w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.1.tgz", + "integrity": "sha512-4H/sQCy1mnnGkUt/xszaLlYJVTz3W9ep52xEefGtd6yXDQbz/5fZE5dFLUgsPdbUOQANcVUa5iO6g3nyy5BJiw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.1.tgz", + "integrity": "sha512-c0jgtB+sRHCciVXlyjDcWb2FUuzlGVRwGXgI+3WqKOIuoo8AmZAddzeOHeYLtD+dmtHw3B4Xo9wAUdjlfW5yYA==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.1.tgz", + "integrity": "sha512-TgFyCfIxSujyuqdZKDZ3yTwWiGv+KnlOeXXitCQ+trDODJ+ZtGOzLkSWngynP0HZnTsDyBbPy7GWVXWaEl6lhA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.1.tgz", + "integrity": "sha512-b+yuD1IUeL+Y93PmFZDZFIElwbmFfIKLKlYI8M6tRyzE6u7oEP7onGk0vZRh8wfVGC2dZoy0EqX1V8qok4qHaw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.1.tgz", + "integrity": "sha512-wpDlpE0oRKZwX+GfomcALcouqjjV8MIX8DyTrxfyCfXxoKQSDm45CZr9fanJ4F6ckD4yDEPT98SrjvLwIqUCgg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.1.tgz", + "integrity": "sha512-5BepC2Au80EohQ2dBpyTquqGCES7++p7G+7lXe1bAIvMdXm4YYcEfZtQrP4gaoZ96Wv1Ute61CEHFU7h4FMueQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.1.tgz", + "integrity": "sha512-5gRPk7pKuaIB+tmH+yKd2aQTRpqlf1E4f/mC+tawIm/CGJemZcHZpp2ic8oD83nKgUPMEd0fNanrnFljiruuyA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.1.tgz", + "integrity": "sha512-4fL68JdrLV2nVW2AaWZBv3XEm3Ae3NZn/7qy2KGAt3dexAgSVT+Hc97JKSZnqezgMlv9x6KV0ZkZY7UO5cNLCg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.1.tgz", + "integrity": "sha512-GhRuXlvRE+twf2ES+8REbeCb/zeikNqwD3+6S5y5/x+DYbAQUNl0HNBs4RQJqrechS4v4MruEr8ZtAin/hK5iw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.1.tgz", + "integrity": "sha512-ZnWEyCM0G1Ex6JtsygvC3KUUrlDXqOihw8RicRuQAzw+c4f1D66YlPNNV3rkjVW90zXVsHwZYWbJh3v+oQFM9Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.1.tgz", + "integrity": "sha512-QZ6gXue0vVQY2Oon9WyLFCdSuYbXSoxaZrPuJ4c20j6ICedfsDilNPYfHLlMH7vGfU5DQR0czHLmJvH4Nzis/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.1.tgz", + "integrity": "sha512-HzcJa1NcSWTAU0MJIxOho8JftNp9YALui3o+Ny7hCh0v5f90nprly1U3Sj1Ldj/CvKKdvvFsCRvDkpsEMp4DNw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.1.tgz", + "integrity": "sha512-0MBh53o6XtI6ctDnRMeQ+xoCN8kD2qI1rY1KgF/xdWQwoFeKou7puvDfV8/Wv4Ctx2rRpET/gGdz3YlNtNACSA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@fastify/busboy": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", + "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", + "engines": { + "node": ">=14" + } + }, + "node_modules/@firebase/analytics": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.10.1.tgz", + "integrity": "sha512-5mnH1aQa99J5lZMJwTNzIoRc4yGXHf+fOn+EoEWhCDA3XGPweGHcylCbqq+G1wVJmfILL57fohDMa8ftMZ+44g==", + "dependencies": { + "@firebase/component": "0.6.5", + "@firebase/installations": "0.6.5", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.4", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/analytics-compat": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/@firebase/analytics-compat/-/analytics-compat-0.2.7.tgz", + "integrity": "sha512-17VCly4P0VFBDqaaal7m1nhyYQwsygtaTpSsnc51sFPRrr9XIYtnD8ficon9fneEGEoJQ2g7OtASvhwX9EbK8g==", + "dependencies": { + "@firebase/analytics": "0.10.1", + "@firebase/analytics-types": "0.8.0", + "@firebase/component": "0.6.5", + "@firebase/util": "1.9.4", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/analytics-types": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@firebase/analytics-types/-/analytics-types-0.8.0.tgz", + "integrity": "sha512-iRP+QKI2+oz3UAh4nPEq14CsEjrjD6a5+fuypjScisAh9kXKFvdJOZJDwk7kikLvWVLGEs9+kIUS4LPQV7VZVw==" + }, + "node_modules/@firebase/app": { + "version": "0.9.29", + "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.9.29.tgz", + "integrity": "sha512-HbKTjfmILklasIu/ij6zKnFf3SgLYXkBDVN7leJfVGmohl+zA7Ig+eXM1ZkT1pyBJ8FTYR+mlOJer/lNEnUCtw==", + "dependencies": { + "@firebase/component": "0.6.5", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.4", + "idb": "7.1.1", + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/app-check": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/@firebase/app-check/-/app-check-0.8.2.tgz", + "integrity": "sha512-A2B5+ldOguYAeqW1quFN5qNdruSNRrg4W59ag1Eq6QzxuHNIkrE+TrapfrW/z5NYFjCxAYqr/unVCgmk80Dwcg==", + "dependencies": { + "@firebase/component": "0.6.5", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.4", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/app-check-compat": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@firebase/app-check-compat/-/app-check-compat-0.3.9.tgz", + "integrity": "sha512-7LxyupQ8XeEHRh72mO+tqm69kHT6KbWi2KtFMGedJ6tNbwzFzojcXESMKN8RpADXbYoQgY3loWMJjMx4r2Zt7w==", + "dependencies": { + "@firebase/app-check": "0.8.2", + "@firebase/app-check-types": "0.5.0", + "@firebase/component": "0.6.5", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.4", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/app-check-interop-types": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@firebase/app-check-interop-types/-/app-check-interop-types-0.3.0.tgz", + "integrity": "sha512-xAxHPZPIgFXnI+vb4sbBjZcde7ZluzPPaSK7Lx3/nmuVk4TjZvnL8ONnkd4ERQKL8WePQySU+pRcWkh8rDf5Sg==" + }, + "node_modules/@firebase/app-check-types": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@firebase/app-check-types/-/app-check-types-0.5.0.tgz", + "integrity": "sha512-uwSUj32Mlubybw7tedRzR24RP8M8JUVR3NPiMk3/Z4bCmgEKTlQBwMXrehDAZ2wF+TsBq0SN1c6ema71U/JPyQ==" + }, + "node_modules/@firebase/app-compat": { + "version": "0.2.29", + "resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.2.29.tgz", + "integrity": "sha512-NqUdegXJfwphx9i/2bOE2CTZ55TC9bbDg+iwkxVShsPBJhD3CzQJkFhoDz4ccfbJaKZGsqjY3fisgX5kbDROnA==", + "dependencies": { + "@firebase/app": "0.9.29", + "@firebase/component": "0.6.5", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.4", + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/app-types": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.9.0.tgz", + "integrity": "sha512-AeweANOIo0Mb8GiYm3xhTEBVCmPwTYAu9Hcd2qSkLuga/6+j9b1Jskl5bpiSQWy9eJ/j5pavxj6eYogmnuzm+Q==" + }, + "node_modules/@firebase/auth": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-1.6.2.tgz", + "integrity": "sha512-BFo/Nj1AAbKLbFiUyXCcnT/bSqMJicFOgdTAKzlXvCul7+eUE29vWmzd1g59O3iKAxvv3+fbQYjQVJpNTTHIyw==", + "dependencies": { + "@firebase/component": "0.6.5", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.4", + "tslib": "^2.1.0", + "undici": "5.28.3" + }, + "peerDependencies": { + "@firebase/app": "0.x", + "@react-native-async-storage/async-storage": "^1.18.1" + }, + "peerDependenciesMeta": { + "@react-native-async-storage/async-storage": { + "optional": true + } + } + }, + "node_modules/@firebase/auth-compat": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@firebase/auth-compat/-/auth-compat-0.5.4.tgz", + "integrity": "sha512-EtRVW9s0YsuJv3GnOGDoLUW3Pp9f3HcqWA2WK92E30Qa0FEVRwCSRLVQwn9td+SLVY3AP9gi/auC1q3osd4yCg==", + "dependencies": { + "@firebase/auth": "1.6.2", + "@firebase/auth-types": "0.12.0", + "@firebase/component": "0.6.5", + "@firebase/util": "1.9.4", + "tslib": "^2.1.0", + "undici": "5.28.3" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/auth-compat/node_modules/undici": { + "version": "5.28.3", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.3.tgz", + "integrity": "sha512-3ItfzbrhDlINjaP0duwnNsKpDQk3acHI3gVJ1z4fmwMK31k5G9OVIAMLSIaP6w4FaGkaAkN6zaQO9LUvZ1t7VA==", + "dependencies": { + "@fastify/busboy": "^2.0.0" + }, + "engines": { + "node": ">=14.0" + } + }, + "node_modules/@firebase/auth-interop-types": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.2.1.tgz", + "integrity": "sha512-VOaGzKp65MY6P5FI84TfYKBXEPi6LmOCSMMzys6o2BN2LOsqy7pCuZCup7NYnfbk5OkkQKzvIfHOzTm0UDpkyg==" + }, + "node_modules/@firebase/auth-types": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@firebase/auth-types/-/auth-types-0.12.0.tgz", + "integrity": "sha512-pPwaZt+SPOshK8xNoiQlK5XIrS97kFYc3Rc7xmy373QsOJ9MmqXxLaYssP5Kcds4wd2qK//amx/c+A8O2fVeZA==", + "peerDependencies": { + "@firebase/app-types": "0.x", + "@firebase/util": "1.x" + } + }, + "node_modules/@firebase/auth/node_modules/undici": { + "version": "5.28.3", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.3.tgz", + "integrity": "sha512-3ItfzbrhDlINjaP0duwnNsKpDQk3acHI3gVJ1z4fmwMK31k5G9OVIAMLSIaP6w4FaGkaAkN6zaQO9LUvZ1t7VA==", + "dependencies": { + "@fastify/busboy": "^2.0.0" + }, + "engines": { + "node": ">=14.0" + } + }, + "node_modules/@firebase/component": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.5.tgz", + "integrity": "sha512-2tVDk1ixi12sbDmmfITK8lxSjmcb73BMF6Qwc3U44hN/J1Fi1QY/Hnnb6klFlbB9/G16a3J3d4nXykye2EADTw==", + "dependencies": { + "@firebase/util": "1.9.4", + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/database": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@firebase/database/-/database-1.0.3.tgz", + "integrity": "sha512-9fjqLt9JzL46gw9+NRqsgQEMjgRwfd8XtzcKqG+UYyhVeFCdVRQ0Wp6Dw/dvYHnbH5vNEKzNv36dcB4p+PIAAA==", + "dependencies": { + "@firebase/app-check-interop-types": "0.3.0", + "@firebase/auth-interop-types": "0.2.1", + "@firebase/component": "0.6.5", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.4", + "faye-websocket": "0.11.4", + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/database-compat": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-1.0.3.tgz", + "integrity": "sha512-7tHEOcMbK5jJzHWyphPux4osogH/adWwncxdMxdBpB9g1DNIyY4dcz1oJdlkXGM/i/AjUBesZsd5CuwTRTBNTw==", + "dependencies": { + "@firebase/component": "0.6.5", + "@firebase/database": "1.0.3", + "@firebase/database-types": "1.0.1", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.4", + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/database-types": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-1.0.1.tgz", + "integrity": "sha512-Tmcmx5XgiI7UVF/4oGg2P3AOTfq3WKEPsm2yf+uXtN7uG/a4WTWhVMrXGYRY2ZUL1xPxv9V33wQRJ+CcrUhVXw==", + "dependencies": { + "@firebase/app-types": "0.9.0", + "@firebase/util": "1.9.4" + } + }, + "node_modules/@firebase/firestore": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-4.5.0.tgz", + "integrity": "sha512-rXS6v4HbsN6vZQlq2fLW1ZHb+J5SnS+8Zqb/McbKFIrGYjPUZo5CyO75mkgtlR1tCYAwCebaqoEWb6JHgZv/ww==", + "dependencies": { + "@firebase/component": "0.6.5", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.4", + "@firebase/webchannel-wrapper": "0.10.5", + "@grpc/grpc-js": "~1.9.0", + "@grpc/proto-loader": "^0.7.8", + "tslib": "^2.1.0", + "undici": "5.28.3" + }, + "engines": { + "node": ">=10.10.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/firestore-compat": { + "version": "0.3.27", + "resolved": "https://registry.npmjs.org/@firebase/firestore-compat/-/firestore-compat-0.3.27.tgz", + "integrity": "sha512-gY2q0fCDJvPg/IurZQbBM7MIVjxA1/LsvfgFOubUTrex5KTY9qm4/2V2R79eAs8Q+b4B8soDtlEjk6L8BW1Crw==", + "dependencies": { + "@firebase/component": "0.6.5", + "@firebase/firestore": "4.5.0", + "@firebase/firestore-types": "3.0.0", + "@firebase/util": "1.9.4", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/firestore-types": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-3.0.0.tgz", + "integrity": "sha512-Meg4cIezHo9zLamw0ymFYBD4SMjLb+ZXIbuN7T7ddXN6MGoICmOTq3/ltdCGoDCS2u+H1XJs2u/cYp75jsX9Qw==", + "peerDependencies": { + "@firebase/app-types": "0.x", + "@firebase/util": "1.x" + } + }, + "node_modules/@firebase/firestore/node_modules/undici": { + "version": "5.28.3", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.3.tgz", + "integrity": "sha512-3ItfzbrhDlINjaP0duwnNsKpDQk3acHI3gVJ1z4fmwMK31k5G9OVIAMLSIaP6w4FaGkaAkN6zaQO9LUvZ1t7VA==", + "dependencies": { + "@fastify/busboy": "^2.0.0" + }, + "engines": { + "node": ">=14.0" + } + }, + "node_modules/@firebase/functions": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.11.2.tgz", + "integrity": "sha512-2NULTYOZbu0rXczwfYdqQH0w1FmmYrKjTy1YPQSHLCAkMBdfewoKmVm4Lyo2vRn0H9ZndciLY7NszKDFt9MKCQ==", + "dependencies": { + "@firebase/app-check-interop-types": "0.3.0", + "@firebase/auth-interop-types": "0.2.1", + "@firebase/component": "0.6.5", + "@firebase/messaging-interop-types": "0.2.0", + "@firebase/util": "1.9.4", + "tslib": "^2.1.0", + "undici": "5.28.3" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/functions-compat": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@firebase/functions-compat/-/functions-compat-0.3.8.tgz", + "integrity": "sha512-VDHSw6UOu8RxfgAY/q8e+Jn+9Fh60Fc28yck0yfMsi2e0BiWgonIMWkFspFGGLgOJebTHl+hc+9v91rhzU6xlg==", + "dependencies": { + "@firebase/component": "0.6.5", + "@firebase/functions": "0.11.2", + "@firebase/functions-types": "0.6.0", + "@firebase/util": "1.9.4", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/functions-types": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@firebase/functions-types/-/functions-types-0.6.0.tgz", + "integrity": "sha512-hfEw5VJtgWXIRf92ImLkgENqpL6IWpYaXVYiRkFY1jJ9+6tIhWM7IzzwbevwIIud/jaxKVdRzD7QBWfPmkwCYw==" + }, + "node_modules/@firebase/functions/node_modules/undici": { + "version": "5.28.3", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.3.tgz", + "integrity": "sha512-3ItfzbrhDlINjaP0duwnNsKpDQk3acHI3gVJ1z4fmwMK31k5G9OVIAMLSIaP6w4FaGkaAkN6zaQO9LUvZ1t7VA==", + "dependencies": { + "@fastify/busboy": "^2.0.0" + }, + "engines": { + "node": ">=14.0" + } + }, + "node_modules/@firebase/installations": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@firebase/installations/-/installations-0.6.5.tgz", + "integrity": "sha512-0xxnQWw8rSRzu0ZOCkZaO+MJ0LkDAfwwTB2Z1SxRK6FAz5xkxD1ZUwM0WbCRni49PKubCrZYOJ6yg7tSjU7AKA==", + "dependencies": { + "@firebase/component": "0.6.5", + "@firebase/util": "1.9.4", + "idb": "7.1.1", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/installations-compat": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@firebase/installations-compat/-/installations-compat-0.2.5.tgz", + "integrity": "sha512-usvoIaog5CHEw082HXLrKAZ1qd4hIC3N/LDe2NqBgI3pkGE/7auLVM4Gn5gvyryp0x8z/IP1+d9fkGUj2OaGLQ==", + "dependencies": { + "@firebase/component": "0.6.5", + "@firebase/installations": "0.6.5", + "@firebase/installations-types": "0.5.0", + "@firebase/util": "1.9.4", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/installations-types": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@firebase/installations-types/-/installations-types-0.5.0.tgz", + "integrity": "sha512-9DP+RGfzoI2jH7gY4SlzqvZ+hr7gYzPODrbzVD82Y12kScZ6ZpRg/i3j6rleto8vTFC8n6Len4560FnV1w2IRg==", + "peerDependencies": { + "@firebase/app-types": "0.x" + } + }, + "node_modules/@firebase/logger": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.4.0.tgz", + "integrity": "sha512-eRKSeykumZ5+cJPdxxJRgAC3G5NknY2GwEbKfymdnXtnT0Ucm4pspfR6GT4MUQEDuJwRVbVcSx85kgJulMoFFA==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/messaging": { + "version": "0.12.6", + "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.12.6.tgz", + "integrity": "sha512-IORsPp9IPWq4j4yEhTOZ6GAGi3gQwGc+4yexmTAlya+qeBRSdRnJg2iIU/aj+tcKDQYr9RQuQPgHHOdFIx//vA==", + "dependencies": { + "@firebase/component": "0.6.5", + "@firebase/installations": "0.6.5", + "@firebase/messaging-interop-types": "0.2.0", + "@firebase/util": "1.9.4", + "idb": "7.1.1", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/messaging-compat": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/@firebase/messaging-compat/-/messaging-compat-0.2.6.tgz", + "integrity": "sha512-Q2xC1s4L7Vpss7P7Gy6GuIS+xmJrf/vm9+gX76IK1Bo1TjoKwleCLHt1LHkPz5Rvqg5pTgzzI8qqPhBpZosFCg==", + "dependencies": { + "@firebase/component": "0.6.5", + "@firebase/messaging": "0.12.6", + "@firebase/util": "1.9.4", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/messaging-interop-types": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@firebase/messaging-interop-types/-/messaging-interop-types-0.2.0.tgz", + "integrity": "sha512-ujA8dcRuVeBixGR9CtegfpU4YmZf3Lt7QYkcj693FFannwNuZgfAYaTmbJ40dtjB81SAu6tbFPL9YLNT15KmOQ==" + }, + "node_modules/@firebase/performance": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@firebase/performance/-/performance-0.6.5.tgz", + "integrity": "sha512-OzAGcWhOqEFH9GdwUuY0oC5FSlnMejcnmSAhR+EjpI7exdDvixyLyCR4txjSHYNTbumrFBG+EP8GO11CNXRaJA==", + "dependencies": { + "@firebase/component": "0.6.5", + "@firebase/installations": "0.6.5", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.4", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/performance-compat": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@firebase/performance-compat/-/performance-compat-0.2.5.tgz", + "integrity": "sha512-jJwJkVyDcIMBaVGrZ6CRGs4m5FCZsWB5QCWYI3FdsHyIa9/TfteNDilxj9wGciF2naFIHDW7TgE69U5dAH9Ktg==", + "dependencies": { + "@firebase/component": "0.6.5", + "@firebase/logger": "0.4.0", + "@firebase/performance": "0.6.5", + "@firebase/performance-types": "0.2.0", + "@firebase/util": "1.9.4", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/performance-types": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@firebase/performance-types/-/performance-types-0.2.0.tgz", + "integrity": "sha512-kYrbr8e/CYr1KLrLYZZt2noNnf+pRwDq2KK9Au9jHrBMnb0/C9X9yWSXmZkFt4UIdsQknBq8uBB7fsybZdOBTA==" + }, + "node_modules/@firebase/remote-config": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/@firebase/remote-config/-/remote-config-0.4.5.tgz", + "integrity": "sha512-rGLqc/4OmxrS39RA9kgwa6JmgWytQuMo+B8pFhmGp3d++x2Hf9j+MLQfhOLyyUo64fNw20J19mLXhrXvKHsjZQ==", + "dependencies": { + "@firebase/component": "0.6.5", + "@firebase/installations": "0.6.5", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.4", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/remote-config-compat": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@firebase/remote-config-compat/-/remote-config-compat-0.2.5.tgz", + "integrity": "sha512-ImkNnLuGrD/bylBHDJigSY6LMwRrwt37wQbsGZhWG4QQ6KLzHzSf0nnFRRFvkOZodEUE57Ib8l74d6Yn/6TDUQ==", + "dependencies": { + "@firebase/component": "0.6.5", + "@firebase/logger": "0.4.0", + "@firebase/remote-config": "0.4.5", + "@firebase/remote-config-types": "0.3.0", + "@firebase/util": "1.9.4", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/remote-config-types": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@firebase/remote-config-types/-/remote-config-types-0.3.0.tgz", + "integrity": "sha512-RtEH4vdcbXZuZWRZbIRmQVBNsE7VDQpet2qFvq6vwKLBIQRQR5Kh58M4ok3A3US8Sr3rubYnaGqZSurCwI8uMA==" + }, + "node_modules/@firebase/storage": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.12.2.tgz", + "integrity": "sha512-MzanOBcxDx9oOwDaDPMuiYxd6CxcN1xZm+os5uNE3C1itbRKLhM9rzpODDKWzcbnHHFtXk3Q3lsK/d3Xa1WYYw==", + "dependencies": { + "@firebase/component": "0.6.5", + "@firebase/util": "1.9.4", + "tslib": "^2.1.0", + "undici": "5.28.3" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/storage-compat": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@firebase/storage-compat/-/storage-compat-0.3.5.tgz", + "integrity": "sha512-5dJXfY5NxCF5NAk4dLvJqC+m6cgcf0Fr29nrMHwhwI34pBheQq2PdRZqALsqZCES9dnHTuFNlqGQDpLr+Ph4rw==", + "dependencies": { + "@firebase/component": "0.6.5", + "@firebase/storage": "0.12.2", + "@firebase/storage-types": "0.8.0", + "@firebase/util": "1.9.4", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/storage-types": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@firebase/storage-types/-/storage-types-0.8.0.tgz", + "integrity": "sha512-isRHcGrTs9kITJC0AVehHfpraWFui39MPaU7Eo8QfWlqW7YPymBmRgjDrlOgFdURh6Cdeg07zmkLP5tzTKRSpg==", + "peerDependencies": { + "@firebase/app-types": "0.x", + "@firebase/util": "1.x" + } + }, + "node_modules/@firebase/storage/node_modules/undici": { + "version": "5.28.3", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.3.tgz", + "integrity": "sha512-3ItfzbrhDlINjaP0duwnNsKpDQk3acHI3gVJ1z4fmwMK31k5G9OVIAMLSIaP6w4FaGkaAkN6zaQO9LUvZ1t7VA==", + "dependencies": { + "@fastify/busboy": "^2.0.0" + }, + "engines": { + "node": ">=14.0" + } + }, + "node_modules/@firebase/util": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.9.4.tgz", + "integrity": "sha512-WLonYmS1FGHT97TsUmRN3qnTh5TeeoJp1Gg5fithzuAgdZOUtsYECfy7/noQ3llaguios8r5BuXSEiK82+UrxQ==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/webchannel-wrapper": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.10.5.tgz", + "integrity": "sha512-eSkJsnhBWv5kCTSU1tSUVl9mpFu+5NXXunZc83le8GMjMlsWwQArSc7cJJ4yl+aDFY0NGLi0AjZWMn1axOrkRg==" + }, + "node_modules/@grpc/grpc-js": { + "version": "1.9.14", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.14.tgz", + "integrity": "sha512-nOpuzZ2G3IuMFN+UPPpKrC6NsLmWsTqSsm66IRfnBt1D4pwTqE27lmbpcPM+l2Ua4gE7PfjRHI6uedAy7hoXUw==", + "dependencies": { + "@grpc/proto-loader": "^0.7.8", + "@types/node": ">=12.12.47" + }, + "engines": { + "node": "^8.13.0 || >=10.10.0" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.7.11", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.11.tgz", + "integrity": "sha512-amjhSfJ+xYnTP+hncJMmkchoRtjIdi+uO3FaymGSCr07yu5xfpXFEnhZkTU1mj2lPJB3oVToau7j9YkqB+YNdg==", + "dependencies": { + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.2.4", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@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/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/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", + "dev": true + }, + "node_modules/@ljharb/through": { + "version": "2.3.13", + "resolved": "https://registry.npmjs.org/@ljharb/through/-/through-2.3.13.tgz", + "integrity": "sha512-/gKJun8NNiWGZJkGzI/Ragc53cOdcLNdzjLaIa+GEjguQs0ulsurx8WN0jijdK9yPqDvziX995sMRLyLt1uZMQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/@ngtools/webpack": { + "version": "17.3.2", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-17.3.2.tgz", + "integrity": "sha512-E8zejFF4aJ8l2XcF+GgnE/1IqsZepnPT1xzulLB4LXtjVuXLFLoF9xkHQwxs7cJWWZsxd/SlNsCIcn/ezrYBcQ==", + "dev": true, + "engines": { + "node": "^18.13.0 || >=20.9.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "@angular/compiler-cli": "^17.0.0", + "typescript": ">=5.2 <5.5", + "webpack": "^5.54.0" + } + }, + "node_modules/@ngx-translate/core": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@ngx-translate/core/-/core-15.0.0.tgz", + "integrity": "sha512-Am5uiuR0bOOxyoercDnAA3rJVizo4RRqJHo8N3RqJ+XfzVP/I845yEnMADykOHvM6HkVm4SZSnJBOiz0Anx5BA==", + "engines": { + "node": "^16.13.0 || >=18.10.0" + }, + "peerDependencies": { + "@angular/common": ">=16.0.0", + "@angular/core": ">=16.0.0", + "rxjs": "^6.5.5 || ^7.4.0" + } + }, + "node_modules/@ngx-translate/http-loader": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@ngx-translate/http-loader/-/http-loader-8.0.0.tgz", + "integrity": "sha512-SFMsdUcmHF5OdZkL1CHEoSAwbP5EbAOPTLLboOCRRoOg21P4GJx+51jxGdJeGve6LSKLf4Pay7BkTwmE6vxYlg==", + "engines": { + "node": "^16.13.0 || >=18.10.0" + }, + "peerDependencies": { + "@angular/common": ">=16.0.0", + "@angular/core": ">=16.0.0", + "@ngx-translate/core": ">=15.0.0", + "rxjs": "^6.5.5 || ^7.4.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "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/@npmcli/agent": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-2.2.1.tgz", + "integrity": "sha512-H4FrOVtNyWC8MUwL3UfjOsAihHvT1Pe8POj3JvjXhSTJipsZMtgUALCT4mGyYZNxymkUfOw3PUj6dE4QPp6osQ==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.1", + "lru-cache": "^10.0.1", + "socks-proxy-agent": "^8.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/agent/node_modules/lru-cache": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/@npmcli/fs": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", + "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", + "dev": true, + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/git": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-5.0.4.tgz", + "integrity": "sha512-nr6/WezNzuYUppzXRaYu/W4aT5rLxdXqEFupbh6e/ovlYFQ8hpu1UUPV3Ir/YTl+74iXl2ZOMlGzudh9ZPUchQ==", + "dev": true, + "dependencies": { + "@npmcli/promise-spawn": "^7.0.0", + "lru-cache": "^10.0.1", + "npm-pick-manifest": "^9.0.0", + "proc-log": "^3.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/git/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/@npmcli/git/node_modules/lru-cache": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/@npmcli/git/node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "dev": true, + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/installed-package-contents": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.0.2.tgz", + "integrity": "sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==", + "dev": true, + "dependencies": { + "npm-bundled": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "bin": { + "installed-package-contents": "lib/index.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/node-gyp": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", + "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/package-json": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-5.0.0.tgz", + "integrity": "sha512-OI2zdYBLhQ7kpNPaJxiflofYIpkNLi+lnGdzqUOfRmCF3r2l1nadcjtCYMJKv/Utm/ZtlffaUuTiAktPHbc17g==", + "dev": true, + "dependencies": { + "@npmcli/git": "^5.0.0", + "glob": "^10.2.2", + "hosted-git-info": "^7.0.0", + "json-parse-even-better-errors": "^3.0.0", + "normalize-package-data": "^6.0.0", + "proc-log": "^3.0.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/package-json/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@npmcli/package-json/node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@npmcli/package-json/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@npmcli/promise-spawn": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-7.0.1.tgz", + "integrity": "sha512-P4KkF9jX3y+7yFUxgcUdDtLy+t4OlDGuEBLNs57AZsfSfg+uV6MLndqGpnl4831ggaEdXwR50XFoZP4VFtHolg==", + "dev": true, + "dependencies": { + "which": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/promise-spawn/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/@npmcli/promise-spawn/node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "dev": true, + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/run-script": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-7.0.4.tgz", + "integrity": "sha512-9ApYM/3+rBt9V80aYg6tZfzj3UWdiYyCt7gJUD1VJKvWF5nwKDSICXbYIQbspFTq6TOpbsEtIC0LArB8d9PFmg==", + "dev": true, + "dependencies": { + "@npmcli/node-gyp": "^3.0.0", + "@npmcli/package-json": "^5.0.0", + "@npmcli/promise-spawn": "^7.0.0", + "node-gyp": "^10.0.0", + "which": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/run-script/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/@npmcli/run-script/node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "dev": true, + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, + "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/@rollup/rollup-android-arm-eabi": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.13.0.tgz", + "integrity": "sha512-5ZYPOuaAqEH/W3gYsRkxQATBW3Ii1MfaT4EQstTnLKViLi2gLSQmlmtTpGucNP3sXEpOiI5tdGhjdE111ekyEg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.13.0.tgz", + "integrity": "sha512-BSbaCmn8ZadK3UAQdlauSvtaJjhlDEjS5hEVVIN3A4bbl3X+otyf/kOJV08bYiRxfejP3DXFzO2jz3G20107+Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.13.0.tgz", + "integrity": "sha512-Ovf2evVaP6sW5Ut0GHyUSOqA6tVKfrTHddtmxGQc1CTQa1Cw3/KMCDEEICZBbyppcwnhMwcDce9ZRxdWRpVd6g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.13.0.tgz", + "integrity": "sha512-U+Jcxm89UTK592vZ2J9st9ajRv/hrwHdnvyuJpa5A2ngGSVHypigidkQJP+YiGL6JODiUeMzkqQzbCG3At81Gg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.13.0.tgz", + "integrity": "sha512-8wZidaUJUTIR5T4vRS22VkSMOVooG0F4N+JSwQXWSRiC6yfEsFMLTYRFHvby5mFFuExHa/yAp9juSphQQJAijQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.13.0.tgz", + "integrity": "sha512-Iu0Kno1vrD7zHQDxOmvweqLkAzjxEVqNhUIXBsZ8hu8Oak7/5VTPrxOEZXYC1nmrBVJp0ZcL2E7lSuuOVaE3+w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.13.0.tgz", + "integrity": "sha512-C31QrW47llgVyrRjIwiOwsHFcaIwmkKi3PCroQY5aVq4H0A5v/vVVAtFsI1nfBngtoRpeREvZOkIhmRwUKkAdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.13.0.tgz", + "integrity": "sha512-Oq90dtMHvthFOPMl7pt7KmxzX7E71AfyIhh+cPhLY9oko97Zf2C9tt/XJD4RgxhaGeAraAXDtqxvKE1y/j35lA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.13.0.tgz", + "integrity": "sha512-yUD/8wMffnTKuiIsl6xU+4IA8UNhQ/f1sAnQebmE/lyQ8abjsVyDkyRkWop0kdMhKMprpNIhPmYlCxgHrPoXoA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.13.0.tgz", + "integrity": "sha512-9RyNqoFNdF0vu/qqX63fKotBh43fJQeYC98hCaf89DYQpv+xu0D8QFSOS0biA7cGuqJFOc1bJ+m2rhhsKcw1hw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.13.0.tgz", + "integrity": "sha512-46ue8ymtm/5PUU6pCvjlic0z82qWkxv54GTJZgHrQUuZnVH+tvvSP0LsozIDsCBFO4VjJ13N68wqrKSeScUKdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.13.0.tgz", + "integrity": "sha512-P5/MqLdLSlqxbeuJ3YDeX37srC8mCflSyTrUsgbU1c/U9j6l2g2GiIdYaGD9QjdMQPMSgYm7hgg0551wHyIluw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.13.0.tgz", + "integrity": "sha512-UKXUQNbO3DOhzLRwHSpa0HnhhCgNODvfoPWv2FCXme8N/ANFfhIPMGuOT+QuKd16+B5yxZ0HdpNlqPvTMS1qfw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@schematics/angular": { + "version": "17.3.2", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-17.3.2.tgz", + "integrity": "sha512-zPINvow0Qo6ionnDl25ZzSSLDyDxBjqRPEJWGHU70expbjXK4A2caQT9P/8ImhapbJAXJCfxg4GF9z1d/sWe4w==", + "dependencies": { + "@angular-devkit/core": "17.3.2", + "@angular-devkit/schematics": "17.3.2", + "jsonc-parser": "3.2.1" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@sigstore/bundle": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-2.2.0.tgz", + "integrity": "sha512-5VI58qgNs76RDrwXNhpmyN/jKpq9evV/7f1XrcqcAfvxDl5SeVY/I5Rmfe96ULAV7/FK5dge9RBKGBJPhL1WsQ==", + "dev": true, + "dependencies": { + "@sigstore/protobuf-specs": "^0.3.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/core": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-1.1.0.tgz", + "integrity": "sha512-JzBqdVIyqm2FRQCulY6nbQzMpJJpSiJ8XXWMhtOX9eKgaXXpfNOF53lzQEjIydlStnd/eFtuC1dW4VYdD93oRg==", + "dev": true, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/protobuf-specs": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.3.0.tgz", + "integrity": "sha512-zxiQ66JFOjVvP9hbhGj/F/qNdsZfkGb/dVXSanNRNuAzMlr4MC95voPUBX8//ZNnmv3uSYzdfR/JSkrgvZTGxA==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/sign": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-2.2.3.tgz", + "integrity": "sha512-LqlA+ffyN02yC7RKszCdMTS6bldZnIodiox+IkT8B2f8oRYXCB3LQ9roXeiEL21m64CVH1wyveYAORfD65WoSw==", + "dev": true, + "dependencies": { + "@sigstore/bundle": "^2.2.0", + "@sigstore/core": "^1.0.0", + "@sigstore/protobuf-specs": "^0.3.0", + "make-fetch-happen": "^13.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/tuf": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-2.3.2.tgz", + "integrity": "sha512-mwbY1VrEGU4CO55t+Kl6I7WZzIl+ysSzEYdA1Nv/FTrl2bkeaPXo5PnWZAVfcY2zSdhOpsUTJW67/M2zHXGn5w==", + "dev": true, + "dependencies": { + "@sigstore/protobuf-specs": "^0.3.0", + "tuf-js": "^2.2.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/verify": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-1.1.1.tgz", + "integrity": "sha512-BNANJms49rw9Q5J+fJjrDqOQSzjXDcOq/pgKDaVdDoIvQwqIfaoUriy+fQfh8sBX04hr4bkkrwu3EbhQqoQH7A==", + "dev": true, + "dependencies": { + "@sigstore/bundle": "^2.2.0", + "@sigstore/core": "^1.1.0", + "@sigstore/protobuf-specs": "^0.3.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@socket.io/component-emitter": { + "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==", + "dev": true + }, + "node_modules/@tufjs/canonical-json": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz", + "integrity": "sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==", + "dev": true, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@tufjs/models": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-2.0.0.tgz", + "integrity": "sha512-c8nj8BaOExmZKO2DXhDfegyhSGcG9E/mPN3U13L+/PsoWm1uaGiHHjxqSHQiasDBQwDA3aHuw9+9spYAP1qvvg==", + "dev": true, + "dependencies": { + "@tufjs/canonical-json": "2.0.0", + "minimatch": "^9.0.3" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@tufjs/models/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@tufjs/models/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "dev": true, + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", + "dev": true, + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", + "dev": true + }, + "node_modules/@types/cors": { + "version": "2.8.17", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", + "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/eslint": { + "version": "8.56.6", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.6.tgz", + "integrity": "sha512-ymwc+qb1XkjT/gfoQwxIeHZ6ixH23A+tCT2ADSA/DPVKzAjwYkTXBMCQ/f6fe4wEa85Lhp26VPeUxI7wMhAi7A==", + "dev": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "dev": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "node_modules/@types/express": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "dev": true, + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.43", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.43.tgz", + "integrity": "sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + "dev": true + }, + "node_modules/@types/http-proxy": { + "version": "1.17.14", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz", + "integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/jasmine": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-5.1.4.tgz", + "integrity": "sha512-px7OMFO/ncXxixDe1zR13V1iycqWae0MxTaw62RpFlksUi5QuNWgQJFkTQjIOvrmutJbI7Fp2Y2N1F6D2R4G6w==", + "dev": true + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.11.30", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.30.tgz", + "integrity": "sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/node-forge": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", + "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/qs": { + "version": "6.9.14", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.14.tgz", + "integrity": "sha512-5khscbd3SwWMhFqylJBLQ0zIu7c1K6Vz0uBIt915BI3zV0q1nfjRQD3RqSBcPaO6PHEF4ov/t9y89fSiyThlPA==", + "dev": true + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true + }, + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "dev": true + }, + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "dev": true, + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-index": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", + "dev": true, + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", + "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", + "dev": true, + "dependencies": { + "@types/http-errors": "*", + "@types/mime": "*", + "@types/node": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/triple-beam": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", + "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==" + }, + "node_modules/@types/ws": { + "version": "8.5.10", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", + "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@vitejs/plugin-basic-ssl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.1.0.tgz", + "integrity": "sha512-wO4Dk/rm8u7RNhOf95ZzcEmC9rYOncYgvq4z3duaJrCgjN8BxAnDVyndanfcJZ0O6XZzHz6Q0hTimxTg8Y9g/A==", + "dev": true, + "engines": { + "node": ">=14.6.0" + }, + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", + "dev": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dev": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.12.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dev": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dev": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "dev": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", + "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-opt": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1", + "@webassemblyjs/wast-printer": "1.12.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", + "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", + "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", + "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", + "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "node_modules/@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true + }, + "node_modules/abbrev": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", + "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "dev": true, + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/adjust-sourcemap-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", + "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", + "dev": true, + "dependencies": { + "loader-utils": "^2.0.0", + "regex-parser": "^2.2.11" + }, + "engines": { + "node": ">=8.9" + } + }, + "node_modules/adjust-sourcemap-loader/node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", + "dev": true, + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "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": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "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/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "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.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "devOptional": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "devOptional": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "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/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true + }, + "node_modules/async": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" + }, + "node_modules/autoprefixer": { + "version": "10.4.18", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.18.tgz", + "integrity": "sha512-1DKbDfsr6KUElM6wg+0zRNkB/Q7WcKYAaK+pzXn+Xqmszm/5Xa9coeNdtP88Vi+dPzZnMjhge8GIV49ZQkDa+g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-lite": "^1.0.30001591", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/babel-loader": { + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", + "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==", + "dev": true, + "dependencies": { + "find-cache-dir": "^4.0.0", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0", + "webpack": ">=5" + } + }, + "node_modules/babel-plugin-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-polyfill-corejs2": { + "version": "0.4.10", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.10.tgz", + "integrity": "sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.6.1", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.9.0.tgz", + "integrity": "sha512-7nZPG1uzK2Ymhy/NbaOWTg3uibM2BmGASS4vHS4szRZAIR8R6GwA/xAujpdrXU5iyklrimWnLWU+BLF9suPTqg==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.5.0", + "core-js-compat": "^3.34.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3/node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz", + "integrity": "sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.5.tgz", + "integrity": "sha512-OJGYZlhLqBh2DDHeqAxWB1XIvr49CxiJ2gIt61/PU55CQK4Z58OzMqjDe1zwQdQk+rBYsRc+1rJmdajM3gimHg==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.5.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator/node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz", + "integrity": "sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "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==", + "dev": true, + "engines": { + "node": "^4.5.0 || >= 5.9" + } + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "dev": true + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "devOptional": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/bonjour-service": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.1.tgz", + "integrity": "sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "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==", + "devOptional": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "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-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/builtins": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", + "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", + "dev": true, + "dependencies": { + "semver": "^7.0.0" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacache": { + "version": "18.0.2", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-18.0.2.tgz", + "integrity": "sha512-r3NU8h/P+4lVUHfeRw1dtgQYar3DZMm4/cm2bZgOvrFC/su7budSOeqh52VJIC4U4iG1WWwV6vRW0znqBvxNuw==", + "dev": true, + "dependencies": { + "@npmcli/fs": "^3.1.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^10.0.1", + "minipass": "^7.0.3", + "minipass-collect": "^2.0.1", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^4.0.0", + "ssri": "^10.0.0", + "tar": "^6.1.11", + "unique-filename": "^3.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/cacache/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/cacache/node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacache/node_modules/lru-cache": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/cacache/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "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/caniuse-lite": { + "version": "1.0.30001600", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001600.tgz", + "integrity": "sha512-+2S9/2JFhYmYaDpZvo0lKkfvuKIglrx68MwOBqMGHhQsNkLjB5xtc/TGoEPs+MxjSyN/72qer2g97nzR641mOQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "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/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "devOptional": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true, + "engines": { + "node": ">=6.0" + } + }, + "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==", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cliui/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/cliui/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/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/color": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", + "dependencies": { + "color-convert": "^1.9.3", + "color-string": "^1.6.0" + } + }, + "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==", + "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==" + }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, + "node_modules/colorspace": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", + "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", + "dependencies": { + "color": "^3.1.3", + "text-hex": "1.0.x" + } + }, + "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/common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", + "dev": true + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "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==", + "dev": true, + "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/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/compression/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/connect/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/connect/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "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==", + "dev": true, + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/copy-anything": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", + "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", + "dev": true, + "dependencies": { + "is-what": "^3.14.1" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/copy-webpack-plugin": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", + "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", + "dev": true, + "dependencies": { + "fast-glob": "^3.2.11", + "glob-parent": "^6.0.1", + "globby": "^13.1.1", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + } + }, + "node_modules/copy-webpack-plugin/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/core-js-compat": { + "version": "3.36.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.36.1.tgz", + "integrity": "sha512-Dk997v9ZCt3X/npqzyGdTlq6t7lDBhZwGvV94PKzDArjp7BTRm7WlDAXYd/OWdeFHO8OChQYRJNJvUCqCbrtKA==", + "dev": true, + "dependencies": { + "browserslist": "^4.23.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dev": true, + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/cosmiconfig/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/cosmiconfig/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/critters": { + "version": "0.0.22", + "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.22.tgz", + "integrity": "sha512-NU7DEcQZM2Dy8XTKFHxtdnIM/drE312j2T4PCVaSUcS0oBeyT/NImpRw/Ap0zOr/1SE7SgPK9tGPg1WK/sVakw==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "css-select": "^5.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.2", + "htmlparser2": "^8.0.2", + "postcss": "^8.4.23", + "postcss-media-query-parser": "^0.2.3" + } + }, + "node_modules/critters/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/critters/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/critters/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/critters/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/critters/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/critters/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/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/cross-spawn/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-loader": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.10.0.tgz", + "integrity": "sha512-LTSA/jWbwdMlk+rhmElbDR2vbtQoTBPr7fkJE+mxrHj+7ru0hUmHafDRzWIjIHTwpitWVaqY2/UWGRca3yUgRw==", + "dev": true, + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.4", + "postcss-modules-scope": "^3.1.1", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, + "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/custom-event": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==", + "dev": true + }, + "node_modules/date-format": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", + "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "dev": true, + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true + }, + "node_modules/di": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==", + "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/dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "dev": true, + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/dom-serialize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ==", + "dev": true, + "dependencies": { + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^2.0.0" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/dommatrix": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/dommatrix/-/dommatrix-1.0.3.tgz", + "integrity": "sha512-l32Xp/TLgWb8ReqbVJAFIvXmY7go4nTxxlWiAFyhoQw9RKEOHBZNnyGvJWqDVSPmq3Y9HlM4npqF/T6VMOXhww==", + "deprecated": "dommatrix is no longer maintained. Please use @thednp/dommatrix." + }, + "node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dev": true, + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "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==", + "dev": true + }, + "node_modules/electron-to-chromium": { + "version": "1.4.717", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.717.tgz", + "integrity": "sha512-6Fmg8QkkumNOwuZ/5mIbMU9WI3H2fmn5ajcVya64I5Yr5CcNmO7vcLt0Y7c96DCiMO5/9G+4sI2r6eEvdg1F7A==", + "dev": true + }, + "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/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/enabled": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", + "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/engine.io": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.4.tgz", + "integrity": "sha512-KdVSDKhVKyOi+r5uEabrDLZw2qXStVvCsEB/LN3mw4WFi6Gx50jTyuxYVCwAAC0U46FdnzP/ScKRBTXb/NiEOg==", + "dev": true, + "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.2.1", + "ws": "~8.11.0" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/engine.io-parser": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.2.tgz", + "integrity": "sha512-RcyUFKA93/CXH20l4SoVvzZfrSDMOTUS3bWVpTt2FuFP+XYrL8i8oonHP7WInRyVHXh0n/ORtoeiE1os+8qkSw==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz", + "integrity": "sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA==", + "dev": true + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "devOptional": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true + }, + "node_modules/errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "optional": true, + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.0.tgz", + "integrity": "sha512-pqrTKmwEIgafsYZAGw9kszYzmagcE/n4dbgwGWLEXg7J4QFJVQRBld8j3Q3GNez79jzxZshq0bcT962QHOghjw==", + "dev": true + }, + "node_modules/esbuild": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.1.tgz", + "integrity": "sha512-OJwEgrpWm/PCMsLVWXKqvcjme3bHNpOgN7Tb6cQnR5n0TPbQx1/Xrn7rqM+wn17bYeT6MGB5sn1Bh5YiGi70nA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.20.1", + "@esbuild/android-arm": "0.20.1", + "@esbuild/android-arm64": "0.20.1", + "@esbuild/android-x64": "0.20.1", + "@esbuild/darwin-arm64": "0.20.1", + "@esbuild/darwin-x64": "0.20.1", + "@esbuild/freebsd-arm64": "0.20.1", + "@esbuild/freebsd-x64": "0.20.1", + "@esbuild/linux-arm": "0.20.1", + "@esbuild/linux-arm64": "0.20.1", + "@esbuild/linux-ia32": "0.20.1", + "@esbuild/linux-loong64": "0.20.1", + "@esbuild/linux-mips64el": "0.20.1", + "@esbuild/linux-ppc64": "0.20.1", + "@esbuild/linux-riscv64": "0.20.1", + "@esbuild/linux-s390x": "0.20.1", + "@esbuild/linux-x64": "0.20.1", + "@esbuild/netbsd-x64": "0.20.1", + "@esbuild/openbsd-x64": "0.20.1", + "@esbuild/sunos-x64": "0.20.1", + "@esbuild/win32-arm64": "0.20.1", + "@esbuild/win32-ia32": "0.20.1", + "@esbuild/win32-x64": "0.20.1" + } + }, + "node_modules/esbuild-wasm": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.20.1.tgz", + "integrity": "sha512-6v/WJubRsjxBbQdz6izgvx7LsVFvVaGmSdwrFHmEzoVgfXL89hkKPoQHsnVI2ngOkcBUQT9kmAM1hVL1k/Av4A==", + "dev": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "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==", + "dev": true + }, + "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==", + "engines": { + "node": ">=0.8.0" + } + }, + "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/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/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/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==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "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/exponential-backoff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", + "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", + "dev": true + }, + "node_modules/express": { + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "dev": true, + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.2", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.6.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "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==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/express/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "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-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fecha": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", + "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==" + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "devOptional": 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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/finalhandler/node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/find-cache-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", + "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", + "dev": true, + "dependencies": { + "common-path-prefix": "^3.0.0", + "pkg-dir": "^7.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-up": { + "version": "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/firebase": { + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/firebase/-/firebase-10.9.0.tgz", + "integrity": "sha512-R8rDU3mg2dq0uPOoZ5Nc3BeZTbXxBPJS8HcZLtnV0f5/YrmpNsHngzmMHRVB+91T+ViJGVL/42dV23gS9w9ccw==", + "dependencies": { + "@firebase/analytics": "0.10.1", + "@firebase/analytics-compat": "0.2.7", + "@firebase/app": "0.9.29", + "@firebase/app-check": "0.8.2", + "@firebase/app-check-compat": "0.3.9", + "@firebase/app-compat": "0.2.29", + "@firebase/app-types": "0.9.0", + "@firebase/auth": "1.6.2", + "@firebase/auth-compat": "0.5.4", + "@firebase/database": "1.0.3", + "@firebase/database-compat": "1.0.3", + "@firebase/firestore": "4.5.0", + "@firebase/firestore-compat": "0.3.27", + "@firebase/functions": "0.11.2", + "@firebase/functions-compat": "0.3.8", + "@firebase/installations": "0.6.5", + "@firebase/installations-compat": "0.2.5", + "@firebase/messaging": "0.12.6", + "@firebase/messaging-compat": "0.2.6", + "@firebase/performance": "0.6.5", + "@firebase/performance-compat": "0.2.5", + "@firebase/remote-config": "0.4.5", + "@firebase/remote-config-compat": "0.2.5", + "@firebase/storage": "0.12.2", + "@firebase/storage-compat": "0.3.5", + "@firebase/util": "1.9.4" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true + }, + "node_modules/fn.name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", + "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" + }, + "node_modules/follow-redirects": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/fs-minipass": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", + "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", + "dev": true, + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/fs-monkey": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.5.tgz", + "integrity": "sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==", + "dev": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/fuzzy": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/fuzzy/-/fuzzy-0.1.3.tgz", + "integrity": "sha512-/gZffu4ykarLrCiP3Ygsa86UAo1E5vEVlvTrpkKywXSbP9Xhln3oSp9QSV57gEq3JFFpGJ4GZ+5zdEp3FcUh4w==", + "engines": { + "node": ">= 0.6.0" + } + }, + "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==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "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-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/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "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": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "devOptional": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "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/globby": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", + "dev": true, + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, + "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.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "dev": true, + "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", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hosted-git-info": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.1.tgz", + "integrity": "sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA==", + "dev": true, + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/html-entities": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz", + "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ] + }, + "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/htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "dev": true + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "dev": true + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-errors/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "dev": true, + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", + "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", + "dev": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "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/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/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/idb": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", + "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==" + }, + "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.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-walk": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.4.tgz", + "integrity": "sha512-t7sv42WkwFkyKbivUCglsQW5YWMskWtbEf4MNKX5u/CCWHKSPzN4FtBQGsQZgCLbxOzpVlcbWVK5KB3auIOjSw==", + "dev": true, + "dependencies": { + "minimatch": "^9.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/ignore-walk/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/ignore-walk/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", + "dev": true, + "optional": true, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/immutable": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz", + "integrity": "sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==", + "dev": true + }, + "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-fresh/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/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==", + "dev": true, + "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": "4.1.2", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.2.tgz", + "integrity": "sha512-AMB1mvwR1pyBFY/nSevUX6y8nJWS63/SzUKD3JyQn97s4xgIdgQPT75IRouIiBAN4yLQBUShNYVW0+UG25daCw==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/inquirer": { + "version": "9.2.15", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.2.15.tgz", + "integrity": "sha512-vI2w4zl/mDluHt9YEQ/543VTCwPKWiHzKtm9dM2V0NdFcqEexDAjUHzO1oA60HRNaVifGXXM1tRRNluLVHa0Kg==", + "dev": true, + "dependencies": { + "@ljharb/through": "^2.3.12", + "ansi-escapes": "^4.3.2", + "chalk": "^5.3.0", + "cli-cursor": "^3.1.0", + "cli-width": "^4.1.0", + "external-editor": "^3.1.0", + "figures": "^3.2.0", + "lodash": "^4.17.21", + "mute-stream": "1.0.0", + "ora": "^5.4.1", + "run-async": "^3.0.0", + "rxjs": "^7.8.1", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/inquirer/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "dev": true, + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/ip-address/node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "dev": true + }, + "node_modules/ipaddr.js": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", + "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", + "dev": true, + "engines": { + "node": ">= 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-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==", + "devOptional": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "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-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "devOptional": 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-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "devOptional": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", + "dev": true + }, + "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==", + "devOptional": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-what": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", + "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", + "dev": true + }, + "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==", + "dev": true + }, + "node_modules/isbinaryfile": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", + "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", + "dev": true, + "engines": { + "node": ">= 8.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "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/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "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-instrument/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "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-lib-source-maps/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jasmine-core": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-5.1.2.tgz", + "integrity": "sha512-2oIUMGn00FdUiqz6epiiJr7xcFyNYj3rDcfmnzfkBnHyBQ3cBQUs4mmyGsOb7TTLb9kxk7dBcmEmqhDKkBoDyA==", + "dev": true + }, + "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/jiti": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", + "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", + "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "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/jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", + "dev": true + }, + "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": "3.0.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.1.tgz", + "integrity": "sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz", + "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==" + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "dev": true, + "engines": [ + "node >= 0.2.0" + ] + }, + "node_modules/karma": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.3.tgz", + "integrity": "sha512-LuucC/RE92tJ8mlCwqEoRWXP38UMAqpnq98vktmS9SznSoUPPUJQbc91dHcxcunROvfQjdORVA/YFviH+Xci9Q==", + "dev": true, + "dependencies": { + "@colors/colors": "1.5.0", + "body-parser": "^1.19.0", + "braces": "^3.0.2", + "chokidar": "^3.5.1", + "connect": "^3.7.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.1", + "glob": "^7.1.7", + "graceful-fs": "^4.2.6", + "http-proxy": "^1.18.1", + "isbinaryfile": "^4.0.8", + "lodash": "^4.17.21", + "log4js": "^6.4.1", + "mime": "^2.5.2", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.5", + "qjobs": "^1.2.0", + "range-parser": "^1.2.1", + "rimraf": "^3.0.2", + "socket.io": "^4.7.2", + "source-map": "^0.6.1", + "tmp": "^0.2.1", + "ua-parser-js": "^0.7.30", + "yargs": "^16.1.1" + }, + "bin": { + "karma": "bin/karma" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/karma-chrome-launcher": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.2.0.tgz", + "integrity": "sha512-rE9RkUPI7I9mAxByQWkGJFXfFD6lE4gC5nPuZdobf/QdTEJI6EU4yIay/cfU/xV4ZxlM5JiTv7zWYgA64NpS5Q==", + "dev": true, + "dependencies": { + "which": "^1.2.1" + } + }, + "node_modules/karma-coverage": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-2.2.1.tgz", + "integrity": "sha512-yj7hbequkQP2qOSb20GuNSIyE//PgJWHwC2IydLE6XRtsnaflv+/OSGNssPjobYUlhVVagy99TQpqUt3vAUG7A==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.2.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.1", + "istanbul-reports": "^3.0.5", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/karma-jasmine": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-5.1.0.tgz", + "integrity": "sha512-i/zQLFrfEpRyQoJF9fsCdTMOF5c2dK7C7OmsuKg2D0YSsuZSfQDiLuaiktbuio6F2wiCsZSnSnieIQ0ant/uzQ==", + "dev": true, + "dependencies": { + "jasmine-core": "^4.1.0" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "karma": "^6.0.0" + } + }, + "node_modules/karma-jasmine-html-reporter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-2.1.0.tgz", + "integrity": "sha512-sPQE1+nlsn6Hwb5t+HHwyy0A1FNCVKuL1192b+XNauMYWThz2kweiBVW1DqloRpVvZIJkIoHVB7XRpK78n1xbQ==", + "dev": true, + "peerDependencies": { + "jasmine-core": "^4.0.0 || ^5.0.0", + "karma": "^6.0.0", + "karma-jasmine": "^5.0.0" + } + }, + "node_modules/karma-jasmine/node_modules/jasmine-core": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-4.6.0.tgz", + "integrity": "sha512-O236+gd0ZXS8YAjFx8xKaJ94/erqUliEkJTDedyE7iHvv4ZVqi+q+8acJxu05/WJDKm512EUNn809In37nWlAQ==", + "dev": true + }, + "node_modules/karma-source-map-support": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz", + "integrity": "sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==", + "dev": true, + "dependencies": { + "source-map-support": "^0.5.5" + } + }, + "node_modules/karma/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/karma/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/karma/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/karma/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/karma/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/karma/node_modules/tmp": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", + "dev": true, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/karma/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/karma/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/karma/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/klona": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/kuler": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", + "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" + }, + "node_modules/launch-editor": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.1.tgz", + "integrity": "sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw==", + "dev": true, + "dependencies": { + "picocolors": "^1.0.0", + "shell-quote": "^1.8.1" + } + }, + "node_modules/less": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/less/-/less-4.2.0.tgz", + "integrity": "sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA==", + "dev": true, + "dependencies": { + "copy-anything": "^2.0.1", + "parse-node-version": "^1.0.1", + "tslib": "^2.3.0" + }, + "bin": { + "lessc": "bin/lessc" + }, + "engines": { + "node": ">=6" + }, + "optionalDependencies": { + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "make-dir": "^2.1.0", + "mime": "^1.4.1", + "needle": "^3.1.0", + "source-map": "~0.6.0" + } + }, + "node_modules/less-loader": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-11.1.0.tgz", + "integrity": "sha512-C+uDBV7kS7W5fJlUjq5mPBeBVhYpTIm5gB09APT9o3n/ILeaXVsiSFTbZpTJCJwQ/Crczfn3DmfQFwxYusWFug==", + "dev": true, + "dependencies": { + "klona": "^2.0.4" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "less": "^3.5.0 || ^4.0.0", + "webpack": "^5.0.0" + } + }, + "node_modules/less/node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "optional": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/less/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "optional": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/less/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "optional": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/less/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/license-webpack-plugin": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-4.0.2.tgz", + "integrity": "sha512-771TFWFD70G1wLTC4oU2Cw4qvtmNrIw+wRvBtn+okgHl7slJVi7zfNcdmqDL72BojM30VNJ2UHylr1o77U37Jw==", + "dev": true, + "dependencies": { + "webpack-sources": "^3.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-sources": { + "optional": true + } + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true, + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", + "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", + "dev": true, + "engines": { + "node": ">= 12.13.0" + } + }, + "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.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", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true + }, + "node_modules/lodash.deburr": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/lodash.deburr/-/lodash.deburr-4.1.0.tgz", + "integrity": "sha512-m/M1U1f3ddMCs6Hq2tAsYThTBDaAKFDX3dwDo97GEYzamXi9SqUpjWi/Rrj/gf3X2n8ktwgZrlP1z6E3v/IExQ==" + }, + "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==", + "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==", + "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==", + "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==", + "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==" + }, + "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==", + "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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/log4js": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz", + "integrity": "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==", + "dev": true, + "dependencies": { + "date-format": "^4.0.14", + "debug": "^4.3.4", + "flatted": "^3.2.7", + "rfdc": "^1.3.0", + "streamroller": "^3.1.5" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/logform": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.6.0.tgz", + "integrity": "sha512-1ulHeNPp6k/LD8H91o7VYFBng5i1BDE7HoKxVbZiGFidS1Rj65qcywLxX+pVfAPoQJEjRdvKcusKwOupHCVOVQ==", + "dependencies": { + "@colors/colors": "1.6.0", + "@types/triple-beam": "^1.3.2", + "fecha": "^4.2.0", + "ms": "^2.1.1", + "safe-stable-stringify": "^2.3.1", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/logform/node_modules/@colors/colors": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", + "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.30.8", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz", + "integrity": "sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-fetch-happen": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.0.tgz", + "integrity": "sha512-7ThobcL8brtGo9CavByQrQi+23aIfgYU++wg4B87AIS8Rb2ZBt/MEaDqzA00Xwv/jUjAjYkLHjVolYuTLKda2A==", + "dev": true, + "dependencies": { + "@npmcli/agent": "^2.0.0", + "cacache": "^18.0.0", + "http-cache-semantics": "^4.1.1", + "is-lambda": "^1.0.1", + "minipass": "^7.0.2", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "ssri": "^10.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", + "dev": true, + "dependencies": { + "fs-monkey": "^1.0.4" + }, + "engines": { + "node": ">= 4.0.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==", + "dev": true + }, + "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==", + "dev": true, + "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/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "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==", + "dev": true, + "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==", + "engines": { + "node": ">=6" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.8.1.tgz", + "integrity": "sha512-/1HDlyFRxWIZPI1ZpgqlZ8jMw/1Dp/dl3P0L1jtZ+zVcHqwPhGwaJwKL00WVgfnBy6PWCde9W65or7IIETImuA==", + "dev": true, + "dependencies": { + "schema-utils": "^4.0.0", + "tapable": "^2.2.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minipass-collect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", + "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", + "dev": true, + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minipass-fetch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", + "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", + "dev": true, + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-flush/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/minipass-json-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", + "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", + "dev": true, + "dependencies": { + "jsonparse": "^1.3.1", + "minipass": "^3.0.0" + } + }, + "node_modules/minipass-json-stream/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-json-stream/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/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "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==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mrmime": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", + "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "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/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "dev": true, + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/mute-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", + "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/needle": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/needle/-/needle-3.3.1.tgz", + "integrity": "sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==", + "dev": true, + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.3", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" + }, + "engines": { + "node": ">= 4.4.x" + } + }, + "node_modules/needle/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/ng2-pdf-viewer": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/ng2-pdf-viewer/-/ng2-pdf-viewer-10.0.0.tgz", + "integrity": "sha512-zEefcAsTpDoxFceQYs3ycPMaUAkt5UX4OcTstVQoNqRK6w+vOY+V8z8aFCuBwnt+7iN1EHaIpquOf4S9mWc04g==", + "dependencies": { + "pdfjs-dist": "~2.16.105", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "pdfjs-dist": "~2.16.105" + } + }, + "node_modules/ngx-extended-pdf-viewer": { + "version": "19.6.6", + "resolved": "https://registry.npmjs.org/ngx-extended-pdf-viewer/-/ngx-extended-pdf-viewer-19.6.6.tgz", + "integrity": "sha512-5W84Am1fitaa9Ieij6huSNyPXmqqxRDAO1i5jSF2HcGgvmQTfXMfz3h6ujcYVI3kvDP2yir3YthpKeODTZlUvQ==", + "dependencies": { + "lodash.deburr": "^4.1.0", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular/common": ">=16.0.0 <18.0.0", + "@angular/core": ">=16.0.0 <18.0.0", + "rxjs": ">=7.0.0" + } + }, + "node_modules/nice-napi": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nice-napi/-/nice-napi-1.0.2.tgz", + "integrity": "sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "!win32" + ], + "dependencies": { + "node-addon-api": "^3.0.0", + "node-gyp-build": "^4.2.2" + } + }, + "node_modules/node-addon-api": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", + "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", + "dev": true, + "optional": true + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "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-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "dev": true, + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-gyp": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-10.1.0.tgz", + "integrity": "sha512-B4J5M1cABxPc5PwfjhbV5hoy2DP9p8lFXASnEN6hugXOa61416tnTZ29x9sSwAd0o99XNIcpvDDy1swAExsVKA==", + "dev": true, + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "glob": "^10.3.10", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^13.0.0", + "nopt": "^7.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^4.0.0" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/node-gyp-build": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.0.tgz", + "integrity": "sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og==", + "dev": true, + "optional": true, + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/node-gyp/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/node-gyp/node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/node-gyp/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/node-gyp/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/node-gyp/node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "dev": true, + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "dev": true + }, + "node_modules/nopt": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.0.tgz", + "integrity": "sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==", + "dev": true, + "dependencies": { + "abbrev": "^2.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/normalize-package-data": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.0.tgz", + "integrity": "sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg==", + "dev": true, + "dependencies": { + "hosted-git-info": "^7.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "devOptional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-bundled": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.0.tgz", + "integrity": "sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==", + "dev": true, + "dependencies": { + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-install-checks": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.3.0.tgz", + "integrity": "sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==", + "dev": true, + "dependencies": { + "semver": "^7.1.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-normalize-package-bin": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", + "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-package-arg": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.1.tgz", + "integrity": "sha512-M7s1BD4NxdAvBKUPqqRW957Xwcl/4Zvo8Aj+ANrzvIPzGJZElrH7Z//rSaec2ORcND6FHHLnZeY8qgTpXDMFQQ==", + "dev": true, + "dependencies": { + "hosted-git-info": "^7.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm-packlist": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-8.0.2.tgz", + "integrity": "sha512-shYrPFIS/JLP4oQmAwDyk5HcyysKW8/JLTEA32S0Z5TzvpaeeX2yMFfoK1fjEBnCBvVyIB/Jj/GBFdm0wsgzbA==", + "dev": true, + "dependencies": { + "ignore-walk": "^6.0.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-pick-manifest": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-9.0.0.tgz", + "integrity": "sha512-VfvRSs/b6n9ol4Qb+bDwNGUXutpy76x6MARw/XssevE0TnctIKcmklJZM5Z7nqs5z5aW+0S63pgCNbpkUNNXBg==", + "dev": true, + "dependencies": { + "npm-install-checks": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "npm-package-arg": "^11.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm-registry-fetch": { + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-16.1.0.tgz", + "integrity": "sha512-PQCELXKt8Azvxnt5Y85GseQDJJlglTFM9L9U9gkv2y4e9s0k3GVDdOx3YoB6gm2Do0hlkzC39iCGXby+Wve1Bw==", + "dev": true, + "dependencies": { + "make-fetch-happen": "^13.0.0", + "minipass": "^7.0.2", + "minipass-fetch": "^3.0.0", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.1.2", + "npm-package-arg": "^11.0.0", + "proc-log": "^3.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.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/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/one-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", + "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", + "dependencies": { + "fn.name": "1.x.x" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "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/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ora/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/ora/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/ora/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/ora/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ora/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "engines": { + "node": ">=0.10.0" + } + }, + "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-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-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "dev": true, + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-retry/node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "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/pacote": { + "version": "17.0.6", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-17.0.6.tgz", + "integrity": "sha512-cJKrW21VRE8vVTRskJo78c/RCvwJCn1f4qgfxL4w77SOWrTCRcmfkYHlHtS0gqpgjv3zhXflRtgsrUCX5xwNnQ==", + "dev": true, + "dependencies": { + "@npmcli/git": "^5.0.0", + "@npmcli/installed-package-contents": "^2.0.1", + "@npmcli/promise-spawn": "^7.0.0", + "@npmcli/run-script": "^7.0.0", + "cacache": "^18.0.0", + "fs-minipass": "^3.0.0", + "minipass": "^7.0.2", + "npm-package-arg": "^11.0.0", + "npm-packlist": "^8.0.0", + "npm-pick-manifest": "^9.0.0", + "npm-registry-fetch": "^16.0.0", + "proc-log": "^3.0.0", + "promise-retry": "^2.0.1", + "read-package-json": "^7.0.0", + "read-package-json-fast": "^3.0.0", + "sigstore": "^2.2.0", + "ssri": "^10.0.0", + "tar": "^6.1.11" + }, + "bin": { + "pacote": "lib/bin.js" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "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-json/node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "devOptional": true, + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-html-rewriting-stream": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-7.0.0.tgz", + "integrity": "sha512-mazCyGWkmCRWDI15Zp+UiCqMp/0dgEmkZRvhlsqqKYr4SsVm/TvnSpD9fCvqCA2zoWJcfRym846ejWBBHRiYEg==", + "dev": true, + "dependencies": { + "entities": "^4.3.0", + "parse5": "^7.0.0", + "parse5-sax-parser": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-sax-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-7.0.0.tgz", + "integrity": "sha512-5A+v2SNsq8T6/mG3ahcz8ZtQ0OUFTatxPbeidoMB7tkJSGDY3tdfl4MHovtLQHkEn5CGxijNWRQHhRQ6IRpXKg==", + "dev": true, + "dependencies": { + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "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==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/path-scurry": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "dev": true, + "dependencies": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "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==", + "dev": true + }, + "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/pdfjs-dist": { + "version": "2.16.105", + "resolved": "https://registry.npmjs.org/pdfjs-dist/-/pdfjs-dist-2.16.105.tgz", + "integrity": "sha512-J4dn41spsAwUxCpEoVf6GVoz908IAA3mYiLmNxg8J9kfRXc2jxpbUepcP0ocp0alVNLFthTAM8DZ1RaHh8sU0A==", + "dependencies": { + "dommatrix": "^1.0.3", + "web-streams-polyfill": "^3.2.1" + }, + "peerDependencies": { + "worker-loader": "^3.0.8" + }, + "peerDependenciesMeta": { + "worker-loader": { + "optional": true + } + } + }, + "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": "4.0.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.1.tgz", + "integrity": "sha512-xUXwsxNjwTQ8K3GnT4pCJm+xq3RUPQbmkYJTP5aFIfNIvbcc/4MUxgBaaRSZJ6yGJZiGSyYlM6MzwTsRk8SYCg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "optional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/piscina": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.4.0.tgz", + "integrity": "sha512-+AQduEJefrOApE4bV7KRmp3N2JnnyErlVqq4P/jmko4FPz9Z877BCccl/iB3FdrWSUkvbGV9Kan/KllJgat3Vg==", + "dev": true, + "optionalDependencies": { + "nice-napi": "^1.0.2" + } + }, + "node_modules/pkg-dir": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", + "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", + "dev": true, + "dependencies": { + "find-up": "^6.3.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "dev": true, + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dev": true, + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/postcss": { + "version": "8.4.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", + "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-loader": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-8.1.1.tgz", + "integrity": "sha512-0IeqyAsG6tYiDRCYKQJLAmgQr47DX6N7sFSWvQxt6AcupX8DIdmykuk/o/tx0Lze3ErGHJEp5OSRxrelC6+NdQ==", + "dev": true, + "dependencies": { + "cosmiconfig": "^9.0.0", + "jiti": "^1.20.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/postcss-media-query-parser": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", + "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==", + "dev": true + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.4.tgz", + "integrity": "sha512-L4QzMnOdVwRm1Qb8m4x8jsZzKAaPAgrUF1r/hjDR2Xj7R+8Zsf97jAlSQzWtKx5YNiNGN8QxmPFIc/sh+RQl+Q==", + "dev": true, + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.1.1.tgz", + "integrity": "sha512-uZgqzdTleelWjzJY+Fhti6F3C9iF1JR/dODLs/JDefozYcKTBCdD8BIl6nNPbTbcLnGrk56hzwZC2DaGNvYjzA==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dev": true, + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.16", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz", + "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==", + "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/proc-log": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", + "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "dev": true + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/protobufjs": { + "version": "7.2.6", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.6.tgz", + "integrity": "sha512-dgJaEDDL6x8ASUZ1YqWciTRrdOuYNzoOf27oHNfdyvKqHr5i0FV7FSLU+aIeFjyFgVxrpTOtQUi0BLLBymZaBw==", + "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/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==", + "dev": true, + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/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==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "dev": true, + "optional": true + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/qjobs": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", + "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", + "dev": true, + "engines": { + "node": ">=0.9" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "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/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/read-package-json": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-7.0.0.tgz", + "integrity": "sha512-uL4Z10OKV4p6vbdvIXB+OzhInYtIozl/VxUBPgNkBuUi2DeRonnuspmaVAMcrkmfjKGNmRndyQAbE7/AmzGwFg==", + "dev": true, + "dependencies": { + "glob": "^10.2.2", + "json-parse-even-better-errors": "^3.0.0", + "normalize-package-data": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/read-package-json-fast": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz", + "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==", + "dev": true, + "dependencies": { + "json-parse-even-better-errors": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-package-json/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/read-package-json/node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/read-package-json/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "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==", + "devOptional": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/readdirp/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "devOptional": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/reflect-metadata": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.1.tgz", + "integrity": "sha512-i5lLI6iw9AU3Uu4szRNPPEkomnkjRTaVt9hy/bn5g/oSzekBSMeLZblcjP74AW0vBabqERLLIrz+gR8QYR54Tw==", + "dev": true + }, + "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.1.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", + "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "dev": true + }, + "node_modules/regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regex-parser": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.3.0.tgz", + "integrity": "sha512-TVILVSz2jY5D47F4mA4MppkBrafEaiUWJO/TcZHEIuI13AqoZMkK1WMA4Om1YkYbTx+9Ki1/tSUXbceyr9saRg==", + "dev": true + }, + "node_modules/regexpu-core": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "dev": true, + "dependencies": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "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/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==", + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "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-url-loader": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz", + "integrity": "sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==", + "dev": true, + "dependencies": { + "adjust-sourcemap-loader": "^4.0.0", + "convert-source-map": "^1.7.0", + "loader-utils": "^2.0.0", + "postcss": "^8.2.14", + "source-map": "0.6.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/resolve-url-loader/node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/resolve-url-loader/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.1.tgz", + "integrity": "sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==", + "dev": true + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.13.0.tgz", + "integrity": "sha512-3YegKemjoQnYKmsBlOHfMLVPPA5xLkQ8MHLLSw/fBrFaVkEayL51DilPpNNLq1exr98F2B1TzrV0FUlN3gWRPg==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.13.0", + "@rollup/rollup-android-arm64": "4.13.0", + "@rollup/rollup-darwin-arm64": "4.13.0", + "@rollup/rollup-darwin-x64": "4.13.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.13.0", + "@rollup/rollup-linux-arm64-gnu": "4.13.0", + "@rollup/rollup-linux-arm64-musl": "4.13.0", + "@rollup/rollup-linux-riscv64-gnu": "4.13.0", + "@rollup/rollup-linux-x64-gnu": "4.13.0", + "@rollup/rollup-linux-x64-musl": "4.13.0", + "@rollup/rollup-win32-arm64-msvc": "4.13.0", + "@rollup/rollup-win32-ia32-msvc": "4.13.0", + "@rollup/rollup-win32-x64-msvc": "4.13.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-async": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", + "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "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/rxfire": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/rxfire/-/rxfire-6.0.5.tgz", + "integrity": "sha512-ycBsANGbya3GNtOBKzZVATLEV+0S9gUrlTfwnN15TCXtgG8OgIMAuv2k9+kMeVaevp/DRp1KT+vYf6Wkop6gvw==", + "peerDependencies": { + "firebase": "^9.0.0 || ^10.0.0", + "rxjs": "^6.0.0 || ^7.0.0" + } + }, + "node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-stable-stringify": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", + "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", + "engines": { + "node": ">=10" + } + }, + "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.71.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.71.1.tgz", + "integrity": "sha512-wovtnV2PxzteLlfNzbgm1tFXPLoZILYAMJtvoXXkD7/+1uP41eKkIt1ypWq5/q2uT94qHjXehEYfmjKOvjL9sg==", + "dev": true, + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-loader": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-14.1.1.tgz", + "integrity": "sha512-QX8AasDg75monlybel38BZ49JP5Z+uSKfKwF2rO7S74BywaRmGQMUBw9dtkS+ekyM/QnP+NOrRYq8ABMZ9G8jw==", + "dev": true, + "dependencies": { + "neo-async": "^2.6.2" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", + "sass": "^1.3.0", + "sass-embedded": "*", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/sax": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", + "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==", + "dev": true, + "optional": true + }, + "node_modules/schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "dev": true + }, + "node_modules/selfsigned": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + "dev": true, + "dependencies": { + "@types/node-forge": "^1.3.0", + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/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/semver/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/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/send/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/send/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==", + "dev": true + }, + "node_modules/send/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "dev": true, + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dev": true, + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "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.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "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/sigstore": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-2.2.2.tgz", + "integrity": "sha512-2A3WvXkQurhuMgORgT60r6pOWiCOO5LlEqY2ADxGBDGVYLSo5HN0uLtb68YpVpuL/Vi8mLTe7+0Dx2Fq8lLqEg==", + "dev": true, + "dependencies": { + "@sigstore/bundle": "^2.2.0", + "@sigstore/core": "^1.0.0", + "@sigstore/protobuf-specs": "^0.3.0", + "@sigstore/sign": "^2.2.3", + "@sigstore/tuf": "^2.3.1", + "@sigstore/verify": "^1.1.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/simple-swizzle/node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + }, + "node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socket.io": { + "version": "4.7.5", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.5.tgz", + "integrity": "sha512-DmeAkF6cwM9jSfmp6Dr/5/mfMwb5Z5qRrSXLpo3Fq5SqyU8CMF15jIN4ZhfSwu35ksM1qmHZDQ/DK5XTccSTvA==", + "dev": true, + "dependencies": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "cors": "~2.8.5", + "debug": "~4.3.2", + "engine.io": "~6.5.2", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/socket.io-adapter": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.4.tgz", + "integrity": "sha512-wDNHGXGewWAjQPt3pyeYBtpWSq9cLE5UW1ZUPL/2eGK9jtse/FpXib7epSTsz0Q0m+6sg6Y4KtcFTlah1bdOVg==", + "dev": true, + "dependencies": { + "debug": "~4.3.4", + "ws": "~8.11.0" + } + }, + "node_modules/socket.io-parser": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", + "dev": true, + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dev": true, + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/socks": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.1.tgz", + "integrity": "sha512-B6w7tkwNid7ToxjZ08rQMT8M9BJAf8DKx8Ft4NivzH0zBUfd6jldGcisJn/RLgxcX3FPNDdNQCUEMMT79b+oCQ==", + "dev": true, + "dependencies": { + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.2.tgz", + "integrity": "sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==", + "dev": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "socks": "^2.7.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/source-map-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-loader": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-5.0.0.tgz", + "integrity": "sha512-k2Dur7CbSLcAH73sBcIkV5xjPV4SzqO1NJ7+XaQl8if3VODDUj3FNchNGpqgJSKbvUfJuhVdv8K2Eu8/TNl2eA==", + "dev": true, + "dependencies": { + "iconv-lite": "^0.6.3", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.72.1" + } + }, + "node_modules/source-map-loader/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true + }, + "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.17", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz", + "integrity": "sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==", + "dev": true + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/ssri": { + "version": "10.0.5", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.5.tgz", + "integrity": "sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==", + "dev": true, + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", + "engines": { + "node": "*" + } + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/streamroller": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.5.tgz", + "integrity": "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==", + "dev": true, + "dependencies": { + "date-format": "^4.0.14", + "debug": "^4.3.4", + "fs-extra": "^8.1.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "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-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "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/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-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/symbol-observable": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", + "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "dev": true, + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/terser": { + "version": "5.29.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.29.1.tgz", + "integrity": "sha512-lZQ/fyaIGxsbGxApKmoPTODIzELy3++mXhS5hOqaAWZjQtpq/hFHAc+rm29NND1rYRxRWKcjuARNwULNXa5RtQ==", + "dev": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.20", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "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/terser-webpack-plugin/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/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-hex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", + "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "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==", + "devOptional": 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==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "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/triple-beam": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", + "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/tuf-js": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-2.2.0.tgz", + "integrity": "sha512-ZSDngmP1z6zw+FIkIBjvOp/II/mIub/O7Pp12j1WNsiCpg5R5wAc//i555bBQsE44O94btLt0xM/Zr2LQjwdCg==", + "dev": true, + "dependencies": { + "@tufjs/models": "2.0.0", + "debug": "^4.3.4", + "make-fetch-happen": "^13.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "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==", + "dev": true, + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typed-assert": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/typed-assert/-/typed-assert-1.0.9.tgz", + "integrity": "sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==", + "dev": true + }, + "node_modules/typescript": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ua-parser-js": { + "version": "0.7.37", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.37.tgz", + "integrity": "sha512-xV8kqRKM+jhMvcHWUKthV9fNebIzrNy//2O9ZwWcfiBFR5f25XVZPLlEajk/sf3Ra15V92isyQqnIEXRDaZWEA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + }, + { + "type": "github", + "url": "https://github.com/sponsors/faisalman" + } + ], + "engines": { + "node": "*" + } + }, + "node_modules/undici": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.7.1.tgz", + "integrity": "sha512-+Wtb9bAQw6HYWzCnxrPTMVEV3Q1QjYanI0E4q02ehReMuquQdLTEFEYbfs7hcImVYKcQkWSwT6buEmSVIiDDtQ==", + "dev": true, + "engines": { + "node": ">=18.0" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, + "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.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" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unique-filename": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", + "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", + "dev": true, + "dependencies": { + "unique-slug": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/unique-slug": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", + "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "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==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "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==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/validate-npm-package-name": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz", + "integrity": "sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==", + "dev": true, + "dependencies": { + "builtins": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.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==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vite": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.1.5.tgz", + "integrity": "sha512-BdN1xh0Of/oQafhU+FvopafUp6WaYenLU/NFoL5WyJL++GxkNfieKzBhM24H3HVsPQrlAqB7iJYTHabzaRed5Q==", + "dev": true, + "dependencies": { + "esbuild": "^0.19.3", + "postcss": "^8.4.35", + "rollup": "^4.2.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/@esbuild/aix-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", + "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", + "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", + "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", + "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", + "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", + "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", + "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", + "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", + "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", + "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", + "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", + "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", + "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", + "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", + "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", + "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", + "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", + "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", + "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", + "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", + "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", + "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", + "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/esbuild": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", + "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.19.12", + "@esbuild/android-arm": "0.19.12", + "@esbuild/android-arm64": "0.19.12", + "@esbuild/android-x64": "0.19.12", + "@esbuild/darwin-arm64": "0.19.12", + "@esbuild/darwin-x64": "0.19.12", + "@esbuild/freebsd-arm64": "0.19.12", + "@esbuild/freebsd-x64": "0.19.12", + "@esbuild/linux-arm": "0.19.12", + "@esbuild/linux-arm64": "0.19.12", + "@esbuild/linux-ia32": "0.19.12", + "@esbuild/linux-loong64": "0.19.12", + "@esbuild/linux-mips64el": "0.19.12", + "@esbuild/linux-ppc64": "0.19.12", + "@esbuild/linux-riscv64": "0.19.12", + "@esbuild/linux-s390x": "0.19.12", + "@esbuild/linux-x64": "0.19.12", + "@esbuild/netbsd-x64": "0.19.12", + "@esbuild/openbsd-x64": "0.19.12", + "@esbuild/sunos-x64": "0.19.12", + "@esbuild/win32-arm64": "0.19.12", + "@esbuild/win32-ia32": "0.19.12", + "@esbuild/win32-x64": "0.19.12" + } + }, + "node_modules/void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dev": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/web-streams-polyfill": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "engines": { + "node": ">= 8" + } + }, + "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/webpack": { + "version": "5.90.3", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.90.3.tgz", + "integrity": "sha512-h6uDYlWCctQRuXBs1oYpVe6sFcWedl0dpcVaTf/YF67J9bKvwJajFulMVSYKHrksMB3I/pIagRzDxwxkebuzKA==", + "dev": true, + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.21.10", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.15.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-middleware": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-6.1.2.tgz", + "integrity": "sha512-Wu+EHmX326YPYUpQLKmKbTyZZJIB8/n6R09pTmB03kJmnMsVPTo9COzHZFr01txwaCAuZvfBJE4ZCHRcKs5JaQ==", + "dev": true, + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.12", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server": { + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz", + "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==", + "dev": true, + "dependencies": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.5", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "launch-editor": "^2.6.0", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.1", + "ws": "^8.13.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/webpack-dev-middleware": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", + "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", + "dev": true, + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-server/node_modules/ws": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", + "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", + "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/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "dev": true, + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack-subresource-integrity": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-5.1.0.tgz", + "integrity": "sha512-sacXoX+xd8r4WKsy9MvH/q/vBtEHr86cpImXwyg74pFIpERKt6FmB8cXpeuh0ZLgclOlHI4Wcll7+R5L02xk9Q==", + "dev": true, + "dependencies": { + "typed-assert": "^1.0.8" + }, + "engines": { + "node": ">= 12" + }, + "peerDependencies": { + "html-webpack-plugin": ">= 5.0.0-beta.1 < 6", + "webpack": "^5.12.0" + }, + "peerDependenciesMeta": { + "html-webpack-plugin": { + "optional": true + } + } + }, + "node_modules/webpack/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/webpack/node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/webpack/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "engines": { + "node": ">=0.8.0" + } + }, + "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/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/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "dev": true + }, + "node_modules/winston": { + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.13.0.tgz", + "integrity": "sha512-rwidmA1w3SE4j0E5MuIufFhyJPBDG7Nu71RkZor1p2+qHvJSZ9GYDA81AyleQcZbh/+V6HjeBdfnTZJm9rSeQQ==", + "dependencies": { + "@colors/colors": "^1.6.0", + "@dabh/diagnostics": "^2.0.2", + "async": "^3.2.3", + "is-stream": "^2.0.0", + "logform": "^2.4.0", + "one-time": "^1.0.0", + "readable-stream": "^3.4.0", + "safe-stable-stringify": "^2.3.1", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.7.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/winston-transport": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.7.0.tgz", + "integrity": "sha512-ajBj65K5I7denzer2IYW6+2bNIVqLGDHqDw3Ow8Ohh+vdW+rv4MZ6eiDvHoKhfJFZ2auyN8byXieDDJ96ViONg==", + "dependencies": { + "logform": "^2.3.2", + "readable-stream": "^3.6.0", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/winston/node_modules/@colors/colors": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", + "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", + "engines": { + "node": ">=0.1.90" + } + }, + "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==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/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-cjs/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-cjs/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/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==", + "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==", + "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==" + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "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/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zone.js": { + "version": "0.14.4", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.14.4.tgz", + "integrity": "sha512-NtTUvIlNELez7Q1DzKVIFZBzNb646boQMgpATo9z3Ftuu/gWvzxCW7jdjcUDoRGxRikrhVHB/zLXh1hxeJawvw==", + "dependencies": { + "tslib": "^2.3.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..c28cd25 --- /dev/null +++ b/package.json @@ -0,0 +1,45 @@ +{ + "name": "dabubble", + "version": "0.0.0", + "scripts": { + "ng": "ng", + "start": "ng serve", + "build": "ng build", + "watch": "ng build --watch --configuration development", + "test": "ng test" + }, + "private": true, + "dependencies": { + "@angular/animations": "^17.2.0", + "@angular/cdk": "^17.3.1", + "@angular/common": "^17.2.0", + "@angular/compiler": "^17.2.0", + "@angular/core": "^17.2.0", + "@angular/fire": "^17.0.1", + "@angular/forms": "^17.2.0", + "@angular/platform-browser": "^17.2.0", + "@angular/platform-browser-dynamic": "^17.2.0", + "@angular/router": "^17.2.0", + "@ctrl/ngx-emoji-mart": "^9.2.0", + "@ngx-translate/core": "^15.0.0", + "@ngx-translate/http-loader": "^8.0.0", + "ng2-pdf-viewer": "^10.0.0", + "ngx-extended-pdf-viewer": "^19.6.6", + "rxjs": "~7.8.0", + "tslib": "^2.3.0", + "zone.js": "~0.14.3" + }, + "devDependencies": { + "@angular-devkit/build-angular": "^17.2.1", + "@angular/cli": "^17.2.1", + "@angular/compiler-cli": "^17.2.0", + "@types/jasmine": "~5.1.0", + "jasmine-core": "~5.1.0", + "karma": "~6.4.0", + "karma-chrome-launcher": "~3.2.0", + "karma-coverage": "~2.2.0", + "karma-jasmine": "~5.1.0", + "karma-jasmine-html-reporter": "~2.1.0", + "typescript": "~5.3.2" + } +} diff --git a/src/app/app.component.html b/src/app/app.component.html new file mode 100644 index 0000000..678b34e --- /dev/null +++ b/src/app/app.component.html @@ -0,0 +1,3 @@ + + + diff --git a/src/app/app.component.scss b/src/app/app.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/app.component.spec.ts b/src/app/app.component.spec.ts new file mode 100644 index 0000000..387cde9 --- /dev/null +++ b/src/app/app.component.spec.ts @@ -0,0 +1,29 @@ +import { TestBed } from '@angular/core/testing'; +import { AppComponent } from './app.component'; + +describe('AppComponent', () => { + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [AppComponent], + }).compileComponents(); + }); + + it('should create the app', () => { + const fixture = TestBed.createComponent(AppComponent); + const app = fixture.componentInstance; + expect(app).toBeTruthy(); + }); + + it(`should have the 'dabubble' title`, () => { + const fixture = TestBed.createComponent(AppComponent); + const app = fixture.componentInstance; + expect(app.title).toEqual('dabubble'); + }); + + it('should render title', () => { + const fixture = TestBed.createComponent(AppComponent); + fixture.detectChanges(); + const compiled = fixture.nativeElement as HTMLElement; + expect(compiled.querySelector('h1')?.textContent).toContain('Hello, dabubble'); + }); +}); diff --git a/src/app/app.component.ts b/src/app/app.component.ts new file mode 100644 index 0000000..f5bc0b9 --- /dev/null +++ b/src/app/app.component.ts @@ -0,0 +1,17 @@ +import { Component } from '@angular/core'; +import { RouterOutlet } from '@angular/router'; +import { UserComponent } from './shared/components/user/user.component'; +import { EditUserDetailsComponent } from './shared/components/header/edit-user/edit-user-details/edit-user-details.component'; +import { ToggleBooleanService } from './service/toggle-boolean.service'; +@Component({ + selector: 'app-root', + standalone: true, + imports: [RouterOutlet, UserComponent, EditUserDetailsComponent], + templateUrl: './app.component.html', + styleUrl: './app.component.scss', +}) +export class AppComponent { + title = 'dabubble'; + + constructor(public toggleAllBooleans:ToggleBooleanService){} +} diff --git a/src/app/app.config.ts b/src/app/app.config.ts new file mode 100644 index 0000000..387c40d --- /dev/null +++ b/src/app/app.config.ts @@ -0,0 +1,38 @@ +import { ApplicationConfig, importProvidersFrom } from '@angular/core'; +import { provideRouter } from '@angular/router'; +import { HttpClientModule, HttpClient } from '@angular/common/http'; +import { routes } from './app.routes'; +import { initializeApp, provideFirebaseApp } from '@angular/fire/app'; +import { getFirestore, provideFirestore } from '@angular/fire/firestore'; +import { provideStorage, getStorage } from '@angular/fire/storage'; +import { provideAnimationsAsync } from '@angular/platform-browser/animations/async'; +import { TranslateModule, TranslateLoader } from '@ngx-translate/core'; +import { TranslateHttpLoader } from '@ngx-translate/http-loader'; +import { firebaseConfig } from './environments/config'; + +export function HttpLoaderFactory(httpClient: HttpClient) { + return new TranslateHttpLoader(httpClient, './assets/i18n/', '.json'); +} + +const translationConfig = { + defaultLanguage: 'de', + loader: { + provide: TranslateLoader, + useFactory: HttpLoaderFactory, + deps: [HttpClient], + }, +}; + +export const appConfig: ApplicationConfig = { + providers: [ + provideRouter(routes), + importProvidersFrom( + HttpClientModule, + provideFirebaseApp(() => initializeApp(firebaseConfig)), + provideFirestore(() => getFirestore()), + provideStorage(() => getStorage()), + TranslateModule.forRoot(translationConfig) + ), + provideAnimationsAsync(), + ], +}; diff --git a/src/app/app.routes.ts b/src/app/app.routes.ts new file mode 100644 index 0000000..0531a2e --- /dev/null +++ b/src/app/app.routes.ts @@ -0,0 +1,22 @@ +import { Routes } from '@angular/router'; +import { MainComponent } from './components/main/main.component'; +import { RegisterComponent } from './components/main-login/register/register.component'; +import { ChooseAvatarComponent } from './components/main-login/choose-avatar/choose-avatar.component'; +import { PasswordForgetComponent } from './components/main-login/password-forget/password-forget.component'; +import { PasswordResetComponent } from './components/main-login/password-reset/password-reset.component'; +import { LoginComponent } from './components/main-login/login/login.component'; +import { ImprintComponent } from './shared/components/imprint/imprint.component'; +import { PrivacyPolicyComponent } from './shared/components/privacy-policy/privacy-policy.component'; + +export const routes: Routes = [ + { path: '', component: MainComponent }, + { path: 'login', component: LoginComponent }, + { path: 'register', component: RegisterComponent }, + { path: 'avatar', component: ChooseAvatarComponent }, + { path: 'passwordForget', component: PasswordForgetComponent }, + { path: 'passwordReset', component: PasswordResetComponent }, + { path: 'main', component: MainComponent }, + { path: 'main/:id', component: MainComponent }, + { path: 'imprint', component: ImprintComponent }, + { path: 'privacy-policy', component: PrivacyPolicyComponent }, +]; diff --git a/src/app/components/main-chat/channel-informations/channel-informations.component.html b/src/app/components/main-chat/channel-informations/channel-informations.component.html new file mode 100644 index 0000000..d8429df --- /dev/null +++ b/src/app/components/main-chat/channel-informations/channel-informations.component.html @@ -0,0 +1,163 @@ + diff --git a/src/app/components/main-chat/channel-informations/channel-informations.component.scss b/src/app/components/main-chat/channel-informations/channel-informations.component.scss new file mode 100644 index 0000000..2896e26 --- /dev/null +++ b/src/app/components/main-chat/channel-informations/channel-informations.component.scss @@ -0,0 +1,317 @@ +@import "./../../../../styles.scss"; + +.menu { + position: absolute; + left: 0; + top: 0; + width: 100vw; + height: 100vh; + background-color: rgba(0, 0, 0, 0.3); + z-index: 5; + .whiteBox { + background-color: #fff; + padding: 24px; + width: 460px; + border-top-right-radius: 40px; + border-bottom-left-radius: 40px; + border-bottom-right-radius: 40px; + position: absolute; + top: 188px; + left: 460px; + height: fit-content; + overflow: none; + } +} + +.headerBox { + display: flex; + justify-content: space-between; + width: 100%; +} + +.headline { + display: flex; + align-items: center; + padding: 6px 12px; + max-width: fit-content; + img { + &:first-child { + width: 24px; + height: 25px; + padding-right: 12px; + } + &:nth-child(2) { + width: 14px; + height: 8px; + } + } + p { + font-size: 24px; + font-weight: 700; + padding-right: 12px; + } +} + +.dieableEdit { + color: rgba(0, 0, 0, 0.5) !important; + cursor: context-menu !important; + &:hover { + font-weight: 400 !important; + } +} + +.closeBtn { + display: flex; + justify-content: center; + align-items: center; + width: 37px; + height: 37px; + cursor: pointer; + &:hover { + background-color: #edeefe; + border-radius: 100%; + img { + width: 15px; + height: 15px; + } + } + img { + width: 13px; + height: 13px; + } +} + +.contentChannel { + margin-top: 12px; + padding: 24px; + border-radius: 40px; + border: 1px solid rgba(0, 0, 0, 0.2); + p { + font-size: 18px; + font-weight: 700; + } + .contentHeadline { + display: flex; + justify-content: space-between; + align-items: center; + span { + font-size: 18px; + font-weight: 400; + color: #545af1; + cursor: pointer; + &:hover { + font-weight: 700; + } + } + } +} + +.channelName { + display: flex; + align-items: center; + margin-top: 18px; + img { + width: 16px; + height: 16px; + padding-right: 12px; + } + p { + font-size: 18px; + font-weight: 400; + } + .inputName { + width: 100%; + border: 1px solid #888dec; + outline: none; + height: 12px; + border-radius: 25px; + padding: 8px; + font-size: large; + } + .textareaDescription { + width: 100%; + padding: 16px; + max-height: 104px; + border-radius: 40px; + border: 1px solid #888dec; + resize: none; + font-size: medium; + scrollbar-width: none; + -ms-overflow-style: none; + outline: none; + } +} + +.channelDescription { + display: flex; + align-items: center; + max-height: 200px; + overflow: auto; + padding-top: 18px; + p { + font-size: 18px; + font-weight: 400; + } +} + +.channelCreator { + margin-top: 24px; + .creatorName { + font-size: 24px; + font-weight: 200; + color: #535af1; + } + .warningPTag { + color: rgba(0, 0, 0, 0.5); + font-weight: 300; + font-size: 14px; + } +} + +.line { + margin: 24px 6px; + border: 1px solid rgba(0, 0, 0, 0.2); +} + +.leaveChannel { + display: flex; + justify-content: right; + align-items: center; + margin-top: 18px; +} + +.leaveChannel button { + padding: 12px 25px; + border-radius: 25px; + font-weight: 400; + font-size: 18px; + color: #fff; + border: 0px; + background-color: #444df2; + cursor: pointer; +} + +.leaveChannel button:disabled { + background-color: #999; + cursor: unset; +} + +.leaveChannel button:hover:not(:disabled) { + filter: opacity(70%); +} + +.disableEdit { + width: 18px; + height: auto; + filter: brightness(0) saturate(100%) invert(59%) sepia(0%) saturate(0%) + hue-rotate(156deg) brightness(93%) contrast(84%); +} + +// MEMBERS + +.contentChannelMembers { + margin-top: 12px; + padding: 24px; + border-radius: 40px; + border: 1px solid rgba(0, 0, 0, 0.2); + p { + font-size: 21px; + font-weight: 700; + } + .contentHeadline { + display: flex; + justify-content: space-between; + align-items: center; + } +} + +.allUsers { + max-height: 400px; + overflow: auto; +} + +.user { + display: flex; + align-items: center; + margin: 6px; + padding: 6px; + max-width: fit-content; + cursor: pointer; + .imgBox { + display: flex; + align-items: flex-end; + .userImg { + width: 50px; + height: 50px; + object-fit: cover; + border-radius: 50%; + } + .onlineIcon { + width: 16px; + height: 16px; + border-radius: 50%; + margin-left: -12px; + } + } + p { + font-size: 18px; + font-weight: 400; + padding: 0 12px 0 18px; + text-align: left; + } + &:hover { + background-color: #edeefe; + border-radius: 36px; + } +} + +/*------------- RESPONSIVE -------------*/ + +@media screen and (max-width: $RESPONSIVE_THRESHOLD) { + .menu { + .whiteBox { + top: 188px; + left: 70px; + } + } +} + +@media screen and (max-width: $RESPONSIVE_THRESHOLD_MOBILE) { + .header { + height: 36px; + padding: 12px; + } + + .headline { + p { + font-size: 20px; + max-width: 180px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + img { + &:first-child { + width: 18px; + height: 19px; + padding-right: 6px; + } + } + } + + .menu { + background-color: unset; + .whiteBox { + position: fixed; + top: 0px; + bottom: 0; + left: 0; + right: 0; + padding: 12px; + border-radius: 0; + width: calc(100% - 24px); + height: calc(100% - 24px); + overflow: auto; + } + } +} diff --git a/src/app/components/main-chat/channel-informations/channel-informations.component.spec.ts b/src/app/components/main-chat/channel-informations/channel-informations.component.spec.ts new file mode 100644 index 0000000..c46c4ab --- /dev/null +++ b/src/app/components/main-chat/channel-informations/channel-informations.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ChannelInformationsComponent } from './channel-informations.component'; + +describe('ChannelInformationsComponent', () => { + let component: ChannelInformationsComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [ChannelInformationsComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(ChannelInformationsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/components/main-chat/channel-informations/channel-informations.component.ts b/src/app/components/main-chat/channel-informations/channel-informations.component.ts new file mode 100644 index 0000000..32965cc --- /dev/null +++ b/src/app/components/main-chat/channel-informations/channel-informations.component.ts @@ -0,0 +1,236 @@ +import { CommonModule } from '@angular/common'; +import { Component, EventEmitter, Input, Output } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { Channel } from '../../../interface/channel.interface'; +import { ChannleService } from '../../../service/channle.service'; +import { UserService } from '../../../service/user.service'; +import { Router } from '@angular/router'; +import { User } from '../../../interface/user.interface'; +import { SharedService } from '../../../service/shared.service'; +import { SmallBtnComponent } from '../../../shared/components/small-btn/small-btn.component'; +import { OpenSendPrvMessageWindowComponent } from '../show-channel-member/open-send-prv-message-window/open-send-prv-message-window.component'; +import { TranslateModule } from '@ngx-translate/core'; + +@Component({ + selector: 'app-channel-informations', + standalone: true, + imports: [ + CommonModule, + FormsModule, + SmallBtnComponent, + OpenSendPrvMessageWindowComponent, + TranslateModule, + ], + templateUrl: './channel-informations.component.html', + styleUrl: './channel-informations.component.scss', +}) +export class ChannelInformationsComponent { + @Input() currentChannel: string = ''; + @Input() viewWidth: number = 0; + @Output() closeEditEmitter: EventEmitter = + new EventEmitter(); + + openEditNameInput: boolean = false; + openEditNameDescription: boolean = false; + nameValue: string = ''; + descriptionValue: string = ''; + getCurrentChannel: Channel[] = []; + openUserWindowBoolean: boolean = false; + user: User[] = []; + + constructor( + private route: Router, + public channelService: ChannleService, + public userService: UserService, + private sharedService: SharedService + ) {} + + RESPONSIVE_THRESHOLD_MOBILE = this.sharedService.RESPONSIVE_THRESHOLD_MOBILE; + + /** + * Closes the menu by emitting a signal to close editing. + */ + showMenu() { + this.closeEditEmitter.emit(true); + } + + /** + * Closes the menu and resets various states. + */ + closeMenu() { + this.closeEditEmitter.emit(false); + this.openEditNameDescription = false; + this.openEditNameInput = false; + this.descriptionValue = ''; + this.nameValue = ''; + this.getCurrentChannel = []; + } + + /** + * Prevents the propagation of an event. + * @param {Event} event - The event to stop propagation. + */ + preventCloseWhiteBox(event: Event) { + event.stopPropagation(); + } + + /** + * Retrieves the channel name based on its ID. + * @param {string} chatId - The ID of the channel. + * @returns {Channel[]} - The filtered channels. + */ + getChannelName(chatId: string) { + const filteredTasks = this.channelService.allChannels.filter( + (channel) => channel.id == chatId + ); + this.getCurrentChannel = filteredTasks; + return filteredTasks; + } + + /** + * Retrieves all channel members based on channel ID. + * @param {string} channelId - The ID of the channel. + * @returns {User[]} - The filtered users. + */ + getAllChannelMembers(channelId: string) { + return this.channelService.allChannels.filter( + (channel) => channel.id === channelId + ); + } + + /** + * Retrieves chat users based on user ID. + * @param {string} userId - The ID of the user. + * @returns {User[]} - The filtered users. + */ + getChatUsers(userId: string) { + return this.userService.allUsers.filter((user) => user.id === userId); + } + + /** + * Retrieves channel members based on channel ID. + * @param {string} chatId - The ID of the channel. + * @returns {User[]} - The filtered users. + */ + getChannelMembers(chatId: string) { + const filteredTasks = this.userService.allUsers.filter( + (user) => user.id == chatId + ); + return filteredTasks; + } + + /** + * Checks if the current user is the creator of the channel. + * @param {string} currentChannel - The ID of the current channel. + * @returns {boolean} - True if the user is the creator, false otherwise. + */ + checkCreator(currentChannel: string) { + const getChannel = this.channelService.allChannels.filter( + (channel) => channel.id == currentChannel + ); + if (getChannel[0].creator === this.userService.getCurrentUserId()) { + return true; + } else { + return false; + } + } + + /** + * Opens a window displaying information about a user. + * @param {User} user - The user to display information about. + */ + openUserWindow(user: User) { + this.user = [user]; + this.openUserWindowBoolean = !this.openUserWindowBoolean; + } + + /** + * Changes the state of the user window. + * @param {boolean} value - The new state of the user window. + */ + changeOpenUserWindowBoolean(value: boolean) { + this.openUserWindowBoolean = value; + } + + /** + * Initiates editing the channel name. + * @param {Event} event - The event that triggered the editing. + */ + editChannelName(event: Event) { + event.stopPropagation(); + this.openEditNameInput = true; + this.nameValue = this.getCurrentChannel[0].name; + } + + /** + * Saves the edited channel name. + * @param {Event} event - The event that triggered the save. + */ + saveEditChannelName(event: Event) { + event.stopPropagation(); + this.openEditNameInput = false; + this.channelService.saveAddedNameOrDescription( + 'channels', + this.currentChannel!, + 'name', + this.nameValue + ); + } + + /** + * Initiates editing the channel description. + * @param {Event} event - The event that triggered the editing. + */ + editChannelDescription(event: Event) { + event.stopPropagation(); + this.openEditNameDescription = true; + this.descriptionValue = this.getCurrentChannel[0].description || ''; + } + + /** + * Saves the edited channel description. + * @param {Event} event - The event that triggered the save. + */ + saveEditChannelDescription(event: Event) { + event.stopPropagation(); + this.openEditNameDescription = false; + this.channelService.saveAddedNameOrDescription( + 'channels', + this.currentChannel!, + 'description', + this.descriptionValue + ); + } + + /** + * Allows the user to leave the channel. + * @param {string} currentChannel - The ID of the current channel. + * @param {Event} event - The event that triggered the action. + */ + leaveChannel(currentChannel: string, event: Event) { + event.stopPropagation(); + const getLogedInUser: string = this.userService.getCurrentUserId(); + const getChannel = this.channelService.allChannels.filter( + (channel) => channel.id == currentChannel + ); + if (getChannel) { + const userIndex = getChannel[0].addedUser.indexOf(getLogedInUser); + if (userIndex !== -1) { + getChannel[0].addedUser.splice(userIndex, 1); + const userArray = getChannel[0].addedUser; + this.channelService.addNewMemberToChannel( + 'channels', + currentChannel, + userArray, + 'leaveChannel' + ); + this.closeEditEmitter.emit(false); + this.route.navigateByUrl(`main`); + } + } + } + + ngOnDestroy() { + this.closeMenu(); + } +} diff --git a/src/app/components/main-chat/chat-content/chat-content.component.html b/src/app/components/main-chat/chat-content/chat-content.component.html new file mode 100644 index 0000000..2335f21 --- /dev/null +++ b/src/app/components/main-chat/chat-content/chat-content.component.html @@ -0,0 +1,39 @@ +
+ @if (!hideContentWindow) { +
+ + @for (chat of getChatChannel(currentChannel); track chat; let i = $index) { + @for (user of getChatUsers(chat.userId); track user) { + @if(!isPublishedToday(chat.publishedTimestamp)) { +
+ +

{{ convertTimestampDate(chat.publishedTimestamp) }}

+ +
+ } +
+ +
+ } } +
+ } + +
diff --git a/src/app/components/main-chat/chat-content/chat-content.component.scss b/src/app/components/main-chat/chat-content/chat-content.component.scss new file mode 100644 index 0000000..7c08158 --- /dev/null +++ b/src/app/components/main-chat/chat-content/chat-content.component.scss @@ -0,0 +1,73 @@ +@import "../../../../styles.scss"; + +section { + display: flex; + flex-direction: column; + justify-content: end; + height: calc(100vh - 210px); + position: relative; +} + +.privatChatHeight { + height: calc(100vh - 230px); +} + +.searchChatHeight { + margin-top: 64px; + height: calc(100vh - 274px); +} + +.mirror { + transform: scaleX(-1); +} + +.content { + overflow-y: auto; +} + +.line { + display: flex; + justify-content: space-between; + align-items: center; + margin: 26px 0; + .lines { + width: 100%; + height: 1px; + background-color: #adb0d9; + } + p { + text-align: center; + white-space: nowrap; + font-size: 18px; + font-weight: 400; + border: 1px solid #adb0d9; + padding: 6px 12px; + border-radius: 24px; + } +} + +//----------- responsive --------------- + +@media screen and (max-width: $RESPONSIVE_THRESHOLD_MOBILE) { + section { + height: calc(100vh - 144px); + } + + .privatChatHeight { + height: calc(100vh - 158px); + } + + .searchChatHeight { + margin-top: 88px; + height: calc(100vh - 188px); + } +} + +@media screen and (max-width: 380px) { + section { + height: calc(100vh - 144px); + } + .privatChatHeight { + height: calc(100vh - 158px); + } +} diff --git a/src/app/components/main-chat/chat-content/chat-content.component.spec.ts b/src/app/components/main-chat/chat-content/chat-content.component.spec.ts new file mode 100644 index 0000000..6168e68 --- /dev/null +++ b/src/app/components/main-chat/chat-content/chat-content.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ChatContentComponent } from './chat-content.component'; + +describe('ChatContentComponent', () => { + let component: ChatContentComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [ChatContentComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(ChatContentComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/components/main-chat/chat-content/chat-content.component.ts b/src/app/components/main-chat/chat-content/chat-content.component.ts new file mode 100644 index 0000000..80d2488 --- /dev/null +++ b/src/app/components/main-chat/chat-content/chat-content.component.ts @@ -0,0 +1,179 @@ +import { + AfterViewChecked, + AfterViewInit, + Component, + ElementRef, + Input, + Renderer2, + ViewChild, +} from '@angular/core'; +import { MainChatComponent } from '../main-chat.component'; +import { ChatService } from '../../../service/chat.service'; +import { UserService } from '../../../service/user.service'; +import { SingleChatComponent } from '../single-chat/single-chat.component'; +import { ChatMsgBoxComponent } from '../chat-msg-box/chat-msg-box.component'; +import { CommonModule } from '@angular/common'; +import { DownloadFilesService } from '../../../service/download-files.service'; +import { ChannleService } from '../../../service/channle.service'; +import { InfoComponent } from '../info/info.component'; + +@Component({ + selector: 'app-chat-content', + standalone: true, + imports: [ + MainChatComponent, + SingleChatComponent, + ChatMsgBoxComponent, + CommonModule, + InfoComponent, + ], + templateUrl: './chat-content.component.html', + styleUrl: './chat-content.component.scss', +}) +export class ChatContentComponent implements AfterViewInit, AfterViewChecked { + @Input() currentChannel: string = ''; + @Input() isPrivatChannel: boolean = false; + @Input() isSearchChannel: boolean = false; + @Input() hideContentWindow: boolean = false; + @Input() viewWidth: number = 0; + @Input() getChatChannel!: (currentChannel: string) => any; + @Input() getChatUsers!: (currentChannel: string) => any; + @ViewChild('messageBody') messageBody: ElementRef | undefined; + filesLoaded: boolean = false; + isNewMessage: boolean = false; + + constructor( + private chatService: ChatService, + private userService: UserService, + public channelService: ChannleService, + private downloadFilesService: DownloadFilesService, + private renderer: Renderer2 + ) {} + + ngAfterViewInit() { + this.scrollToBottom(); + this.checkIfLoadedFirebaseFiles(); + } + + ngAfterViewChecked() { + if (this.filesLoaded) { + this.scrollToBottom(); + this.filesLoaded = false; + } + } + + /** + * Updates the state of isNewMessage and optionally scrolls to the bottom. + * @param {boolean} variable - The new value for isNewMessage. + */ + editMsgEmitter(variable: boolean) { + this.isNewMessage = variable; + if (this.isNewMessage) { + this.scrollToBottom(); + } + } + + /** + * Checks whether Firebase files have been loaded from the server + */ + checkIfLoadedFirebaseFiles() { + this.downloadFilesService.downloadedFiles.subscribe((files) => { + if (files.length > 0) { + this.filesLoaded = true; + } + }); + } + + /** + * Scrolls to the bottom of the message body element. + */ + scrollToBottom(): void { + if (this.messageBody) { + const element = this.messageBody.nativeElement; + this.renderer.setProperty( + element, + 'scrollTop', + element.scrollHeight - element.clientHeight + ); + } + } + + /** + * Checks whether multiple chats have been posted for the date + * @param {number} timestamp - The timestamp to be checked. + * @returns {boolean} - Returns true or false. + */ + isPublishedToday(timestamp: number) { + return this.getAllChatsOnTheDate(this.currentChannel, timestamp).includes( + timestamp + ); + } + + /** + * Retrieves timestamps of all chats posted on a specific date in a given channel. + * @param {string} currentChannel - The current channel ID. + * @param {number} timestamp - The timestamp representing the date. + * @returns {number[]} An array of timestamps of messages. + */ + getAllChatsOnTheDate(currentChannel: string, timestamp: number) { + const todayDate = new Date(timestamp * 1000); + const todayTimestamps = this.chatService.allChats + .filter((chat) => chat.channelId === currentChannel) + .filter((chat) => { + const chatDate = new Date(chat.publishedTimestamp * 1000); + return ( + chatDate.getFullYear() === todayDate.getFullYear() && + chatDate.getMonth() === todayDate.getMonth() && + chatDate.getDate() === todayDate.getDate() + ); + }) + .map((chat) => chat.publishedTimestamp); + + todayTimestamps.shift(); + return todayTimestamps; + } + + /** + * Converts a timestamp to a formatted date string. + * @param {number} timestamp - The timestamp to convert. + * @returns {string} The formatted date string. + */ + convertTimestampDate(timestamp: number) { + const currentDate = new Date(); + const inputDate = new Date(timestamp * 1000); + + const days = [ + 'Sunday', + 'Monday', + 'Tuesday', + 'Wednesday', + 'Thursday', + 'Friday', + 'Saturday', + ]; + const months = [ + 'Jan.', + 'Feb.', + 'Mar.', + 'Apr.', + 'May.', + 'Jun.', + 'Jul.', + 'Aug.', + 'Sep.', + 'Oct.', + 'Nov.', + 'Dec.', + ]; + + const dayNumber = inputDate.getDate(); + const day = days[inputDate.getDay()]; + const month = months[inputDate.getMonth()]; + + if (inputDate.toDateString() === currentDate.toDateString()) { + return `Today`; + } else { + return `${day}, ${dayNumber} ${month}`; + } + } +} diff --git a/src/app/components/main-chat/chat-msg-box/chat-msg-box.component.html b/src/app/components/main-chat/chat-msg-box/chat-msg-box.component.html new file mode 100644 index 0000000..e87d820 --- /dev/null +++ b/src/app/components/main-chat/chat-msg-box/chat-msg-box.component.html @@ -0,0 +1,132 @@ +
+
+ @if(hasFile){ +
+ + +
+ } + +
+ +
+
+ + + + @if (target == 'chats') { + +
+ @if (toggleBoolean.selectUserInMsgBox) { +
+ @for(user of userService.getFiltertUsers; track user){ +
+
+ + +
+

{{ user.firstName }} {{ user.lastName }}

+
+ } +
+ } +
+ } @if(downloadFilesService.uploadFiles.length >= 1){ +

+ {{ "channel-msg-box.text" | translate }} +

+ } +
+ @if(textArea == ''){ + + } @else { + + } + + @if (openSmallWindow) { +
+ @if (showChannels) { @for (i of checkIfUserHasAccessToChannel(); track + $index) { +

{{ i.name }}

+ } }@else if (showUsers) { @for (i of userService.allUsers; track $index) { +
+
+ + +
+

{{ i.firstName }} {{ i.lastName }}

+
+ } } +
+ } +
+ @if (isEmojiPickerVisible) { + + } +
diff --git a/src/app/components/main-chat/chat-msg-box/chat-msg-box.component.scss b/src/app/components/main-chat/chat-msg-box/chat-msg-box.component.scss new file mode 100644 index 0000000..3a4c8fa --- /dev/null +++ b/src/app/components/main-chat/chat-msg-box/chat-msg-box.component.scss @@ -0,0 +1,241 @@ +@import "../../../../styles.scss"; + +section { + width: auto; + margin: 24px; + padding: 24px; + padding-bottom: 54px; + height: 95px; + border-radius: 40px; + border: 1px solid rgba(0, 0, 0, 0.2); + margin-top: 12px; + background-color: #fff; + position: relative; + > textarea { + width: 100%; + height: 100%; + cursor: pointer; + border: none; + outline: none; + resize: none; + font-family: "Nunito"; + font-size: large; + input { + position: absolute; + top: 0; + left: 0; + background-color: rgb(236, 236, 236); + width: 10px; + height: 10px; + } + } + .positionAllIcons { + @include displayFlex($j: space-between); + .positionSpecialIcons { + @include displayFlex($j: space-between, $g: 3px); + } + } + .sendIcon { + padding: 6px; + cursor: pointer; + transform: 0.3 ease-in-out; + &:hover { + scale: 1.1; + filter: brightness(0) saturate(100%) invert(56%) sepia(97%) + saturate(1270%) hue-rotate(204deg) brightness(95%) contrast(94%); + } + } +} + +.sendIconDisabled{ + padding: 6px; + transform: 0.3 ease-in-out; + filter: brightness(0) saturate(100%) invert(78%) sepia(4%) saturate(4098%) hue-rotate(207deg) brightness(99%) contrast(98%); +} + +.verticalLine { + height: 28px; + padding: 6px; +} + +app-small-btn { + padding: 6px 3px; +} + +.fileBox { + border: 1px solid #e5e5e5; + border-radius: 10px; + padding: 5px 10px; + background-color: #eee; + max-width: 40px; + max-height: 20px; + margin-right: 12px; + position: relative; + @include displayFlex(); + .fileIcons { + margin-left: 12px; + margin-right: 12px; + cursor: pointer; + } +} + +app-emoji-picker { + position: absolute; + bottom: 50px; + left: 80px; + z-index: 3; +} + +.posiotionDataFromPc { + margin-top: -40px; + display: flex; + width: 60px; +} + +.closeIcon { + position: absolute; + top: -4px; + right: -4px; + width: 12px; + object-fit: contain; + cursor: pointer; + transition: 0.3s ease-in-out; + &:hover { + background-color: red; + border-radius: 50%; + } +} + +.smileysBackground { + position: absolute; + left: 0; + top: 0; + width: 100vw; + height: 100vh; +} + +.showWanrningNotice { + animation: shwoWN 0.3s ease-in-out; +} + +@keyframes shwoWN { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +.positionOfAllUsersInBox { + position: absolute; + bottom: 36px; + @include displayFlex($j: flex-start, $a: flex-start); + flex-direction: column; + height: 210px; + overflow: auto; + width: 240px; + background-color: #fff; + border: 1px solid #745dda; + border-radius: 25px; + border-bottom-left-radius: 0; + scrollbar-width: none; + -ms-overflow-style: none; + padding: 8px; + .user { + @include displayFlex($g: 12px); + padding: 6px; + cursor: pointer; + transition: 0.2s ease-in-out; + + &:hover { + background-color: #edeefe; + border-radius: 25px; + } + + .positionImgs { + @include displayFlex($a: flex-end); + + .avatarImg { + width: 40px; + height: 40px; + object-fit: cover; + border-radius: 50%; + } + + .onlineIcon { + width: 12px; + height: 12px; + margin-left: -10px; + } + } + } +} + +.addUserBox { + display: flex; +} + +.warningMessage{ + color: red; +} + +.filteredElementWindow2 { + z-index: 1; + max-height: 240px; + overflow: auto; + scrollbar-width: none; + position: absolute; + bottom: 100%; + left: 100px; + border-radius: 25px; + border-bottom-left-radius: 0; + border: 1px solid #888dec; + background-color: #ffffff; + padding: 8px; + box-shadow: rgba(50, 50, 93, 0.25) 0px 13px 27px -5px, + rgba(0, 0, 0, 0.3) 0px 8px 16px -8px; + display: flex; + align-items: flex-start; + flex-direction: column; + .user2 { + @include displayFlex($j: flex-start); + padding: 6px; + margin-bottom: 6px; + cursor: pointer; + transition: 0.2s ease-in-out; + &:hover { + background-color: #edeefe; + border-radius: 25px; + } + .positionImgs2 { + @include displayFlex($a: flex-end); + .avatarImg2 { + width: 40px; + height: 40px; + object-fit: cover; + border-radius: 50%; + } + .onlineIconFilterWindow { + height: 12px; + width: 12px; + margin-left: -10px; + margin-right: 8px; + } + } + } +} + +//----------- responsive --------------- + +@media screen and (max-width: $RESPONSIVE_THRESHOLD_MOBILE) { + section { + height: 50px; + padding-bottom: 54px; + margin: 12px; + } + + .warningMessage{ + font-size: 12px; + } +} diff --git a/src/app/components/main-chat/chat-msg-box/chat-msg-box.component.spec.ts b/src/app/components/main-chat/chat-msg-box/chat-msg-box.component.spec.ts new file mode 100644 index 0000000..5806df7 --- /dev/null +++ b/src/app/components/main-chat/chat-msg-box/chat-msg-box.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ChatMsgBoxComponent } from './chat-msg-box.component'; + +describe('ChatMsgBoxComponent', () => { + let component: ChatMsgBoxComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [ChatMsgBoxComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(ChatMsgBoxComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/components/main-chat/chat-msg-box/chat-msg-box.component.ts b/src/app/components/main-chat/chat-msg-box/chat-msg-box.component.ts new file mode 100644 index 0000000..cf55b05 --- /dev/null +++ b/src/app/components/main-chat/chat-msg-box/chat-msg-box.component.ts @@ -0,0 +1,358 @@ +import { CommonModule } from '@angular/common'; +import { + Component, + ElementRef, + EventEmitter, + Input, + Output, + ViewChild, +} from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { PickerComponent } from '@ctrl/ngx-emoji-mart'; +import { Firestore, addDoc, collection } from '@angular/fire/firestore'; +import { DownloadFilesService } from '../../../service/download-files.service'; +import { UserService } from '../../../service/user.service'; +import { EmojiPickerComponent } from '../../../shared/components/emoji-picker/emoji-picker.component'; +import { SmallBtnComponent } from '../../../shared/components/small-btn/small-btn.component'; +import { ChatService } from '../../../service/chat.service'; +import { Router } from '@angular/router'; +import { ChannleService } from '../../../service/channle.service'; +import { ToggleBooleanService } from '../../../service/toggle-boolean.service'; +import { User } from '../../../interface/user.interface'; +import { MessageData } from '../../../interface/chat.interface'; +import { TranslateModule } from '@ngx-translate/core'; +import { Channel } from '../../../interface/channel.interface'; + +@Component({ + selector: 'app-chat-msg-box', + standalone: true, + imports: [ + CommonModule, + FormsModule, + PickerComponent, + EmojiPickerComponent, + SmallBtnComponent, + TranslateModule, + ], + templateUrl: './chat-msg-box.component.html', + styleUrl: './chat-msg-box.component.scss', +}) +export class ChatMsgBoxComponent { + @Input() currentChannel: string = ''; + @Input() target: string = ''; + @Output() newMsgEmitter: EventEmitter = new EventEmitter(); + @ViewChild('textarea') textAreaRef!: ElementRef; + + hasFile: boolean = false; + currentFiles!: FileList; + files: any; + getFileIcons = [ + './assets/img/documentIcon.svg', + './assets/img/imgIcon.svg', + './assets/img/mp3Icon.svg', + './assets/img/pdfIcon.svg', + './assets/img/videoIcon.svg', + ]; + textArea: string = ''; + isEmojiPickerVisible: boolean | undefined; + currentChatValue: string = ''; + showTargetMember: boolean = true; + showChannels: boolean = false; + showUsers: boolean = false; + openSmallWindow: boolean = false; + + constructor( + private route: Router, + public downloadFilesService: DownloadFilesService, + private firestore: Firestore, + public userService: UserService, + private chatService: ChatService, + public channelService: ChannleService, + public toggleBoolean: ToggleBooleanService + ) {} + + /** + * Handles the output from the emoji picker. + * @param $event The selected emoji. + */ + emojiOutputEmitter($event: any) { + this.addEmoji($event); + } + + /** + * Select Textarea at onload. + */ + ngAfterViewInit() { + this.textAreaRef.nativeElement.select(); + } + + /** + * Handles file input change event. + * @param event The file change event. + */ + onFileChange(event: any) { + if (this.downloadFilesService.uploadFiles.length < 1) { + this.currentFiles = event.target.files; + this.hasFile = this.currentFiles!.length > 0; + if (this.currentFiles) { + for (let i = 0; i < this.currentFiles.length; i++) { + const fileInfo = this.currentFiles[i]; + this.downloadFilesService.uploadFiles.push(fileInfo); + } + } + } + } + + /** + * Checks the file type and returns the corresponding icon. + * @param fileInfo The file object. + * @returns The file icon path. + */ + checkIcon(fileInfo: any) { + if (fileInfo.type == 'audio/mpeg') { + return this.getFileIcons[2]; + } else if (fileInfo.type == 'image/jpeg') { + return this.getFileIcons[1]; + } else if (fileInfo.type == 'application/pdf') { + return this.getFileIcons[3]; + } else if (fileInfo.type == 'video/mp4') { + return this.getFileIcons[4]; + } else { + return this.getFileIcons[0]; + } + } + + /** + * Deletes the selected file. + * @param file The file to be deleted. + */ + deleteFile(file: File) { + const index = this.downloadFilesService.uploadFiles.indexOf(file); + if (index !== -1) { + this.downloadFilesService.uploadFiles.splice(index, 1); + this.hasFile = this.downloadFilesService.uploadFiles.length > 0; + } + } + + /** + * Opens the selected file in a new tab. + * @param file The file to be opened. + */ + showCurrentFile(file: File) { + const blob = new Blob([file], { type: file.type }); + const url = URL.createObjectURL(blob); + window.open(url, '_blank'); + } + + /** + * Adds the selected emoji to the message text area. + * @param event The selected emoji. + */ + public addEmoji(event: any) { + this.textArea = `${this.textArea}${event}`; + this.isEmojiPickerVisible = false; + } + + /** + * Toggles the visibility of the emoji picker. + */ + toggleEmojiPicker() { + this.isEmojiPickerVisible = !this.isEmojiPickerVisible; + } + + /** + * Displays the list of target chat users. + * @param event The event object. + */ + targetChatUser(event: Event) { + event.stopPropagation(); + this.toggleBoolean.selectUserInMsgBox = true; + } + + /** + * Appends the selected user's name to the message text area. + * @param user The selected user. + */ + chooseUser(user: User) { + const userName = ` @${user.firstName} ${user.lastName} `; + + this.textArea += userName; + this.toggleBoolean.selectUserInMsgBox = false; + } + + /** + * Sends a message when Enter key is pressed. + * @param e The keyboard event. + */ + sendMessageWithEnter(e: KeyboardEvent) { + if (this.textArea.trim() !== '') { + if (e.keyCode === 13) { + this.sendMessage(); + } + } + } + + /** + * Sends the message to the target channel. + */ + async sendMessage() { + if (this.currentChannel && this.textArea.trim() !== '') { + const messageRef = collection(this.firestore, this.target); + const messageData = this.checkCollection(this.target); + if (messageData) { + await addDoc(messageRef, messageData) + .then((docRef) => { + this.downloadFilesService.loadAllFiles(docRef.id); + }) + .catch((error) => { + console.error('Error adding document: ', error); + }); + } else { + console.error('Invalid target:', this.target); + } + } + this.forwardToChannel(); + this.resetValues(); + this.newMsgEmitter.emit(true); + } + + /** + * Checks the target collection and returns the message data. + * @param target The target collection. + * @returns The message data. + */ + checkCollection(target: string): MessageData | null { + let messageData: Partial = { + message: this.textArea, + publishedTimestamp: Math.floor(Date.now() / 1000), + userId: this.userService.getCurrentUserId(), + edited: false, + }; + + if (target === 'chats') { + messageData.channelId = this.checkChannelId(); + } else if (target === 'chat-answers') { + messageData.chatId = this.checkChatId(); + } else { + console.error('Invalid target:', target); + return null; + } + return messageData as MessageData; + } + + /** + * Checks + * the channel ID based on the chat service. + * @returns The channel ID. + */ + checkChannelId() { + if (this.chatService.getChannelId) { + return this.chatService.getChannelId; + } else if (this.chatService.getPrvChatId) { + return this.chatService.getPrvChatId; + } else if ( + this.currentChannel === 'searchBar' && + this.chatService.inputValue === '' + ) { + return ''; + } + return this.currentChannel; + } + + /** + * Checks the chat ID based on the chat service. + * @returns The chat ID. + */ + checkChatId() { + if (this.chatService.isSecondaryChatId) { + return this.chatService.isSecondaryChatId; + } + return; + } + + /** + * Navigates to the target channel after sending the message. + */ + forwardToChannel() { + if (this.chatService.getChannelId || this.chatService.getPrvChatId) { + this.route.navigateByUrl(`/main/${this.checkChannelId()}`); + } + } + + /** + * Close popups by leaving with the mouse the chat-msg-box. + */ + mouseLeave() { + this.isEmojiPickerVisible = false; + this.toggleBoolean.selectUserInMsgBox = false; + this.openSmallWindow = false; + this.showChannels = false; + this.showUsers = false; + } + + /** + * Open channels or user window by pressing @ or #. + */ + checkChannelAndUser(e: KeyboardEvent) { + if (e.key === '#') { + this.openSmallWindow = true; + this.showChannels = true; + this.showUsers = false; + } else if (e.key === '@') { + this.openSmallWindow = true; + this.showChannels = false; + this.showUsers = true; + } + if (e.key === 'Backspace') { + this.openSmallWindow = false; + this.showChannels = false; + this.showUsers = false; + } + } + + /** + * Checks if the current user has access to any channels. + * @returns {Channel[]} Array of Channel objects that the user has access to. + */ + checkIfUserHasAccessToChannel() { + const isUserAChannelMember = this.channelService.allChannels.some( + (channel) => + channel.addedUser.includes(this.userService.getCurrentUserId()) + ); + + if (isUserAChannelMember) { + return this.channelService.allChannels.filter((channel) => + channel.addedUser.includes(this.userService.getCurrentUserId()) + ); + } + return []; + } + + /** + * Chooses an element and performs necessary actions based on its type. + * @param {Channel | User} element - The element to choose. + */ + chooseElement(element: Channel | User) { + if ('firstName' in element) { + this.textArea += `${element.firstName} ${element.lastName} `; + } else { + this.textArea += `${element.name} `; + } + this.showUsers = false; + this.showChannels = false; + this.openSmallWindow = false; + this.textAreaRef.nativeElement.focus(); + } + + /** + * Resets input values after sending the message. + */ + resetValues() { + this.textArea = ''; + this.downloadFilesService.uploadFiles = []; + this.hasFile = false; + this.chatService.inputValue = ''; + this.chatService.getChannelId = ''; + this.chatService.getPrvChatId = ''; + } +} diff --git a/src/app/components/main-chat/info/info.component.html b/src/app/components/main-chat/info/info.component.html new file mode 100644 index 0000000..c2ffbb2 --- /dev/null +++ b/src/app/components/main-chat/info/info.component.html @@ -0,0 +1,75 @@ +
+ + @if (getChannel(currentChannel).length > 0) { +
# {{ getChannel(currentChannel)[0].name }}
+

+ {{ "info.channelCreate" | translate }} + @if(getChannel(currentChannel)[0].creator == "Admin") { Admin } @else { @for + (user of getChatUsers(getChannel(currentChannel)[0].creator); track user) { + {{ user.firstName }} + {{ user.lastName }} + } } {{ "info.channelCreate2" | translate }} + {{ timeConverter(getChannel(currentChannel)[0].createdDate) + }}{{ "info.channelCreate3" | translate }} + #{{ getChannel(currentChannel)[0].name }}. +

+ + } @if (getPrivatChannel(currentChannel).length > 0) { + + @if (getPrivatChannel(currentChannel)[0].talkToUserId == + userService.getCurrentUserId() && + getPrivatChannel(currentChannel)[0].creatorId == + userService.getCurrentUserId()) { +
+ @for (user of getChatUsers(getPrivatChannel(currentChannel)[0].creatorId); + track user) { +
+ +
+

{{ user.firstName }} {{ user.lastName }} (Du)

+ } +
+

+ {{ "info.notice" | translate }} +

+ } @else { + + @if (getPrivatChannel(currentChannel)[0].talkToUserId == + userService.getCurrentUserId()) { +
+ @for (user of getChatUsers(getPrivatChannel(currentChannel)[0].creatorId); + track user) { +
+ +
+

{{ user.firstName }} {{ user.lastName }}

+ } +
+

+ {{ "info.talkTo" | translate }} @for (user of + getChatUsers(getPrivatChannel(currentChannel)[0].creatorId); track user) { + @{{ user.firstName }}{{ user.lastName }} + } {{ "info.talkTo2" | translate }} +

+ } @else { + +
+ @for (user of + getChatUsers(getPrivatChannel(currentChannel)[0].talkToUserId); track user) + { +
+ +
+

{{ user.firstName }} {{ user.lastName }}

+ } +
+

+ {{ "info.talkTo" | translate }} @for (user of + getChatUsers(getPrivatChannel(currentChannel)[0].talkToUserId); track user) + { + @{{ user.firstName }} {{ user.lastName }} + } {{ "info.talkTo2" | translate }} +

+ } } } +
diff --git a/src/app/components/main-chat/info/info.component.scss b/src/app/components/main-chat/info/info.component.scss new file mode 100644 index 0000000..f1b9e37 --- /dev/null +++ b/src/app/components/main-chat/info/info.component.scss @@ -0,0 +1,70 @@ +@import "../../../../styles.scss"; + +section { + padding: 32px 48px; +} + +.headline { + font-size: 24px; + font-weight: 700; + padding-bottom: 12px; +} + +p { + font-size: 20px; + font-weight: 400; +} + +span { + color: #535af1; +} + +.headlinePrvChat { + display: flex; + align-items: center; + padding-bottom: 12px; + max-width: fit-content; + .imgBoxPrvChat { + display: flex; + margin-right: 16px; + .imgUserPrvChat { + width: 56px; + height: 56px; + object-fit: cover; + border-radius: 50%; + } + } + p { + font-size: 24px; + font-weight: 700; + } +} + +/*------------- RESPONSIVE -------------*/ + +@media screen and (max-width: $RESPONSIVE_THRESHOLD_MOBILE) { + section { + padding: 12px; + } + + .headline { + font-size: 20px; + } + + p { + font-size: 18px; + } + + .headlinePrvChat { + .imgBoxPrvChat { + margin-right: 12px; + .imgUserPrvChat { + width: 50px; + height: 50px; + } + } + p { + font-size: 20px; + } + } +} diff --git a/src/app/components/main-chat/info/info.component.spec.ts b/src/app/components/main-chat/info/info.component.spec.ts new file mode 100644 index 0000000..2064c5e --- /dev/null +++ b/src/app/components/main-chat/info/info.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { InfoComponent } from './info.component'; + +describe('InfoComponent', () => { + let component: InfoComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [InfoComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(InfoComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/components/main-chat/info/info.component.ts b/src/app/components/main-chat/info/info.component.ts new file mode 100644 index 0000000..cfa1ddf --- /dev/null +++ b/src/app/components/main-chat/info/info.component.ts @@ -0,0 +1,84 @@ +import { Component, Input } from '@angular/core'; +import { ChannleService } from '../../../service/channle.service'; +import { UserService } from '../../../service/user.service'; +import { TranslateModule } from '@ngx-translate/core'; + +@Component({ + selector: 'app-info', + standalone: true, + imports: [TranslateModule], + templateUrl: './info.component.html', + styleUrl: './info.component.scss', +}) +export class InfoComponent { + @Input() currentChannel: string = ''; + + constructor( + private channelService: ChannleService, + public userService: UserService + ) {} + + /** + * Retrieves chat users based on the provided chat ID. + * @param {string} chatId - The ID of the chat. + * @returns {Array} - An array containing the users associated with the chat. + */ + getChatUsers(chatId: string) { + const filteredTasks = this.userService.allUsers.filter( + (user) => user.id == chatId + ); + return filteredTasks; + } + + /** + * Retrieves a channel based on the provided chat ID. + * @param {string} chatId - The ID of the chat. + * @returns {Array} - An array containing the channel matching the provided chat ID. + */ + getChannel(chatId: string) { + const filteredTasks = this.channelService.allChannels.filter( + (channel) => channel.id == chatId + ); + return filteredTasks; + } + + /** + * Retrieves a private channel based on the provided chat ID. + * @param {string} chatId - The ID of the chat. + * @returns {Array} - An array containing the private channel matching the provided chat ID. + */ + getPrivatChannel(chatId: string) { + const filteredTasks = this.channelService.allPrvChannels.filter( + (channel) => channel.id == chatId + ); + return filteredTasks; + } + + /** + * Converts a date string to a formatted time string. + * @param {string} dateString - The date string to convert. + * @returns {string} - The formatted time string (e.g., "Jan. 1, 2022"). + */ + timeConverter(dateString: string) { + var a = new Date(dateString); + var months = [ + 'Jan.', + 'Feb.', + 'Mar.', + 'Apr.', + 'May.', + 'Jun.', + 'Jul.', + 'Aug.', + 'Sep.', + 'Oct.', + 'Nov.', + 'Dec.', + ]; + var year = a.getFullYear(); + var month = months[a.getMonth()]; + var date = a.getDate(); + var time = month + ' ' + date + ', ' + year; + return time; + } +} diff --git a/src/app/components/main-chat/main-chat.component.html b/src/app/components/main-chat/main-chat.component.html new file mode 100644 index 0000000..5c5e913 --- /dev/null +++ b/src/app/components/main-chat/main-chat.component.html @@ -0,0 +1,179 @@ +
+ @if (checkCurrentChannel(currentChannel) == 'searchBar') { + +
+

{{ "main-chat.message" | translate }}

+ + @if (toggleBoolean.openSearchWindow) { + +
+ @if (firstLetter == '#') { + + @for (i of checkIfUserHasAccessToChannel(); track $index) { +

+ } } @else if (firstLetter == '@') { + + @for (i of userService.allUsers; track $index) { +
+
+ + +
+

+
+ } } +
+ } +
+
+ + +
+ } @else { @if(checkCurrentChannel(currentChannel) == 'allPrvChannels'){ + + @for (user of getPrvChat(currentChannel); track user; let i = $index) { +
+
+ @if (user.talkToUserId == userService.getCurrentUserId()) { +
+ + +
+

+ {{ filterUser(user.creatorId)[i].firstName }} + {{ filterUser(user.creatorId)[i].lastName }} +

+ } @else { +
+ +
+

+ {{ filterUser(user.talkToUserId)[i].firstName }} + {{ filterUser(user.talkToUserId)[i].lastName }} +

+ } +
+
+ + + } } @else if (checkCurrentChannel(currentChannel) == 'allChannels') { + + @for(channel of getChannelName(currentChannel); track channel) { +
+
+ +

{{ channel.name }}

+ +
+
+ @if (filterChannelForSelectedUser(currentChannel)) { +
+ @for(user of userService.getFiltertUsers.slice(0, 3) ; track user) { +
+ +
+ } +
+ +
+

{{ userService.getFiltertUsers.length }}

+
+ + } +
+
+ + + + } + + @if (openMenu) { + + } } } @if (showProfil) { + + } +
diff --git a/src/app/components/main-chat/main-chat.component.scss b/src/app/components/main-chat/main-chat.component.scss new file mode 100644 index 0000000..5fa86a7 --- /dev/null +++ b/src/app/components/main-chat/main-chat.component.scss @@ -0,0 +1,296 @@ +@import "./../../../styles.scss"; + +section { + height: 100%; + border-radius: 24px; + background-color: #fff; +} + +.header { + height: 40px; + padding: 24px 48px; + box-shadow: 0px 3px 3px 0px rgba(0, 0, 0, 0.05); + @include displayFlex($j: space-between); +} + +.headline { + display: flex; + align-items: center; + padding: 6px 12px; + max-width: fit-content; + cursor: pointer; + img { + &:first-child { + width: 24px; + height: 25px; + padding-right: 12px; + } + &:nth-child(2) { + width: 14px; + height: 8px; + } + } + p { + font-size: 24px; + font-weight: 700; + padding-right: 12px; + } + &:hover { + background-color: #edeefe; + border-radius: 24px; + } +} + +.addUserToChannelBox { + @include displayFlex($g: 12px); + .addedUsers { + @include displayFlex($g: 8px); + width: auto; + height: 40px; + padding: 3px; + padding-left: 26px; + border-radius: 25px; + cursor: pointer; + transition: background-color 0.2s ease-in-out; + &:hover { + background-color: #edeefe; + } + .userAvatar { + width: 40px; + height: 40px; + object-fit: cover; + background-color: whitesmoke; + border-radius: 50%; + @include displayFlex(); + margin-left: -22px; + img { + width: 36px; + height: 36px; + object-fit: cover; + border-radius: 50%; + } + } + h3 { + padding-right: 8px; + } + } +} + +// -------- prv chat-------- + +.headerPrvChat { + height: 60px; + padding: 24px 48px; + box-shadow: 0px 3px 3px 0px rgba(0, 0, 0, 0.05); + @include displayFlex($j: space-between); +} + +.headerBoxPrvChat { + display: flex; + justify-content: space-between; + width: 100%; +} + +.headlinePrvChat { + display: flex; + align-items: center; + padding: 6px 12px; + max-width: fit-content; + cursor: pointer; + .imgBoxPrvChat { + @include displayFlex($a: flex-end); + margin-right: 16px; + .imgUserPrvChat { + width: 56px; + height: 56px; + object-fit: cover; + border-radius: 50%; + } + .onlineIcon { + width: 16px; + height: 16px; + border-radius: 50%; + margin-left: -12px; + } + } + p { + font-size: 24px; + font-weight: 700; + padding-right: 12px; + } + &:hover { + background-color: #edeefe; + border-radius: 35px; + } +} + +.headerSearchBar { + height: auto; + border-top-left-radius: 25px; + border-top-right-radius: 25px; + box-shadow: 0px 3px 3px 0px rgba(0, 0, 0, 0.05); + @include displayFlex($a: flex-start); + flex-direction: column; + padding: 24px 48px; + position: relative; + p { + font-size: 24px; + font-weight: 700; + } + input { + width: calc(100% - 8px); + height: 55px; + border-radius: 26px; + padding-left: 24px; + margin-top: 12px; + font-size: 18px; + font-weight: 400; + border: 1px solid #888dec; + font-family: "Nunito", sans-serif; + outline: none; + &:hover { + border: 1px solid #5f66e7; + } + } +} + +.filteredElementWindow { + z-index: 1; + max-height: 240px; + overflow: auto; + scrollbar-width: none; + position: absolute; + top: 127px; + left: 80px; + border-radius: 25px; + border-top-left-radius: 0; + border: 1px solid #888dec; + background-color: #ffffff; + padding: 8px; + box-shadow: rgba(50, 50, 93, 0.25) 0px 13px 27px -5px, + rgba(0, 0, 0, 0.3) 0px 8px 16px -8px; + display: flex; + align-items: flex-start; + flex-direction: column; + .user { + @include displayFlex($j: flex-start); + padding: 6px; + margin-bottom: 6px; + cursor: pointer; + transition: 0.2s ease-in-out; + &:hover { + background-color: #edeefe; + border-radius: 25px; + } + .positionImgs { + @include displayFlex($a: flex-end); + .avatarImg { + width: 40px; + height: 40px; + object-fit: cover; + border-radius: 50%; + } + .onlineIconFilterWindow { + height: 12px; + width: 12px; + margin-left: -10px; + margin-right: 8px; + } + } + } +} + +.dotsImg { + @include displayFlex($a: flex-end); + margin-bottom: -26px; + margin-left: -10px; + img { + width: 6px; + height: 6px; + } +} + +/*------------- RESPONSIVE -------------*/ + +@media screen and (max-width: $RESPONSIVE_THRESHOLD_MOBILE) { + section { + border-radius: 0; + } + + .addUserToChannelBox { + .addedUsers { + display: none; + } + } + + .header { + height: 36px; + padding: 12px; + } + + .headerPrvChat { + height: 54px; + padding: 12px; + } + + .headline { + p { + font-size: 20px; + max-width: 180px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + img { + &:first-child { + width: 18px; + height: 19px; + padding-right: 6px; + } + } + } + + .headerSearchBar { + height: 84px; + padding: 12px; + p { + font-size: 20px; + } + input { + width: calc(100% - 28px); + height: 50px; + } + } + + .headlinePrvChat { + .imgBoxPrvChat { + margin-right: 16px; + .imgUserPrvChat { + width: 50px; + height: 50px; + } + .onlineIcon { + width: 12px; + height: 12px; + border-radius: 50%; + margin-left: -12px; + } + } + p { + font-size: 20px; + } + &:hover { + background-color: #edeefe; + border-radius: 35px; + } + } +} + +/*------------- RESPONSIVE -------------*/ + +@media screen and (max-width: $RESPONSIVE_THRESHOLD_MOBILE) { + .filteredElementWindow { + top: 95px; + left: 45px; + } +} diff --git a/src/app/components/main-chat/main-chat.component.spec.ts b/src/app/components/main-chat/main-chat.component.spec.ts new file mode 100644 index 0000000..d5fce28 --- /dev/null +++ b/src/app/components/main-chat/main-chat.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { MainChatComponent } from './main-chat.component'; + +describe('MainChatComponent', () => { + let component: MainChatComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [MainChatComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(MainChatComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/components/main-chat/main-chat.component.ts b/src/app/components/main-chat/main-chat.component.ts new file mode 100644 index 0000000..a049916 --- /dev/null +++ b/src/app/components/main-chat/main-chat.component.ts @@ -0,0 +1,365 @@ +import { Component, ElementRef, Input } from '@angular/core'; +import { ChannleService } from '../../service/channle.service'; +import { MainComponent } from '../main/main.component'; +import { ChatService } from '../../service/chat.service'; +import { UserService } from '../../service/user.service'; +import { User } from '../../interface/user.interface'; +import { + Channel, + PrvChannel, + publicChannels, +} from '../../interface/channel.interface'; +import { Chat } from '../../interface/chat.interface'; +import { NavigationStart, Router } from '@angular/router'; +import { CommonModule } from '@angular/common'; +import { ChatContentComponent } from './chat-content/chat-content.component'; +import { SingleChatComponent } from './single-chat/single-chat.component'; +import { ToggleBooleanService } from '../../service/toggle-boolean.service'; +import { ChatMsgBoxComponent } from './chat-msg-box/chat-msg-box.component'; +import { FormsModule } from '@angular/forms'; +import { SmallBtnComponent } from '../../shared/components/small-btn/small-btn.component'; +import { ShowChannelMemberComponent } from './show-channel-member/show-channel-member.component'; +import { SharedService } from '../../service/shared.service'; +import { ChannelInformationsComponent } from './channel-informations/channel-informations.component'; +import { filter } from 'rxjs'; +import { OpenSendPrvMessageWindowComponent } from './show-channel-member/open-send-prv-message-window/open-send-prv-message-window.component'; +import { HighlightPipe } from '../../highlight.pipe'; +import { TranslateModule } from '@ngx-translate/core'; + +@Component({ + selector: 'app-main-chat', + standalone: true, + imports: [ + MainComponent, + CommonModule, + ChatContentComponent, + SingleChatComponent, + ChatMsgBoxComponent, + FormsModule, + SmallBtnComponent, + ShowChannelMemberComponent, + ChannelInformationsComponent, + OpenSendPrvMessageWindowComponent, + HighlightPipe, + TranslateModule, + ], + templateUrl: './main-chat.component.html', + styleUrl: './main-chat.component.scss', +}) +export class MainChatComponent { + @Input() currentChannel: string = ''; + @Input() isSecondaryChatOpen: boolean = false; + @Input() viewWidth: number = 0; + + firstLetter: string = ''; + openSearchWindow: boolean = false; + channelCreator: boolean = false; + openMenu: boolean = false; + showProfil: boolean = false; + talkToUser!: User[]; + routToPrvCHannel: boolean = false; + + constructor( + private route: Router, + public userService: UserService, + public channelService: ChannleService, + public chatService: ChatService, + public toggleBoolean: ToggleBooleanService, + private sharedService: SharedService + ) { + this.checkPrivatChatRouteEvent(); + this.routeToStartChannel(); + } + + RESPONSIVE_THRESHOLD_MOBILE = this.sharedService.RESPONSIVE_THRESHOLD_MOBILE; + + /** + * Sets the openMenu property based on the provided variable. + * @param {boolean} variable - The value to set for openMenu. + */ + closeEditEmitter(variable: boolean) { + this.openMenu = variable; + } + + /** + * Sets the showProfil property based on the provided value. + * @param {boolean} value - The value to set for showProfil. + */ + getShowProfilWindowBoolean(value: boolean) { + this.showProfil = value; + } + + /** + * Checks the route events for private chat messages. + */ + checkPrivatChatRouteEvent() { + this.route.events + .pipe( + filter( + (event): event is NavigationStart => event instanceof NavigationStart + ) + ) + .subscribe((event: NavigationStart) => { + const urlParts = this.route.url.split('/'); + const id = urlParts[urlParts.length - 1]; + this.hasPrivatChatMessages(id); + }); + } + + /** + * Checks if there are private chat messages for a given chat ID and performs necessary actions. + * @param {string} chatId - The ID of the chat. + */ + hasPrivatChatMessages(chatId: string) { + const isPrivatChannel = this.channelService.allPrvChannels.filter( + (user) => user.id === chatId + ); + if (isPrivatChannel.length > 0) { + const countMessages = this.chatService.allChats.filter( + (user) => user.channelId === chatId + ); + const userChannel = this.channelService.allPrvChannels.filter( + (user) => + user.creatorId === this.userService.getCurrentUserId() && + user.talkToUserId === this.userService.getCurrentUserId() && + user.id === chatId + ); + if (countMessages.length === 0 && userChannel.length === 0) { + this.chatService.deleteData(chatId, 'prv-channels'); + } + } + } + + /** + * Redirects to the start channel if the current channel is empty and the user is logged in. + */ + routeToStartChannel() { + if ( + this.currentChannel === '' && + this.userService.getCurrentUserId() !== undefined + ) { + this.route.navigateByUrl(`/main/${publicChannels[0]}`); + } + } + + /** + * Checks if the current user has access to any channels. + * @returns {Channel[]} Array of Channel objects that the user has access to. + */ + checkIfUserHasAccessToChannel() { + const isUserAChannelMember = this.channelService.allChannels.some( + (channel) => + channel.addedUser.includes(this.userService.getCurrentUserId()) + ); + + if (isUserAChannelMember) { + return this.channelService.allChannels.filter((channel) => + channel.addedUser.includes(this.userService.getCurrentUserId()) + ); + } + return []; + } + + /** + * Sets the openMenu property to true. + */ + showMenu() { + this.openMenu = true; + } + + /** + * Retrieves users associated with a chat ID. + * @param {string} chatId - The ID of the chat. + * @returns {User[]} Array of User objects associated with the chat ID. + */ + getChatUsers(chatId: string) { + const filteredTasks = this.userService.allUsers.filter( + (user) => user.id == chatId + ); + return filteredTasks; + } + + /** + * Retrieves chats associated with a chat ID. + * @param {string} chatId - The ID of the chat. + * @returns {Chat[]} Array of Chat objects associated with the chat ID. + */ + getChatChannel(chatId: string) { + const filteredTasks = this.chatService.allChats.filter( + (chat) => chat.channelId == chatId + ); + return filteredTasks; + } + + /** + * Retrieves channel information for a given channel ID. + * @param {string} chatId - The ID of the channel. + * @returns {Channel[]} Array of Channel objects matching the provided channel ID. + */ + getChannelName(chatId: string) { + const filteredTasks = this.channelService.allChannels.filter( + (channel) => channel.id == chatId + ); + return filteredTasks; + } + + /** + * Retrieves private chat information for a given private chat ID. + * @param {string} prvChatId - The ID of the private chat. + * @returns {PrvChannel[]} Array of PrvChannel objects matching the provided private chat ID. + */ + getPrvChat(prvChatId: string) { + const filteredChats = this.channelService.allPrvChannels.filter( + (prvChat) => prvChat.id == prvChatId + ); + this.getTalkToUser(filteredChats); + return filteredChats; + } + + /** + * Retrieves the user associated with a filtered private chat. + * @param {PrvChannel[]} filteredChat - The filtered private chat. + */ + getTalkToUser(filteredChat: PrvChannel[]) { + const talkToUser = filteredChat[0].talkToUserId; + const getUser = this.userService.allUsers.filter( + (user) => user.id === talkToUser + ); + if (getUser) { + this.talkToUser = getUser; + } + } + + /** + * Filters users based on the provided talkToUserId. + * @param {string} talkToUserId - The ID of the user to filter. + * @returns {User[]} Array of User objects matching the provided user ID. + */ + filterUser(talkToUserId: string) { + return this.userService.allUsers.filter((user) => user.id == talkToUserId); + } + + /** + * Checks the type of the current channel. + * @param {string} currentChannel - The ID of the current channel. + * @returns {string} Type of the current channel ('searchBar', 'allChannels', 'allPrvChannels'). + */ + checkCurrentChannel(currentChannel: string) { + if (currentChannel === 'searchBar') { + return 'searchBar'; + } + const allChannels = this.channelService.allChannels.some( + (channel) => channel.id == currentChannel + ); + const allPrvChannels = this.channelService.allPrvChannels.some( + (channel) => channel.id == currentChannel + ); + + if (allChannels) { + return 'allChannels'; + } else if (allPrvChannels) { + return 'allPrvChannels'; + } + return ''; + } + + /** + * Filters channels and users based on the input value. + * @param {string} inputValue - The input value to filter. + * @returns {string} Type of filtering ('filterChannel', 'filterUsers'). + */ + filterChannelAndUser(inputValue: string) { + const filterChannels = '#'; + const filterUsers = '@'; + this.firstLetter = inputValue[0]; + if (this.firstLetter == filterChannels) { + this.toggleBoolean.openSearchWindow = true; + return 'filterChannel'; + } else if (this.firstLetter == filterUsers) { + this.toggleBoolean.openSearchWindow = true; + return 'filterUsers'; + } + return (this.chatService.inputValue = ''); + } + + /** + * Sets the showProfil property to true. + */ + openUserProfil() { + this.showProfil = true; + } + + /** + * Chooses an element and performs necessary actions based on its type. + * @param {Channel | User} element - The element to choose. + */ + chooseElement(element: Channel | User) { + if ('firstName' in element) { + this.chatService.inputValue = `@${element.firstName} ${element.lastName}`; + const getUserID = element.id!; + this.routToPrvCHannel = true; + this.checkIfPrvChatExist(getUserID); + } else { + this.chatService.inputValue = `#${element.name}`; + this.chatService.getChannelId = element.id!; + } + this.toggleBoolean.openSearchWindow = false; + } + + /** + * Checks if a private chat exists for the provided user ID and performs necessary actions. + * @param {string} userID - The ID of the user. + */ + checkIfPrvChatExist(userID: string) { + const filterPrvChannelBoolean = this.channelService.allPrvChannels.some( + (chat) => chat.talkToUserId == userID + ); + if (!filterPrvChannelBoolean) { + this.userService.createPrvChannel(userID); + } else { + const filterPrvChannelValue = this.channelService.allPrvChannels.filter( + (chat) => chat.talkToUserId == userID + ); + this.chatService.getPrvChatId = filterPrvChannelValue[0].id!; + } + } + + /** + * Filters channels for a selected user. + * @param {string} currentChannel - The ID of the current channel. + * @returns {boolean} Boolean indicating if the channel is found. + */ + filterChannelForSelectedUser(currentChannel: string) { + const getBoolean = this.channelService.allChannels.some( + (channel) => channel.id == currentChannel + ); + const getAddedUsers = this.channelService.allChannels.filter( + (channel) => channel.id == currentChannel + ); + this.filterUsers(getAddedUsers[0].addedUser); + return getBoolean; + } + + /** + * Filters users based on an array of user IDs. + * @param {string[]} userArray - The array of user IDs to filter. + */ + filterUsers(userArray: string[]) { + this.userService.getFiltertUsers = []; + for (let i = 0; i < this.userService.allUsers.length; i++) { + const currentUser = this.userService.allUsers[i]; + if (userArray.includes(currentUser.id!)) { + this.userService.getFiltertUsers.push(currentUser); + } + } + } + + /** + * Opens the channel member window. + * @param {boolean} boolean - Boolean value to open or close the add member window. + */ + openMemberWindow(boolean: boolean) { + this.toggleBoolean.openChannelMemberWindow = true; + this.toggleBoolean.openAddMemberWindow(boolean); + } +} diff --git a/src/app/components/main-chat/show-channel-member/open-send-prv-message-window/open-send-prv-message-window.component.html b/src/app/components/main-chat/show-channel-member/open-send-prv-message-window/open-send-prv-message-window.component.html new file mode 100644 index 0000000..d6866fb --- /dev/null +++ b/src/app/components/main-chat/show-channel-member/open-send-prv-message-window/open-send-prv-message-window.component.html @@ -0,0 +1,91 @@ +
+
+ @if (showProfil) { + + @for(i of talkToUser; track i){ +
+
+

{{ 'open-send-prv-message.profil' | translate }}

+
+ +
+
+ +
+
+

{{ i.firstName }} {{ i.lastName }}

+
+ +
+ + @if (i.status) { +

{{ 'open-send-prv-message.aktiv' | translate }}

+ } @else { +

{{ 'open-send-prv-message.offline' | translate }}

+ } +
+ +
+ + +
+
+
+ } } @else { + + @for(i of user; track i){ +
+
+

{{ 'open-send-prv-message.profil' | translate }}

+
+ +
+
+ +
+
+

{{ i.firstName }} {{ i.lastName }}

+
+ +
+ + @if (i.status) { +

{{ 'open-send-prv-message.aktiv' | translate }}

+ } @else { +

{{ 'open-send-prv-message.offline' | translate }}

+ } +
+ +
+ + +
+
+ +
+ } } +
diff --git a/src/app/components/main-chat/show-channel-member/open-send-prv-message-window/open-send-prv-message-window.component.scss b/src/app/components/main-chat/show-channel-member/open-send-prv-message-window/open-send-prv-message-window.component.scss new file mode 100644 index 0000000..bdd54d9 --- /dev/null +++ b/src/app/components/main-chat/show-channel-member/open-send-prv-message-window/open-send-prv-message-window.component.scss @@ -0,0 +1,188 @@ +@import "../../../../../styles.scss"; + +.darkBackground { + position: absolute; + top: 0; + left: 0; + width: 100vw; + height: 100vh; + background-color: rgba(0, 0, 0, 0.3); + z-index: 4; +} + +.whiteBox { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 440px; + height: auto; + background-color: whitesmoke; + border-radius: 35px; + z-index: 15; + @include displayFlex(); + flex-direction: column; + padding-top: 32px; + .boxHeader { + width: 360px; + @include displayFlex($j: space-between); + p { + font-size: 24px; + font-weight: 700; + } + .positionCloseIcon { + width: 40px; + height: 40px; + @include displayFlex(); + margin-right: -10px; + transition: 0.3s ease-in-out; + &:hover { + background-color: #eceefe; + border-radius: 25px; + cursor: pointer; + > img { + filter: invert(59%) sepia(26%) saturate(871%) hue-rotate(199deg) + brightness(93%) contrast(100%); + } + } + } + } + .profileImg { + width: 200px; + height: 200px; + object-fit: cover; + border-radius: 50%; + margin: 24px; + } + > button { + @include displayFlex($g: 12px); + background-color: #676eee; + border: none; + border-radius: 25px; + padding: 12px; + padding-left: 22px; + padding-right: 22px; + font-size: larger; + font-weight: 500; + color: white; + margin: 32px; + margin-top: 0; + cursor: pointer; + transition: 0.3s ease-in-out; + &:hover { + background-color: #444df2; + box-shadow: rgba(0, 0, 0, 0.1) 0px 20px 25px -5px, + rgba(0, 0, 0, 0.04) 0px 10px 10px -5px; + } + } +} + +.detailsBox { + width: 360px; + .editBtnPosition { + @include displayFlex($j: space-between); + margin-bottom: 20px; + .name { + font-size: 32px; + font-weight: 700; + } + .editBtn { + color: #535af1; + cursor: pointer; + &:hover { + font-weight: 600; + } + } + } + .statusBox { + @include displayFlex($j: flex-start, $g: 12px); + margin-bottom: 40px; + > p { + margin: 0; + font-size: medium; + font-weight: 500; + } + } +} + +.fontColorGreen { + color: #92c83e; +} + +.emailBox { + @include displayFlex($j: flex-start, $a: flex-start, $g: 20px); + height: 96px; + margin-top: 24px; + img { + width: 25px; + height: 20px; + margin-top: 3px; + } + .email { + > p { + font-size: 20px; + font-weight: 600; + margin-bottom: 20px; + } + > a { + color: #4ea1ff; + font-size: 16px; + text-decoration: none; + margin-bottom: 20px; + background: linear-gradient(currentColor 0 0) bottom left/ + var(--underline-width, 0%) 0.1em no-repeat; + display: inline-block; + transition: background-size 0.5s; + &:hover { + --underline-width: 100%; + } + } + } +} + +/*------------- RESPONSIVE -------------*/ + +@media screen and (max-width: $RESPONSIVE_THRESHOLD_MOBILE) { + .whiteBox { + width: 280px; + padding-top: 16px; + .boxHeader { + width: 230px; + p { + font-size: 21px; + font-weight: 700; + } + } + .profileImg { + width: 120px; + height: 120px; + margin: 20px; + } + } + .detailsBox { + width: 230px; + .editBtnPosition { + .name { + font-size: 24px; + font-weight: 700; + } + } + } + + .emailBox { + @include displayFlex($j: flex-start, $a: flex-start, $g: 10px); + img { + margin-top: 2px; + } + .email { + > p { + font-size: 18px; + font-weight: 600; + margin-bottom: 10px; + } + > a { + margin-bottom: 0; + } + } + } +} diff --git a/src/app/components/main-chat/show-channel-member/open-send-prv-message-window/open-send-prv-message-window.component.spec.ts b/src/app/components/main-chat/show-channel-member/open-send-prv-message-window/open-send-prv-message-window.component.spec.ts new file mode 100644 index 0000000..e4699e8 --- /dev/null +++ b/src/app/components/main-chat/show-channel-member/open-send-prv-message-window/open-send-prv-message-window.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { OpenSendPrvMessageWindowComponent } from './open-send-prv-message-window.component'; + +describe('OpenSendPrvMessageWindowComponent', () => { + let component: OpenSendPrvMessageWindowComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [OpenSendPrvMessageWindowComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(OpenSendPrvMessageWindowComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/components/main-chat/show-channel-member/open-send-prv-message-window/open-send-prv-message-window.component.ts b/src/app/components/main-chat/show-channel-member/open-send-prv-message-window/open-send-prv-message-window.component.ts new file mode 100644 index 0000000..b0b1b48 --- /dev/null +++ b/src/app/components/main-chat/show-channel-member/open-send-prv-message-window/open-send-prv-message-window.component.ts @@ -0,0 +1,100 @@ +import { CommonModule } from '@angular/common'; +import { Component, EventEmitter, Input, Output } from '@angular/core'; +import { User } from '../../../../interface/user.interface'; +import { ToggleBooleanService } from '../../../../service/toggle-boolean.service'; +import { ChannleService } from '../../../../service/channle.service'; +import { UserService } from '../../../../service/user.service'; +import { Router } from '@angular/router'; +import { TranslateModule } from '@ngx-translate/core'; + +@Component({ + selector: 'app-open-send-prv-message-window', + standalone: true, + imports: [CommonModule, TranslateModule], + templateUrl: './open-send-prv-message-window.component.html', + styleUrl: './open-send-prv-message-window.component.scss', +}) +export class OpenSendPrvMessageWindowComponent { + @Input() user!: User[]; + @Input() talkToUser!: User[]; + @Input() openUserWindowBoolean!: boolean; + @Input() showProfil!: boolean; + @Output() closeUserWondow = new EventEmitter(); + @Output() showProfilWindow = new EventEmitter(); + isOnline: boolean = false; + + constructor( + public toggleBoolean: ToggleBooleanService, + private channelService: ChannleService, + public userService: UserService, + private route: Router + ) {} + + /** + * Closes the user window and profile window if open. + * Emits events to notify about window closure. + */ + closeWindow() { + this.openUserWindowBoolean = false; + this.showProfil = false; + this.closeUserWondow.emit(this.openUserWindowBoolean); + this.showProfilWindow.emit(this.showProfil); + } + + /** + * Closes all open windows and resets toggle booleans. + * Emits events to notify about window closures. + */ + closeEverything() { + this.openUserWindowBoolean = false; + this.closeUserWondow.emit(this.openUserWindowBoolean); + this.toggleBoolean.openChannelMemberWindow = false; + this.toggleBoolean.closeChannelMemberWindow = false; + } + + /** + * Routes to the user's private chat. + * If the chat channel does not exist, it creates one. + * @param {User[]} user - The user to route to. + */ + routeToUser(user: User[]) { + const userId = user[0].id!; + const channelExistsBoolean = this.channelService.allPrvChannels.some( + (channel) => + (channel.creatorId === userId && + channel.talkToUserId === this.userService.getCurrentUserId()) || + (channel.creatorId === this.userService.getCurrentUserId() && + channel.talkToUserId === userId) + ); + + if (!channelExistsBoolean) { + const createChannelPromise = this.userService.createPrvChannel(userId); + if (createChannelPromise instanceof Promise) { + createChannelPromise.then((docId) => { + this.route.navigateByUrl(`main/${docId}`); + }); + } + } else { + this.getRouteToPrvChat(userId, channelExistsBoolean); + } + this.closeEverything(); + } + + /** + * Routes to the existing private chat. + * @param {string} userId - The ID of the user to route to. + * @param {boolean} channelExistsBoolean - Indicates whether the chat channel exists. + */ + getRouteToPrvChat(userId: string, channelExistsBoolean: boolean) { + if (channelExistsBoolean) { + const existingChannel = this.channelService.allPrvChannels.find( + (channel) => + (channel.creatorId === userId && + channel.talkToUserId === this.userService.getCurrentUserId()) || + (channel.creatorId === this.userService.getCurrentUserId() && + channel.talkToUserId === userId) + ); + this.route.navigateByUrl(`main/${existingChannel!.id}`); + } + } +} diff --git a/src/app/components/main-chat/show-channel-member/show-channel-member.component.html b/src/app/components/main-chat/show-channel-member/show-channel-member.component.html new file mode 100644 index 0000000..dabce55 --- /dev/null +++ b/src/app/components/main-chat/show-channel-member/show-channel-member.component.html @@ -0,0 +1,130 @@ +
+
+ @if (!toggleBoolean.closeChannelMemberWindow) { +
+
+

{{ "show-channel-member.header" | translate }}

+ +
+
+ @for(user of getFiltertUsers; track user){ +
+
+ + +
+

{{ user.firstName }} {{ user.lastName }}

+
+ } +
+
+ +

{{ "show-channel-member.addMember" | translate }}

+
+
+ } @else { +
+
+
+

{{ "show-channel-member.addMember" | translate }}

+ @if (getChannelName(currentChannel)) { + # {{ getCurrentChannelName }} + } +
+ +
+
+
+ +

{{ user.firstName }} {{ user.lastName }}

+ +
+
+
+ @if(getSearchedUser.length <= 0) { + {{ "show-channel-member.result" | translate }} } + @for(user of getSearchedUser; track user){ + @if(!isUserAlreadySelectet(user)) { +
+
+ + +
+

{{ user.firstName }} {{ user.lastName }}

+
+ } } +
+
+ +
+
+ +
+
+ } +
+ diff --git a/src/app/components/main-chat/show-channel-member/show-channel-member.component.scss b/src/app/components/main-chat/show-channel-member/show-channel-member.component.scss new file mode 100644 index 0000000..9da2dbb --- /dev/null +++ b/src/app/components/main-chat/show-channel-member/show-channel-member.component.scss @@ -0,0 +1,344 @@ +@import "../../../../styles.scss"; + +.darkBackground { + position: absolute; + top: 0; + left: 0; + width: 100vw; + height: 100vh; + background-color: rgba(0, 0, 0, 0.3); + z-index: 3; +} + +.whiteBox { + position: absolute; + top: 199px; + right: 108px; + width: 320px; + height: fit-content; + z-index: 4; + border-radius: 35px; + border-top-right-radius: 0; + background-color: whitesmoke; + padding: 24px; + @include displayFlex($g: 20px); + flex-direction: column; + + .posiotionHeader { + @include displayFlex($j: space-between); + font-size: 24px; + font-weight: 600; + width: 100%; + } +} + +.positionOfAllUsersInBox { + @include displayFlex($j: flex-start, $a: flex-start); + flex-direction: column; + height: fit-content; + max-height: 300px; + overflow: auto; + width: 100%; + + .user { + @include displayFlex($g: 12px); + padding: 6px; + cursor: pointer; + transition: 0.2s ease-in-out; + + &:hover { + background-color: #edeefe; + border-radius: 25px; + } + + .positionImgs { + @include displayFlex($a: flex-end); + + .avatarImg { + width: 40px; + height: 40px; + object-fit: cover; + border-radius: 50%; + } + + .onlineIcon { + width: 12px; + height: 12px; + margin-left: -10px; + } + } + } +} + +.addMemberBox { + @include displayFlex($g: 20px); + transition: background-color 0.2s ease-in-out; + border-radius: 20px; + padding: 8px; + + &:hover { + background-color: #888dec; + cursor: pointer; + } +} + +.addMemberToChannelBox { + position: absolute; + top: 198px; + right: 62px; + width: 400px; + padding: 24px; + z-index: 3; + height: auto; + background-color: white; + border-radius: 35px; + border-top-right-radius: 0; + @include displayFlex($g: 20px); + flex-direction: column; + .posiotionHeader { + @include displayFlex($j: space-between, $a: flex-start); + width: 100%; + .headline { + @include displayFlex($a: flex-start, $g: 12px); + flex-direction: column; + p { + font-size: 24px; + font-weight: 600; + } + span { + font-size: 21px; + font-weight: 400; + color: #797ef3; + } + } + } +} + +.addedUserBox { + display: flex; + flex-wrap: wrap; + z-index: 4; + height: auto; + width: 100%; + border: 1px solid #888dec; + background-color: white; + border-radius: 25px; + transition: 0.3s ease-in-out; + position: relative; + + &:hover { + border: 1px solid #2c36f0; + } + .userPosition { + @include displayFlex($g: 8px); + padding: 4px; + padding-left: 8px; + padding-right: 8px; + background-color: #edeefe; + border-radius: 25px; + border-radius: 25px; + margin: 4px; + p { + font-size: 21px; + } + .avatarImg { + width: 32px; + height: 32px; + object-fit: cover; + border-radius: 50%; + } + + .imgClose { + width: 12px; + object-fit: contain; + transition: 0.1s ease-in-out; + cursor: pointer; + + &:hover { + scale: 1.1; + filter: brightness(0) saturate(100%) invert(8%) sepia(96%) + saturate(6339%) hue-rotate(1deg) brightness(102%) contrast(109%); + } + } + } + + .inputfieldStyle { + width: 100%; + flex-grow: 1; + outline: none; + border: none; + border-radius: 25px; + height: 26px; + padding: 12px; + height: auto; + font-size: larger; + } +} + +.showSearchedUsersWindow::-webkit-scrollbar { + display: none; +} + +.showSearchedUsersWindow { + position: absolute; + top: 88%; + left: 20px; + z-index: 3; + padding: 4px; + border: 1px solid #888dec; + border-radius: 25px; + border-top-left-radius: 0; + background-color: white; + overflow: auto; + max-height: 210px; + width: fit-content; + max-width: 240px; + scrollbar-width: none; + -ms-overflow-style: none; + text-align: start; + .positionOfAllUsersBox { + @include displayFlex($a: flex-start); + flex-direction: column; + overflow: auto; + width: 100%; + span { + font-size: 20px; + font-weight: 400; + padding: 6px; + } + .userBox { + @include displayFlex($g: 12px); + padding: 6px; + cursor: pointer; + p { + font-size: 21px; + } + &:hover { + background-color: #edeefe; + border-radius: 25px; + } + + .positionImgsBox { + @include displayFlex($a: flex-end); + + .addAvatarImg { + width: 40px; + height: 40px; + object-fit: cover; + border-radius: 50%; + } + + .onlineIcon { + width: 12px; + height: 12px; + margin-left: -10px; + } + } + } + } +} + +.positionCreateBtn { + width: 100%; + @include displayFlex($j: flex-end); +} + +.furterBtnClass { + width: 120px; + height: 48px; + background-color: white; + border: 1px solid #888dec; + border-radius: 25px; + font-size: larger; + color: #444df2; + transition: 0.3s ease-in-out; + &:hover { + background-color: #444df2; + color: white; + cursor: pointer; + } +} + +.disabledBtn { + background-color: #22222242; + border: none; + font-size: larger; + color: #fff; + width: 120px; + height: 48px; + border-radius: 25px; + font-size: larger; + transition: 0.3s ease-in-out; +} + +/*------------- RESPONSIVE -------------*/ + +@media screen and (max-width: $RESPONSIVE_THRESHOLD_MOBILE) { + .whiteBox { + top: 140px; + right: 20px; + width: 250px; + .posiotionHeader { + font-size: 21px; + } + } + + .addMemberToChannelBox { + position: absolute; + top: 140px; + right: 20px; + width: 230px; + .posiotionHeader { + .headline { + p { + font-size: 21px; + } + span { + font-size: 18px; + } + } + } + } + + .showSearchedUsersWindow { + position: absolute; + top: 88%; + right: 0px; + max-height: 210px; + width: 200px; + .positionOfAllUsersBox { + span { + font-size: 18px; + } + .userBox { + p { + font-size: 18px; + font-style: 600; + } + .positionImgsBox { + .addAvatarImg { + width: 32px; + height: 32px; + } + .onlineIcon { + width: 9px; + height: 9px; + margin-left: -8px; + } + } + } + } + } +} + +@media screen and (max-height: 600px) { + .positionOfAllUsersInBox { + max-height: 250px; + } +} + +@media screen and (max-height: 500px) { + .positionOfAllUsersInBox { + max-height: 170px; + } +} diff --git a/src/app/components/main-chat/show-channel-member/show-channel-member.component.spec.ts b/src/app/components/main-chat/show-channel-member/show-channel-member.component.spec.ts new file mode 100644 index 0000000..733999a --- /dev/null +++ b/src/app/components/main-chat/show-channel-member/show-channel-member.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ShowChannelMemberComponent } from './show-channel-member.component'; + +describe('ShowChannelMemberComponent', () => { + let component: ShowChannelMemberComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [ShowChannelMemberComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(ShowChannelMemberComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/components/main-chat/show-channel-member/show-channel-member.component.ts b/src/app/components/main-chat/show-channel-member/show-channel-member.component.ts new file mode 100644 index 0000000..fe29938 --- /dev/null +++ b/src/app/components/main-chat/show-channel-member/show-channel-member.component.ts @@ -0,0 +1,193 @@ +import { Component, Input } from '@angular/core'; +import { ToggleBooleanService } from '../../../service/toggle-boolean.service'; +import { CommonModule } from '@angular/common'; +import { SmallBtnComponent } from '../../../shared/components/small-btn/small-btn.component'; +import { User } from '../../../interface/user.interface'; +import { FormsModule } from '@angular/forms'; +import { ChannleService } from '../../../service/channle.service'; +import { UserService } from '../../../service/user.service'; +import { OpenSendPrvMessageWindowComponent } from './open-send-prv-message-window/open-send-prv-message-window.component'; +import { TranslateModule } from '@ngx-translate/core'; + +@Component({ + selector: 'app-show-channel-member', + standalone: true, + imports: [ + CommonModule, + SmallBtnComponent, + FormsModule, + OpenSendPrvMessageWindowComponent, + TranslateModule, + ], + templateUrl: './show-channel-member.component.html', + styleUrl: './show-channel-member.component.scss', +}) +export class ShowChannelMemberComponent { + @Input() isSecondaryChatOpen: boolean = false; + + userName: string = ''; + showExistenUsers: boolean = false; + getSearchedUser: User[] = []; + getCurrentChannelName: string = ''; + getSelectedUsers: User[] = []; + selectedUsers: string[] = []; + + openUserWindowBoolean: boolean = false; + user: User[] = []; + + @Input() getFiltertUsers!: User[]; + @Input() currentChannel!: string; + + constructor( + public toggleBoolean: ToggleBooleanService, + public channelService: ChannleService, + public userService: UserService + ) {} + + /** + * Closes the channel member window and resets related values. + */ + closeChannelMemberWindow() { + this.toggleBoolean.openChannelMemberWindow = false; + this.toggleBoolean.closeChannelMemberWindow = false; + this.resetValues(); + } + + /** + * Filters users based on search value and updates the list of searched users. + * @param {string} searchValue - The value to search for. + */ + filterUsers(searchValue: string) { + if (searchValue != '') { + this.showExistenUsers = true; + this.getSearchedUser = []; + const searchedUser = searchValue.toLowerCase().trim(); + const filteredUsers = this.userService.getUsers().filter((user) => { + const fullName = `${user.firstName} ${user.lastName}`.toLowerCase(); + return fullName.includes(searchedUser); + }); + this.checkIfUserIsInChannel(filteredUsers); + } + } + + /** + * Checks if users from the filtered list are already in the current channel and updates the searched user list. + * @param {User[]} filteredUsers - The list of filtered users. + */ + checkIfUserIsInChannel(filteredUsers: User[]) { + const getChannel = this.channelService.allChannels.filter( + (channel) => channel.id === this.currentChannel + ); + + for (const user of getChannel) { + const userArray = user.addedUser; + this.channelService.channelMembers = userArray; + + for (const user of filteredUsers) { + const isUserInChannel = userArray.some( + (channelUser) => channelUser === user.id + ); + if (!isUserInChannel) { + this.getSearchedUser.push(user); + } + } + } + } + + /** + * Checks if a user is already selected. + * @param {User} user - The user to check. + * @returns {boolean} Returns true if the user is already selected, otherwise false. + */ + isUserAlreadySelectet(user: User) { + return this.getSelectedUsers.some( + (selectedUser) => selectedUser.id === user.id + ); + } + + /** + * Adds a user to the list of selected users. + * @param {User} user - The user to add. + */ + chooseUser(user: User) { + const isUserAlreadySelected = this.getSelectedUsers.some( + (selectedUser) => selectedUser.id === user.id + ); + + if (!isUserAlreadySelected) { + this.selectedUsers.push(user.id!); + this.getSelectedUsers.push(user); + } + this.userName = ''; + this.showExistenUsers = false; + } + + /** + * Removes the user at the specified index from the list of selected users. + * @param {number} index - The index of the user to remove. + */ + spliceCurrentUser(index: number) { + this.getSelectedUsers.splice(index, 1); + this.showExistenUsers = false; + } + + /** + * Gets the name of the current channel. + * @param {string} currentChannel - The ID of the current channel. + * @returns {boolean} Returns true if the channel exists, otherwise false. + */ + getChannelName(currentChannel: string) { + const getName = this.channelService.allChannels.some( + (channel) => channel.id == currentChannel + ); + const getChannelName = this.channelService.allChannels.filter( + (channel) => channel.id == currentChannel + ); + this.getCurrentChannelName = getChannelName[0].name; + return getName; + } + + /** + * Adds selected users to the current channel. + */ + addUserToChannel() { + this.channelService.addNewMemberToChannel( + 'channels', + this.currentChannel, + this.selectedUsers, + 'addUserToChannel' + ); + this.closeChannelMemberWindow(); + } + + /** + * Opens a user window. + * + * @param {User} user - The user to be displayed in the window. + * @returns {void} + */ + openUserWindow(user: User) { + this.user = [user]; + this.openUserWindowBoolean = !this.openUserWindowBoolean; + } + + /** + * Opens or closes the user window based on the given value. + * @param {boolean} value - The value to set for opening/closing the user window. + */ + changeOpenUserWindowBoolean(value: boolean) { + this.openUserWindowBoolean = value; + } + + /** + * Resets various values used in the component. + */ + resetValues() { + this.userName = ''; + this.showExistenUsers = false; + this.getSearchedUser = []; + this.getCurrentChannelName = ''; + this.getSelectedUsers = []; + this.selectedUsers = []; + } +} diff --git a/src/app/components/main-chat/single-chat/attachments/attachments.component.html b/src/app/components/main-chat/single-chat/attachments/attachments.component.html new file mode 100644 index 0000000..d202528 --- /dev/null +++ b/src/app/components/main-chat/single-chat/attachments/attachments.component.html @@ -0,0 +1,68 @@ + +
+
+
+
+
+
+ @if (['png', 'jpg', 'jpeg', 'gif'].includes(getFileType(file))) { + image + } @if (['pdf', 'doc', 'txt'].includes(getFileType(file))) { + + image + } @if (['mp3', 'wav', 'wma'].includes(getFileType(file))) { + + }@if (getFileType(file) === 'mp4') { +
+ +
+ } +
+
+
+
+
+
diff --git a/src/app/components/main-chat/single-chat/attachments/attachments.component.scss b/src/app/components/main-chat/single-chat/attachments/attachments.component.scss new file mode 100644 index 0000000..c824f3a --- /dev/null +++ b/src/app/components/main-chat/single-chat/attachments/attachments.component.scss @@ -0,0 +1,71 @@ +@import "./../../../../../styles.scss"; + +.files { + display: flex; + + max-width: calc(100vw - 140px); + overflow: auto; + .filesView { + cursor: pointer; + transition: 0.3s ease-in-out; + filter: drop-shadow(3px 3px 3px rgba(0, 0, 0, 0.3)); + img, + video { + height: 7.5vw; + min-height: 80px; + width: auto; + border-radius: 12px; + } + .otherFiles { + height: 5vw; + min-height: 60px; + width: auto; + border-radius: 12px; + } + &:hover { + filter: drop-shadow(5px 5px 5px rgba(0, 0, 0, 0.35)); + } + } +} + +/*------------- RESPONSIVE -------------*/ + +@media screen and (max-width: 510px) { + .files { + .filesView { + audio { + width: 250px; + } + } + } +} + +@media screen and (max-width: 460px) { + .files { + .filesView { + audio { + width: 200px; + } + } + } +} + +@media screen and (max-width: 410px) { + .files { + .filesView { + audio { + width: 150px; + } + } + } +} + +@media screen and (max-width: 360px) { + .files { + .filesView { + audio { + width: 90px; + } + } + } +} diff --git a/src/app/components/main-chat/single-chat/attachments/attachments.component.spec.ts b/src/app/components/main-chat/single-chat/attachments/attachments.component.spec.ts new file mode 100644 index 0000000..4aeb48c --- /dev/null +++ b/src/app/components/main-chat/single-chat/attachments/attachments.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { AttachmentsComponent } from './attachments.component'; + +describe('AttachmentsComponent', () => { + let component: AttachmentsComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [AttachmentsComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(AttachmentsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/components/main-chat/single-chat/attachments/attachments.component.ts b/src/app/components/main-chat/single-chat/attachments/attachments.component.ts new file mode 100644 index 0000000..13a1eba --- /dev/null +++ b/src/app/components/main-chat/single-chat/attachments/attachments.component.ts @@ -0,0 +1,54 @@ +import { CommonModule } from '@angular/common'; +import { Component, Input } from '@angular/core'; +import { DownloadFilesService } from '../../../../service/download-files.service'; +import { OverlayService } from '../../../../service/overlay.service'; +import { OverlayComponent } from '../../../../shared/components/overlay/overlay.component'; +import { SharedService } from '../../../../service/shared.service'; + +@Component({ + selector: 'app-attachments', + standalone: true, + imports: [CommonModule, OverlayComponent], + templateUrl: './attachments.component.html', + styleUrl: './attachments.component.scss', +}) +export class AttachmentsComponent { + @Input() chatId: string = ''; + @Input() openOnSecondaryChat: boolean = false; + @Input() viewWidth: number = 0; + imageUrl: string = ''; + + constructor( + public downloadFilesService: DownloadFilesService, + private overlayService: OverlayService, + private sharedService: SharedService + ) {} + + RESPONSIVE_THRESHOLD = this.sharedService.RESPONSIVE_THRESHOLD; + + // Type of files: + // Img: PNG, GIF, JPG, JPEG + // Files: PDF, DOC, TXT + // Audio: MP3, WMA, WAV + // Video: MP4 + + /** + * Gets the file type from the given file name. + * @param {string} file - The name of the file. + * @returns {string} The file type extracted from the file name. + */ + getFileType(file: string): string { + const extension = file.split('.').pop()?.toLowerCase(); + const getTag = extension!.split('?')[0]; + return getTag || ''; + } + + /** + * Shows an overlay using the provided file name. + * @param {string} file - The name of the file to display in the overlay. + * @returns {void} + */ + showOverlay(file: string) { + this.overlayService.setOverlayData(file); + } +} diff --git a/src/app/components/main-chat/single-chat/edit-msg/edit-msg.component.html b/src/app/components/main-chat/single-chat/edit-msg/edit-msg.component.html new file mode 100644 index 0000000..91ba9df --- /dev/null +++ b/src/app/components/main-chat/single-chat/edit-msg/edit-msg.component.html @@ -0,0 +1,65 @@ +
+ + + @if(isEmojiPickerVisible) { + + } + +
+ + diff --git a/src/app/components/main-chat/single-chat/edit-msg/edit-msg.component.scss b/src/app/components/main-chat/single-chat/edit-msg/edit-msg.component.scss new file mode 100644 index 0000000..608fe1e --- /dev/null +++ b/src/app/components/main-chat/single-chat/edit-msg/edit-msg.component.scss @@ -0,0 +1,162 @@ +@import "../../../../../styles.scss"; + +form { + position: relative; + width: calc(100% - 24px); + textarea { + width: calc(100% - 6px); + height: 100px; + border: 0; + border-radius: 20px; + font-size: 18px; + font-weight: 400; + padding: 12px; + resize: none; + &:focus { + outline: none; + } + &:invalid { + border: 1px solid red; + } + } +} + +app-emoji-picker { + position: absolute; + bottom: 50px; + left: 20px; + z-index: 5; +} + +app-small-btn { + padding: 9px; +} + +.footer { + display: flex; + justify-content: space-between; + align-items: end; + width: 100%; +} + +.btns { + padding: 12px 0; + .btn { + padding: 9px 15px; + border-radius: 50px; + border: 1px solid #6971f5; + background-color: #6971f5; + color: #fff; + font-size: 18px; + font-weight: 700; + cursor: pointer; + &:disabled { + background-color: #686868; + } + &:first-child { + margin-right: 12px; + background-color: #fff; + color: #6971f5; + } + &:hover { + background-color: #444df2; + border-color: #444df2; + color: #fff; + &:disabled { + background-color: #686868; + } + } + } +} + +.interactIcons { + cursor: pointer; + transition: filter 0.3s ease; + padding: 8px; + &:hover { + scale: 1.1; + background-color: #b7bae7; + border-radius: 50%; + filter: brightness(120%); + } +} + +.disabledIcon { + filter: brightness(0) saturate(100%) invert(45%) sepia(75%) saturate(684%) + hue-rotate(204deg) brightness(101%) contrast(91%); +} + +.files { + position: absolute; + padding-top: 12px; + top: 0; + right: -24px; +} + +.fileBox { + border: 1px solid #e5e5e5; + border-radius: 10px; + padding: 5px 10px; + margin-bottom: 6px; + background-color: #eee; + max-width: 40px; + max-height: 20px; + margin-right: 12px; + position: relative; + display: flex; + justify-content: center; + align-items: center; + .fileIcons { + margin-left: 12px; + margin-right: 12px; + cursor: pointer; + &:hover { + filter: brightness(0) saturate(100%) invert(20%) sepia(40%) + saturate(6312%) hue-rotate(236deg) brightness(106%) contrast(90%); + } + } +} + +.closeIcon { + position: absolute; + top: -4px; + right: -4px; + width: 16px; + object-fit: contain; + cursor: pointer; + &:hover { + filter: brightness(0) saturate(100%) invert(20%) sepia(78%) saturate(5090%) + hue-rotate(5deg) brightness(105%) contrast(103%); + } +} + +@media screen and (max-width: $RESPONSIVE_THRESHOLD_MOBILE) { + .btns { + padding: 6px 0; + .btn { + padding: 6px 12px; + border-radius: 40px; + font-size: 14px; + &:first-child { + margin-right: 6px; + } + } + } + + app-small-btn { + padding: 6px; + } + + form { + width: calc(100% - 12px); + } +} + +@media screen and (max-width: 360px) { + .btns { + .btn { + padding: 4px 8px; + font-size: 12px; + } + } +} diff --git a/src/app/components/main-chat/single-chat/edit-msg/edit-msg.component.spec.ts b/src/app/components/main-chat/single-chat/edit-msg/edit-msg.component.spec.ts new file mode 100644 index 0000000..9183647 --- /dev/null +++ b/src/app/components/main-chat/single-chat/edit-msg/edit-msg.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { EditMsgComponent } from './edit-msg.component'; + +describe('EditMsgComponent', () => { + let component: EditMsgComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [EditMsgComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(EditMsgComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/components/main-chat/single-chat/edit-msg/edit-msg.component.ts b/src/app/components/main-chat/single-chat/edit-msg/edit-msg.component.ts new file mode 100644 index 0000000..6ea074f --- /dev/null +++ b/src/app/components/main-chat/single-chat/edit-msg/edit-msg.component.ts @@ -0,0 +1,160 @@ +import { + Component, + EventEmitter, + HostListener, + Input, + Output, +} from '@angular/core'; +import { + Chat, + ChatAnswers, + ChatReactions, +} from '../../../../interface/chat.interface'; +import { SingleChatComponent } from '../single-chat.component'; +import { CommonModule } from '@angular/common'; +import { FormsModule, NgForm } from '@angular/forms'; +import { ChatService } from '../../../../service/chat.service'; +import { PickerComponent } from '@ctrl/ngx-emoji-mart'; +import { SmallBtnComponent } from '../../../../shared/components/small-btn/small-btn.component'; +import { DownloadFilesService } from '../../../../service/download-files.service'; +import { EmojiPickerComponent } from '../../../../shared/components/emoji-picker/emoji-picker.component'; +import { UserService } from '../../../../service/user.service'; +import { TranslateModule } from '@ngx-translate/core'; +import { SharedService } from '../../../../service/shared.service'; + +@Component({ + selector: 'app-edit-msg', + standalone: true, + imports: [ + CommonModule, + FormsModule, + SingleChatComponent, + PickerComponent, + SmallBtnComponent, + EmojiPickerComponent, + TranslateModule, + ], + templateUrl: './edit-msg.component.html', + styleUrl: './edit-msg.component.scss', +}) +export class EditMsgComponent { + @Input() chat!: Chat | ChatAnswers; + @Input() viewWidth: number = 0; + @Input() openOnSecondaryChat: boolean = false; + @Output() closeEditMsgEmitter: EventEmitter = + new EventEmitter(); + + isEmojiPickerVisible: boolean | undefined; + public originalMessage: string = ''; + + constructor( + public chatService: ChatService, + public downloadFilesService: DownloadFilesService, + public userService: UserService, + private sharedService: SharedService + ) {} + + RESPONSIVE_THRESHOLD = this.sharedService.RESPONSIVE_THRESHOLD; + RESPONSIVE_THRESHOLD_MOBILE = this.sharedService.RESPONSIVE_THRESHOLD_MOBILE; + + ngOnInit() { + this.originalMessage = this.chat.message as string; + } + + /** + * Restore the original message and emit an event to close the edit message form. + */ + closeEditMsg() { + this.chat.message = this.originalMessage; + this.closeEditMsgEmitter.emit(false); + } + + /** + * Submit the edited message and update the chat. + * @param {string} chatId - The ID of the chat. + * @param {NgForm} form - The form containing the edited message. + */ + onSubmit(chatId: string, form: NgForm) { + this.chatService.updateChat(chatId, form.value); + this.closeEditMsg(); + } + + /** + * Submit the message when the Enter key is pressed. + * @param {KeyboardEvent} e - The keyboard event. + * @param {string} chatId - The ID of the chat. + * @param {NgForm} form - The form containing the message. + */ + sendMessageWithEnter(e: KeyboardEvent, chatId: string, form: NgForm) { + if (e.keyCode === 13) { + this.onSubmit(chatId, form); + } + } + + // EMOJI + + /** + * Add an emoji to the message. + * @param {any} $event - The emitted event containing the emoji. + */ + emojiOutputEmitter($event: any) { + this.addEmoji($event); + } + + /** + * Add an emoji to the message. + * @param {any} event - The emitted event containing the emoji. + */ + public addEmoji(event: any) { + this.chat.message = `${this.chat.message}${event}`; + this.isEmojiPickerVisible = false; + } + + /** + * Toggle the visibility of the emoji picker. + */ + toggleEmojiPicker() { + this.isEmojiPickerVisible = !this.isEmojiPickerVisible; + } + + // FILES + + /** + * Open the file in a new tab. + * @param {string} filePath - The path to the file. + */ + showCurrentFile(filePath: string) { + const url = filePath; + window.open(url, '_blank'); + } + + /** + * Get the type of file based on its extension. + * @param {string} filePath - The path to the file. + * @returns {string} - The path to the corresponding file icon. + */ + getFileType(filePath: string): string { + const fileName = filePath.split('?')[0].split('/').pop(); + + if (fileName) { + if (fileName.endsWith('.mp3')) { + return 'assets/img/mp3Icon.svg'; + } else if (fileName.endsWith('.jpg' || '.jpeg' || '.png' || '.gif')) { + return 'assets/img/imgIcon.svg'; + } else if (fileName.endsWith('.pdf' || '.doc' || '.txt')) { + return 'assets/img/pdfIcon.svg'; + } else if (fileName.endsWith('.mp4' || '.avi')) { + return 'assets/img/videoIcon.svg'; + } + } + return 'assets/img/documentIcon.svg'; + } + + /** + * Delete a file. + * @param {string} file - The file to be deleted. + */ + deleteFile(file: string) { + console.log('Deleted:' + file); + } +} diff --git a/src/app/components/main-chat/single-chat/options-menu/options-menu.component.html b/src/app/components/main-chat/single-chat/options-menu/options-menu.component.html new file mode 100644 index 0000000..b2b3fc2 --- /dev/null +++ b/src/app/components/main-chat/single-chat/options-menu/options-menu.component.html @@ -0,0 +1,137 @@ +
+ @if (!openOnSecondaryChat) { +
+ + + + + + + @if (!isPrivatChannel) { + + + } @if (user.id === userService.getCurrentUserId()) { + + + } +
+ + } @else { +
+ + @if (user.id === userService.getCurrentUserId()) { + + + } +
+ + } @if(isEmojiPickerVisible) { + + } +
diff --git a/src/app/components/main-chat/single-chat/options-menu/options-menu.component.scss b/src/app/components/main-chat/single-chat/options-menu/options-menu.component.scss new file mode 100644 index 0000000..dd15bc9 --- /dev/null +++ b/src/app/components/main-chat/single-chat/options-menu/options-menu.component.scss @@ -0,0 +1,137 @@ +@import "./../../../../../styles.scss"; + +.content { + display: flex; + align-items: center; + justify-content: center; + position: relative; + max-width: 256px; + width: fit-content; + height: 46px; + background-color: #fff; + padding: 3px 15px 3px 20px; + border: 1px solid rgba(0, 0, 0, 0.2); + border-top-left-radius: 25px; + border-top-right-radius: 25px; + border-bottom-left-radius: 25px; +} + +.nav { + display: flex; + align-items: center; + justify-content: center; + width: fit-content; + white-space: nowrap; + position: absolute; + top: 52px; + right: 0; + background-color: #fff; + padding: 10px 20px; + border: 1px solid rgba(0, 0, 0, 0.2); + border-top-left-radius: 30px; + border-bottom-left-radius: 30px; + border-bottom-right-radius: 30px; + p { + font-size: 21px; + font-weight: 600; + padding: 10px 20px; + border-radius: 30px; + cursor: pointer; + &:hover { + color: #545af1; + background-color: #edeefe; + } + &:nth-child(2) { + &:hover { + color: #fff; + background-color: #ed1f79; + } + } + } +} + +.navbar { + display: flex; + flex-direction: column; +} + +app-emoji-picker { + position: absolute; + top: 53px; + left: -80px; + z-index: 5; +} + +app-small-btn { + padding: 0 8px; +} + +.d-none { + display: none; +} + +.mirror { + transform: scaleX(-1); +} + +.secondaryChatPickerOffset { + left: -190px !important; +} + +/*------------- ANIMATION -------------*/ + +.animation-coming-in { + animation: coming-in 125ms ease-in-out forwards; +} + +.animation-coming-out { + animation: coming-out 125ms ease-in-out forwards; +} + +@keyframes coming-in { + 0% { + opacity: 0; + transform: translateY(-30px); + } + 100% { + opacity: 1; + transform: translateY(0); + } +} + +@keyframes coming-out { + 0% { + opacity: 1; + transform: translateY(0); + } + 100% { + opacity: 0; + transform: translateY(-30px); + } +} + +/*------------- RESPONSIVE -------------*/ + +@media screen and (max-width: $RESPONSIVE_THRESHOLD_MOBILE) { + .content { + height: 32px; + padding: 2px 10px 2px 14px; + border-top-left-radius: 17px; + border-top-right-radius: 17px; + border-bottom-left-radius: 17px; + } + + .nav { + top: 37px; + padding: 7px 14px; + border-top-left-radius: 21px; + border-bottom-left-radius: 21px; + border-bottom-right-radius: 21px; + p { + font-size: 18px; + font-weight: 600; + padding: 7px 14px; + border-radius: 21px; + } + } +} diff --git a/src/app/components/main-chat/single-chat/options-menu/options-menu.component.spec.ts b/src/app/components/main-chat/single-chat/options-menu/options-menu.component.spec.ts new file mode 100644 index 0000000..3914d34 --- /dev/null +++ b/src/app/components/main-chat/single-chat/options-menu/options-menu.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { OptionsMenuComponent } from './options-menu.component'; + +describe('OptionsMenuComponent', () => { + let component: OptionsMenuComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [OptionsMenuComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(OptionsMenuComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/components/main-chat/single-chat/options-menu/options-menu.component.ts b/src/app/components/main-chat/single-chat/options-menu/options-menu.component.ts new file mode 100644 index 0000000..5e0ac67 --- /dev/null +++ b/src/app/components/main-chat/single-chat/options-menu/options-menu.component.ts @@ -0,0 +1,200 @@ +import { CommonModule } from '@angular/common'; +import { Component, EventEmitter, Input, Output } from '@angular/core'; +import { SingleChatComponent } from '../single-chat.component'; +import { SmallBtnComponent } from '../../../../shared/components/small-btn/small-btn.component'; +import { ChatService } from '../../../../service/chat.service'; +import { EmojiPickerComponent } from '../../../../shared/components/emoji-picker/emoji-picker.component'; +import { UserService } from '../../../../service/user.service'; +import { ChatReactions } from '../../../../interface/chat.interface'; +import { User } from '../../../../interface/user.interface'; +import { SharedService } from '../../../../service/shared.service'; +import { TranslateModule } from '@ngx-translate/core'; + +@Component({ + selector: 'app-options-menu', + standalone: true, + imports: [ + CommonModule, + SingleChatComponent, + SmallBtnComponent, + EmojiPickerComponent, + TranslateModule, + ], + templateUrl: './options-menu.component.html', + styleUrl: './options-menu.component.scss', +}) +export class OptionsMenuComponent { + @Input() user: User = {} as User; + @Input() currentChat: string = ''; + @Input() openOnSecondaryChat: boolean = false; + @Input() isPrivatChannel: boolean = false; + @Input() viewWidth: number = 0; + @Output() editMsgEmitter: EventEmitter = new EventEmitter(); + + isNavOpen: boolean = false; + isEmojiPickerVisible: boolean = false; + + constructor( + public chatService: ChatService, + public userService: UserService, + private sharedService: SharedService + ) {} + + RESPONSIVE_THRESHOLD_MOBILE = this.sharedService.RESPONSIVE_THRESHOLD_MOBILE; + + /** + * Emits signal to edit message and toggles navigation. + */ + editMsg() { + this.editMsgEmitter.emit(true); + this.toggleNav(); + } + + /** + * Deletes message from specified database and toggles navigation. + * @param {string} database - The name of the database to delete from. + */ + deleteMsg(database: string) { + this.toggleNav(); + this.chatService.deleteData(this.currentChat, database); + } + + /** + * Emits emoji output event for a chat message. + * @param {*} $event - The event containing the emoji. + * @param {string} chatId - The ID of the chat message. + */ + emojiOutputEmitter($event: any, chatId: string) { + if (!this.checkExistEmojiOnChat(chatId, $event)) { + this.addNewReaction($event, chatId); + } + } + + /** + * Adds reaction icon to a chat message. + * @param {string} icon - The icon to add as reaction. + * @param {string} chatId - The ID of the chat message. + */ + addReactionIcon(icon: string, chatId: string) { + if (!this.checkExistEmojiOnChat(chatId, icon)) { + this.addNewReaction(icon, chatId); + } else { + const id = this.getReactionIcon(chatId, icon)[0].id; + if (id != undefined) { + this.toggleEmoji(id); + } + } + } + + /** + * Adds a new reaction to a chat message. + * @param {*} event - The event containing the reaction. + * @param {string} chatId - The ID of the chat message. + */ + addNewReaction(event: any, chatId: string) { + let reaction: ChatReactions = { + chatId: chatId, + icon: event, + userId: [this.userService.getCurrentUserId()], + }; + const { id, ...reactionWithoutId } = reaction; + this.chatService.createNewReaction(reactionWithoutId); + } + + /** + * Checks if a specific emoji exists on a chat message. + * @param {string} chatId - The ID of the chat message. + * @param {string} icon - The icon to check for existence. + * @returns {boolean} - True if the emoji exists, false otherwise. + */ + checkExistEmojiOnChat(chatId: string, icon: string) { + return this.getReaction(chatId).length > 0 && + this.getReactionIcon(chatId, icon).length > 0 + ? true + : false; + } + + /** + * Retrieves all reactions for a chat message. + * @param {string} chatId - The ID of the chat message. + * @returns {Array} - Array of reactions for the chat message. + */ + getReaction(chatId: string) { + return this.chatService.allChatReactions.filter( + (reaction) => reaction.chatId === chatId + ); + } + + /** + * Retrieves reactions with a specific icon for a chat message. + * @param {string} chatId - The ID of the chat message. + * @param {string} icon - The icon to filter reactions. + * @returns {Array} - Array of reactions with the specified icon. + */ + getReactionIcon(chatId: string, icon: string) { + const chat = this.getReaction(chatId); + return chat.filter((reaction) => reaction.icon == icon); + } + + /** + * Emits signal to toggle emoji picker visibility. + * @param {*} $event - The event containing the visibility state. + */ + emojiVisibleEmitter($event: any) { + this.isEmojiPickerVisible = $event; + } + + /** + * Toggles the navigation bar state. + */ + toggleNav() { + this.isNavOpen = !this.isNavOpen; + this.isEmojiPickerVisible = false; + } + + /** + * Toggles the secondary chat display. + * @param {string} chatId - The ID of the chat message. + */ + toggleSecondaryChat(chatId: string) { + this.chatService.toggleSecondaryChat(chatId); + this.isEmojiPickerVisible = false; + } + + /** + * Toggles the visibility of the emoji picker. + */ + toggleEmojiPicker() { + this.isEmojiPickerVisible = !this.isEmojiPickerVisible; + } + + /** + * Retrieves the document ID for a reaction. + * @param {string} chatId - The ID of the chat message. + * @returns {Array} - Array containing the reaction document ID. + */ + getReactionDocId(chatId: string) { + return this.chatService.allChatReactions.filter( + (reaction) => reaction.id === chatId + ); + } + + /** + * Toggles the reaction of a user on a chat message. + * @param {string} reactionID - The ID of the reaction. + */ + toggleEmoji(reactionID: string) { + const userIds = this.getReactionDocId(reactionID)[0].userId; + if (userIds.includes(this.userService.getCurrentUserId())) { + userIds.splice(userIds.indexOf(this.userService.getCurrentUserId()), 1); + if (userIds.length == 0) { + this.chatService.deleteData(reactionID, 'reactions'); + } else { + this.chatService.updateReaction(reactionID, userIds); + } + } else { + userIds.push(this.userService.getCurrentUserId()); + this.chatService.updateReaction(reactionID, userIds); + } + } +} diff --git a/src/app/components/main-chat/single-chat/reaction-emojis/reaction-emojis.component.html b/src/app/components/main-chat/single-chat/reaction-emojis/reaction-emojis.component.html new file mode 100644 index 0000000..fc9572d --- /dev/null +++ b/src/app/components/main-chat/single-chat/reaction-emojis/reaction-emojis.component.html @@ -0,0 +1,91 @@ +
+ + + @if(isEmojiPickerVisible) { + + } +
+ @for (reaction of getReaction(chat.id); track reaction; let i = $index) { + @if (reaction.id) { +
+ @if (reaction.icon === "okay" || reaction.icon === "clap-hands") { + + } @else { + + + } + {{ reaction.userId.length }} +
+ } } +
+ + + + @if (reactionDialogId != '') { @for (reaction of + getReactionDocId(reactionDialogId); track reaction) { +
+
+ @if (reaction.icon === "okay" || reaction.icon === "clap-hands") { + + } @else { + + } +
+
+ @for (reactionUId of getReactionDocId(reactionDialogId)[0].userId; track + reactionUId;) { +
+ {{ getUserId(reactionUId)[0].firstName }} + {{ getUserId(reactionUId)[0].lastName }} + @if (getUserId(reactionUId)[0].id == userService.getCurrentUserId()) { + (You)} +
+ } +
+ @if (getReactionDocId(reactionDialogId)[0].userId.length > 1) { +

{{ "reaction-emojis.react" | translate }}

+ } @else { +

{{ "reaction-emojis.react2" | translate }}

+ } +
+ } } +
diff --git a/src/app/components/main-chat/single-chat/reaction-emojis/reaction-emojis.component.scss b/src/app/components/main-chat/single-chat/reaction-emojis/reaction-emojis.component.scss new file mode 100644 index 0000000..0cb7b78 --- /dev/null +++ b/src/app/components/main-chat/single-chat/reaction-emojis/reaction-emojis.component.scss @@ -0,0 +1,134 @@ +@import "../../../../../styles.scss"; + +section { + display: flex; + position: relative; +} + +.emojiSection { + display: flex; + flex-wrap: wrap; + align-items: center; +} + +.emoji { + display: flex; + align-items: center; + justify-content: center; + margin: 6px; + background-color: #fff; + width: 44px; + height: 30px; + padding: 5px 12px; + border-radius: 20px; + border: 1px solid #adb0d9; + transition: 0.125s ease-in-out; + cursor: pointer; + img { + height: 24px; + width: auto; + } + span { + font-size: 16px; + font-weight: 400; + padding-left: 6px; + } + &:hover { + border-color: #444df2; + } +} + +.dialog { + position: fixed; + min-width: 158px; + width: fit-content; + min-height: 112px; + height: fit-content; + max-height: 300px; + padding: 15px 10px; + border-radius: 30px 0px 30px 30px; + z-index: 5; + background-color: #444df2; + .icon { + display: flex; + justify-content: center; + margin: 6px 0; + img { + width: 30px; + height: 30px; + } + } + .name { + padding: 6px 0; + font-size: 18px; + font-weight: 700; + color: #fff; + text-align: center; + .user { + padding: 2px 0; + } + } + p { + font-size: 16px; + font-weight: 400; + color: #fff; + text-align: center; + } +} + +.mirror { + transform: scaleX(-1); +} + +.emojiPickerFirstMsg { + position: absolute; + top: 50px; + left: 20px; + z-index: 3; + width: fit-content; +} + +.emojiPickerAnswerMsg { + position: absolute; + bottom: 50px; + left: 20px; + z-index: 3; + width: fit-content; +} + +ngx-emoji { + display: flex; + align-items: center; +} + +app-small-btn { + display: flex; + align-items: top; + justify-content: center; + margin: 6px; +} + +/*------------- RESPONSIVE -------------*/ + +@media screen and (max-width: $RESPONSIVE_THRESHOLD_MOBILE) { + .emoji { + width: 36px; + height: 24px; + padding: 5px 12px; + border-radius: 20px; + img { + height: 20px; + width: auto; + } + span { + font-size: 14px; + } + } + + ngx-emoji { + display: flex; + align-items: center; + height: 20px !important; + width: auto !important; + } +} diff --git a/src/app/components/main-chat/single-chat/reaction-emojis/reaction-emojis.component.spec.ts b/src/app/components/main-chat/single-chat/reaction-emojis/reaction-emojis.component.spec.ts new file mode 100644 index 0000000..e610509 --- /dev/null +++ b/src/app/components/main-chat/single-chat/reaction-emojis/reaction-emojis.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ReactionEmojisComponent } from './reaction-emojis.component'; + +describe('ReactionEmojisComponent', () => { + let component: ReactionEmojisComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [ReactionEmojisComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(ReactionEmojisComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/components/main-chat/single-chat/reaction-emojis/reaction-emojis.component.ts b/src/app/components/main-chat/single-chat/reaction-emojis/reaction-emojis.component.ts new file mode 100644 index 0000000..5eb23a1 --- /dev/null +++ b/src/app/components/main-chat/single-chat/reaction-emojis/reaction-emojis.component.ts @@ -0,0 +1,225 @@ +import { + AfterViewInit, + Component, + ElementRef, + HostListener, + Input, + ViewChild, +} from '@angular/core'; +import { SmallBtnComponent } from '../../../../shared/components/small-btn/small-btn.component'; +import { CommonModule } from '@angular/common'; +import { + Chat, + ChatAnswers, + ChatReactions, +} from '../../../../interface/chat.interface'; +import { UserService } from '../../../../service/user.service'; +import { ChatService } from '../../../../service/chat.service'; +import { ChannleService } from '../../../../service/channle.service'; +import { EmojiPickerComponent } from '../../../../shared/components/emoji-picker/emoji-picker.component'; +import { EmojiComponent } from '@ctrl/ngx-emoji-mart/ngx-emoji'; +import { timeInterval } from 'rxjs'; +import { User } from '../../../../interface/user.interface'; +import { SharedService } from '../../../../service/shared.service'; +import { TranslateModule } from '@ngx-translate/core'; + +@Component({ + selector: 'app-reaction-emojis', + standalone: true, + imports: [ + CommonModule, + SmallBtnComponent, + EmojiPickerComponent, + EmojiComponent, + TranslateModule, + ], + templateUrl: './reaction-emojis.component.html', + styleUrl: './reaction-emojis.component.scss', +}) +export class ReactionEmojisComponent { + @Input() user: User = {} as User; + @Input() chat: Chat | ChatAnswers = {} as Chat | ChatAnswers; + @Input() openOnSecondaryChat: boolean = false; + @Input() secondaryChatFirstMsg: boolean = false; + @Input() viewWidth: number = 0; + + reactionDialogId: string = ''; + reactionDialogLeft = 0; + isEmojiPickerVisible: boolean = false; + emojiSectionWidth: number = 0; + dialogX: number = 0; + dialogY: number = 0; + + constructor( + private elementRef: ElementRef, + public userService: UserService, + private chatService: ChatService, + private sharedService: SharedService + ) {} + + RESPONSIVE_THRESHOLD_MOBILE = this.sharedService.RESPONSIVE_THRESHOLD_MOBILE; + + /** + * Emits an emoji output event. + * @param {any} $event - The emoji event. + * @param {string} chatId - The ID of the chat. + */ + emojiOutputEmitter($event: any, chatId: string) { + if (!this.checkExistEmojiOnChat(chatId, $event)) { + let reaction: ChatReactions = { + chatId: chatId, + icon: $event, + userId: [this.userService.getCurrentUserId()], + }; + const { id, ...reactionWithoutId } = reaction; + this.chatService.createNewReaction(reactionWithoutId); + } + } + + /** + * Emits an event indicating the visibility of the emoji picker. + * @param {any} $event - The visibility event. + */ + emojiVisibleEmitter($event: any) { + this.isEmojiPickerVisible = $event; + } + + /** + * Opens a dialog for a reaction. + * @param {any} reactionId - The ID of the reaction. + * @param {MouseEvent} event - The mouse event triggering the dialog. + */ + openDialog(reactionId: any, event: MouseEvent) { + this.reactionDialogId = reactionId; + this.updateDialogPosition(event); + } + + /** + * Closes the currently opened dialog. + */ + closeDialog() { + this.reactionDialogId = ''; + } + + /** + * Updates the position of the dialog based on the mouse event. + * @param {MouseEvent} event - The mouse event triggering the update. + */ + updateDialogPosition(event: MouseEvent) { + const currentTarget = event.currentTarget as HTMLElement; + if (currentTarget) { + const rect = currentTarget.getBoundingClientRect(); + this.dialogX = event.clientX - 200; + this.dialogY = event.clientY + 10; + } + } + + /** + * Checks if a given emoji exists on a chat. + * @param {string} chatId - The ID of the chat. + * @param {string} icon - The icon to check. + * @returns {boolean} True if the emoji exists, otherwise false. + */ + checkExistEmojiOnChat(chatId: string, icon: string) { + return this.getReaction(chatId).length > 0 && + this.getReactionIcon(chatId, icon).length > 0 + ? true + : false; + } + + /** + * Finds the index of an element in an array. + * @param {any[]} array - The array to search in. + * @param {any} element - The element to find the index of. + * @returns {number} The index of the element in the array. + */ + indexOfArray(array: any[], element: any): number { + return array.indexOf(element); + } + + /** + * Retrieves all reactions for a given chat. + * @param {string} chatId - The ID of the chat. + * @returns {ChatReactions[]} All reactions for the chat. + */ + getReaction(chatId: string) { + return this.chatService.allChatReactions.filter( + (reaction) => reaction.chatId === chatId + ); + } + + /** + * Retrieves reactions with a specific icon for a given chat. + * @param {string} chatId - The ID of the chat. + * @param {string} icon - The icon to filter by. + * @returns {ChatReactions[]} Reactions with the specified icon for the chat. + */ + getReactionIcon(chatId: string, icon: string) { + const chat = this.getReaction(chatId); + return chat.filter((reaction) => reaction.icon == icon); + } + + /** + * Retrieves the reaction document ID for a given chat. + * @param {string} chatId - The ID of the chat. + * @returns {ChatReactions[]} The reaction document ID for the chat. + */ + getReactionDocId(chatId: string) { + return this.chatService.allChatReactions.filter( + (reaction) => reaction.id === chatId + ); + } + + /** + * Counts the number of reaction document IDs for a given chat. + * @param {string} chatId - The ID of the chat. + * @returns {number} The count of reaction document IDs for the chat. + */ + countReactionDocId(chatId: string) { + let count = 0; + this.chatService.allChatReactions.forEach((reaction) => { + if (reaction.id === chatId) { + count++; + } + }); + return count; + } + + /** + * Retrieves user information based on user ID. + * @param {string} userId - The ID of the user. + * @returns {User[]} User information for the given user ID. + */ + getUserId(userId: string) { + const filteredUser = this.userService + .getUsers() + .filter((user) => user.id == userId); + return filteredUser; + } + + /** + * Toggles the presence of a user's reaction to a chat. + * @param {string} reactionID - The ID of the reaction. + */ + toggleEmoji(reactionID: string) { + const userIds = this.getReactionDocId(reactionID)[0].userId; + if (userIds.includes(this.userService.getCurrentUserId())) { + userIds.splice(userIds.indexOf(this.userService.getCurrentUserId()), 1); + if (userIds.length == 0) { + this.chatService.deleteData(reactionID, 'reactions'); + } else { + this.chatService.updateReaction(reactionID, userIds); + } + } else { + userIds.push(this.userService.getCurrentUserId()); + this.chatService.updateReaction(reactionID, userIds); + } + } + + /** + * Toggles the visibility of the emoji picker. + */ + toggleEmojiPicker() { + this.isEmojiPickerVisible = !this.isEmojiPickerVisible; + } +} diff --git a/src/app/components/main-chat/single-chat/single-chat.component.html b/src/app/components/main-chat/single-chat/single-chat.component.html new file mode 100644 index 0000000..0b6fec5 --- /dev/null +++ b/src/app/components/main-chat/single-chat/single-chat.component.html @@ -0,0 +1,147 @@ +
+ @if (firstLoadOptionMenu) { + + > + } +
+
+ +
+ @if (!isMsgEditFormOpen) { +
+
+ {{ user.firstName }} {{ user.lastName }} + + @if(openOnSecondaryChat) { + {{ convertTimestampDate(chat.publishedTimestamp) }} } + {{ convertTimestampHour(chat.publishedTimestamp) }} +
+
+
+ {{ chat.message }} + @if (chat.edited) { + {{ "single-chat.edit" | translate }} + } +
+ +
+ @if (!isPrivatChannel) { +
+ @if (chatService.getChatAnswers(chat.id).length > 0 && showAnswer) { + @if(chatService.getChatAnswers(chat.id).length == 1) { +

+ {{ displayCountChatAnswer() }} + {{ "single-chat.answer2" | translate }} +

+ {{ "single-chat.answer3" | translate }} + {{ displayLastChatAnswer() }} + } @else { +

+ {{ displayCountChatAnswer() }} + {{ "single-chat.answer" | translate }} +

+ {{ "single-chat.answer3" | translate }} + {{ displayLastChatAnswer() }} + } } @else if (showAnswer) { +

+ {{ "single-chat.answer4" | translate }} +

+ } +
+ } @else { +
+ } + +
+ } @else { +
+ +
+ } +
+
diff --git a/src/app/components/main-chat/single-chat/single-chat.component.scss b/src/app/components/main-chat/single-chat/single-chat.component.scss new file mode 100644 index 0000000..7b82964 --- /dev/null +++ b/src/app/components/main-chat/single-chat/single-chat.component.scss @@ -0,0 +1,216 @@ +@import "../../../../styles.scss"; + +section { + display: flex; + justify-content: flex-start; + padding: 32px 48px; + position: relative; + &:hover { + background-color: #edeefe; + .userContent { + .content { + background-color: #fff; + } + } + } +} + +.chat { + display: flex; + flex-direction: column; +} + +.menuRightSide { + position: absolute; + top: -24px; + right: 12px; + z-index: 2; +} + +.menuLeftSide { + position: absolute; + top: -24px; + left: 12px; + z-index: 2; +} + +.chatBox { + display: flex; + width: 100%; + max-width: 100%; +} + +.userAvatar { + img { + width: 70px; + height: 70px; + border-radius: 100%; + } +} + +.chat { + .name { + display: flex; + align-items: center; + font-size: 18px; + font-weight: 700; + span { + font-size: 14px; + font-weight: 400; + } + } + + .content { + max-width: 100%; + overflow-x: auto; + margin-top: 6px; + padding: 12px; + font-size: 18px; + font-weight: 400; + border-top-right-radius: 24px; + border-bottom-left-radius: 24px; + border-bottom-right-radius: 24px; + background-color: #eceefe; + .msg { + position: relative; + width: fit-content; + span { + font-size: 12px; + font-style: italic; + } + } + app-attachments  { + height: 200px; + } + } +} + +.content-mirror { + color: #fff; + border-top-left-radius: 24px; + border-top-right-radius: 0 !important; + background-color: #797ef3 !important; +} + +.answers { + display: flex; + align-items: center; + margin: 12px 0 6px 0; + p { + margin-right: 2px; + font-size: 18px; + font-weight: 400; + color: #535af1; + cursor: pointer; + &:hover { + margin-right: 0; + font-weight: 700; + color: #444df2; + } + } + span { + padding-left: 12px; + font-size: 14px; + font-weight: 400; + } +} + +.spacer { + margin: 9px; +} + +.editForm { + width: 100%; + border-radius: 20px; + background-color: #fff; + border: 1px solid rgba(0, 0, 0, 0.2); +} + +/*------------- ANIMATION -------------*/ + +.animation-coming-in-left { + animation: coming-in-left 125ms ease-in-out forwards; +} + +.animation-coming-in-right { + animation: coming-in-right 125ms ease-in-out forwards; +} + +.animation-coming-out-left { + animation: coming-out-left 125ms ease-in-out forwards; +} +.animation-coming-out-right { + animation: coming-out-right 125ms ease-in-out forwards; +} + +@keyframes coming-in-left { + 0% { + opacity: 0; + transform: translateX(-12px); + } + 100% { + opacity: 1; + transform: translateX(0); + } +} + +@keyframes coming-out-left { + 0% { + opacity: 1; + transform: translateX(0); + } + 100% { + opacity: 0; + transform: translateX(-12px); + } +} + +@keyframes coming-in-right { + 0% { + opacity: 0; + transform: translateX(12px); + } + 100% { + opacity: 1; + transform: translateX(0); + } +} + +@keyframes coming-out-right { + 0% { + opacity: 1; + transform: translateX(0); + } + 100% { + opacity: 0; + transform: translateX(12px); + } +} + +/*------------- RESPONSIVE -------------*/ + +@media screen and (max-width: $RESPONSIVE_THRESHOLD_MOBILE) { + section { + padding: 24px 12px; + } + + .userAvatar { + img { + width: 50px; + height: 50px; + } + } + + .content { + font-size: 17px; + } + + .answers { + p { + font-size: 14px; + } + span { + font-size: 12px; + } + } +} diff --git a/src/app/components/main-chat/single-chat/single-chat.component.spec.ts b/src/app/components/main-chat/single-chat/single-chat.component.spec.ts new file mode 100644 index 0000000..196e52a --- /dev/null +++ b/src/app/components/main-chat/single-chat/single-chat.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SingleChatComponent } from './single-chat.component'; + +describe('SingleChatComponent', () => { + let component: SingleChatComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [SingleChatComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(SingleChatComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/components/main-chat/single-chat/single-chat.component.ts b/src/app/components/main-chat/single-chat/single-chat.component.ts new file mode 100644 index 0000000..f1960e8 --- /dev/null +++ b/src/app/components/main-chat/single-chat/single-chat.component.ts @@ -0,0 +1,176 @@ +import { Component, EventEmitter, Input, Output } from '@angular/core'; +import { User } from '../../../interface/user.interface'; +import { Chat, ChatAnswers } from '../../../interface/chat.interface'; +import { ChatContentComponent } from '../chat-content/chat-content.component'; +import { CommonModule, NgSwitchCase } from '@angular/common'; +import { ChatService } from '../../../service/chat.service'; +import { DownloadFilesService } from '../../../service/download-files.service'; +import { NgxExtendedPdfViewerModule } from 'ngx-extended-pdf-viewer'; +import { OptionsMenuComponent } from './options-menu/options-menu.component'; +import { AttachmentsComponent } from './attachments/attachments.component'; +import { ChatMsgBoxComponent } from '../chat-msg-box/chat-msg-box.component'; +import { SmallBtnComponent } from '../../../shared/components/small-btn/small-btn.component'; +import { FormsModule, NgForm } from '@angular/forms'; +import { PickerComponent } from '@ctrl/ngx-emoji-mart'; +import { EditMsgComponent } from './edit-msg/edit-msg.component'; +import { ReactionEmojisComponent } from './reaction-emojis/reaction-emojis.component'; +import { UserService } from '../../../service/user.service'; +import { TranslateModule } from '@ngx-translate/core'; + +@Component({ + selector: 'app-single-chat', + standalone: true, + imports: [ + ChatContentComponent, + CommonModule, + FormsModule, + NgSwitchCase, + NgxExtendedPdfViewerModule, + OptionsMenuComponent, + AttachmentsComponent, + ChatMsgBoxComponent, + SmallBtnComponent, + PickerComponent, + EditMsgComponent, + ReactionEmojisComponent, + TranslateModule, + ], + templateUrl: './single-chat.component.html', + styleUrl: './single-chat.component.scss', +}) +export class SingleChatComponent { + @Input() user: User = {} as User; + @Input() chat: Chat | ChatAnswers = {} as Chat | ChatAnswers; + @Input() index: number = 0; + @Input() currentChat: string = ''; + @Input() isPrivatChannel: boolean = false; + @Input() showAnswer: boolean = false; + @Input() openOnSecondaryChat: boolean = false; + @Input() secondaryChatFirstMsg: boolean = false; + @Input() viewWidth: number = 0; + + trustedUrl: string = ''; + isOptionMenuVisible: boolean = false; + isMsgEditFormOpen: boolean = false; + firstLoadOptionMenu: boolean = false; + + constructor( + public chatService: ChatService, + public channelService: ChatService, + public userService: UserService, + public downloadFilesService: DownloadFilesService + ) {} + + /** + * Emits a signal to edit a message. + * @param {boolean} variable - The value indicating whether the message edit form should be open or not. + */ + editMsgEmitter(variable: boolean) { + this.isMsgEditFormOpen = variable; + } + + /** + * Emits a signal to close the message edit form and hide the option menu. + * @param {boolean} value - The value indicating whether the message edit form should be closed. + */ + closeEditMsgEmitter(value: boolean) { + this.isMsgEditFormOpen = value; + this.hideOptionMenu(); + } + + /** + * Shows the option menu. + */ + showOptionMenu() { + this.isOptionMenuVisible = true; + this.firstLoadOptionMenu = true; + } + + /** + * Hides the option menu. + */ + hideOptionMenu() { + this.isOptionMenuVisible = false; + this.firstLoadOptionMenu = true; + } + + /** + * Displays the count of chat answers. + * @returns {number} The count of chat answers. + */ + displayCountChatAnswer() { + return this.chatService.getChatAnswers(this.chat.id).length; + } + + /** + * Displays the timestamp of the last chat answer in a formatted time. + * @returns {string|null} The formatted time of the last chat answer. + */ + displayLastChatAnswer() { + const getChatAnswers = this.chatService.getChatAnswers(this.chat.id); + const lastChatAnswer = getChatAnswers[getChatAnswers.length - 1]; + if (lastChatAnswer) { + return this.convertTimestampHour(lastChatAnswer.publishedTimestamp); + } + return null; + } + + /** + * Converts a timestamp to a formatted time string. + * @param {number} timestamp - The timestamp to convert. + * @returns {string} The formatted time string. + */ + convertTimestampHour(timestamp: number) { + const date = new Date(timestamp * 1000); + let hour = date.getHours(); + const minute = ('0' + date.getMinutes()).slice(-2); + const period = hour >= 12 ? 'PM' : 'AM'; + hour = hour % 12 || 12; + + let hourWithNull = ('0' + hour).slice(-2); + + const formattedTime = `${hourWithNull}:${minute} ${period}`; + return formattedTime; + } + + /** + * Converts a timestamp to a formatted date string. + * @param {number} timestamp - The timestamp to convert. + * @returns {string} The formatted date string. + */ + convertTimestampDate(timestamp: number) { + const currentDate = new Date(); + const inputDate = new Date(timestamp * 1000); + const months = [ + 'Jan.', + 'Feb.', + 'Mar.', + 'Apr.', + 'May.', + 'Jun.', + 'Jul.', + 'Aug.', + 'Sep.', + 'Oct.', + 'Nov.', + 'Dec.', + ]; + + const dayNumber = inputDate.getDate(); + const month = months[inputDate.getMonth()]; + + if (inputDate.toDateString() === currentDate.toDateString()) { + return `Today`; + } else { + return `${dayNumber} ${month}`; + } + } + + /** + * Opens a secondary chat. + * @param {string} chatId - The ID of the secondary chat to open. + */ + openSecondaryChat(chatId: string) { + this.chatService.toggleSecondaryChat(chatId); + } +} diff --git a/src/app/components/main-login/choose-avatar/choose-avatar.component.html b/src/app/components/main-login/choose-avatar/choose-avatar.component.html new file mode 100644 index 0000000..d096f2c --- /dev/null +++ b/src/app/components/main-login/choose-avatar/choose-avatar.component.html @@ -0,0 +1,57 @@ +
+ +
+
+
+ + +
+ {{ 'chooseAvatar.header' | translate }} +
+ +
+ Avatar + {{ loginService.firstName }} {{ loginService.lastName }} +
+
+ +
+
+
{{ 'chooseAvatar.avatarInfo' | translate }}
+
+ +
+
+ +
+
{{ 'chooseAvatar.ownAvatar' | translate }}
+
+ +
+
+ +
+ +
+
+ +
diff --git a/src/app/components/main-login/choose-avatar/choose-avatar.component.scss b/src/app/components/main-login/choose-avatar/choose-avatar.component.scss new file mode 100644 index 0000000..ac8a4ac --- /dev/null +++ b/src/app/components/main-login/choose-avatar/choose-avatar.component.scss @@ -0,0 +1,146 @@ +@import "../../../shared/components/login/mixins/mixin.scss"; +* { + font-family: Nunito; +} + +.avatarSektion { + @include SektionBody; +} +.avatarContainer { + @include Card; +} +.avatarTop { + @include topText; + > span { + width: 90%; + padding-right: 48px; + } +} +.viewAvatarContainer { + display: flex; + flex-direction: column; + text-align: center; + align-items: center; + gap: 24px; + > img { + height: 168px; + width: 168px; + border-radius: 100%; + object-fit: cover; + } + > span { + font-size: 32px; + font-weight: 700; + } +} +.chooseAvatarContainer { + gap: 16px; + display: flex; + flex-direction: column; + margin-bottom: 8px; + > div { + display: flex; + gap: 4px; + > span { + font-size: 20px; + font-weight: 400; + } + > img { + height: 72px; + border-radius: 100%; + border: 4px solid #ffff; + cursor: pointer; + &:hover { + border: 4px solid #cacad6; + } + } + } +} +.ownAvatarContainer { + display: flex; + gap: 32px; + margin-right: 67px; + > div { + display: flex; + align-items: center; + font-size: 20px; + font-weight: 400; + } +} +.BtnUpload { + background-color: #ffff; + color: #444df2; + border: 1px solid #444df2; + cursor: pointer; + &:hover { + background-color: #444df2; + color: #ffff; + } +} + +.avatarBottom { + display: flex; + justify-content: end; + + width: 100%; +} + +button { + @include buttonGrey; + cursor: pointer; +} +.hoverBtn { + &:hover { + background-color: #676eec; + } +} +@media (max-width: 570px) { + .avatarTop { + margin-bottom: 0; + + > span { + font-size: 32px; + white-space: nowrap; + } + } + .viewAvatarContainer { + > img { + height: 148px; + width: 148px; + } + } + .chooseAvatarContainer { + width: 100%; + } + .mobileImgContainer { + overflow: auto; + } + .ownAvatarContainer { + margin-right: 0; + gap: 16px; + flex-direction: column; + } + .avatarBottom { + margin-top: 8px; + } + .BtnUpload { + &:hover { + background-color: #ffff; + color: #444df2; + } + } + .hoverBtn { + background-color: #676eec; + } + @media (max-width: 380px) { + .avatarContainer { + max-width: 306px; + } + .avatarTop { + width: 95%; + > span { + font-size: 24px; + } + } + } +} diff --git a/src/app/components/main-login/choose-avatar/choose-avatar.component.spec.ts b/src/app/components/main-login/choose-avatar/choose-avatar.component.spec.ts new file mode 100644 index 0000000..7f95706 --- /dev/null +++ b/src/app/components/main-login/choose-avatar/choose-avatar.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ChooseAvatarComponent } from './choose-avatar.component'; + +describe('ChooseAvatarComponent', () => { + let component: ChooseAvatarComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [ChooseAvatarComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(ChooseAvatarComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/components/main-login/choose-avatar/choose-avatar.component.ts b/src/app/components/main-login/choose-avatar/choose-avatar.component.ts new file mode 100644 index 0000000..d73b0a9 --- /dev/null +++ b/src/app/components/main-login/choose-avatar/choose-avatar.component.ts @@ -0,0 +1,96 @@ +import { Component, inject } from '@angular/core'; +import { FooterComponent } from '../../../shared/components/login/footer/footer.component'; +import { RouterModule } from '@angular/router'; +import { SmallBtnComponent } from '../../../shared/components/small-btn/small-btn.component'; +import { getStorage, ref, uploadBytes, getDownloadURL } from 'firebase/storage'; +import { Firestore } from '@angular/fire/firestore'; +import { CommonModule } from '@angular/common'; +import { loginService } from '../../../service/login.service'; +import { StartHeaderComponent } from '../../../shared/components/login/start-header/start-header.component'; +import { TranslateModule } from '@ngx-translate/core'; + +@Component({ + selector: 'app-choose-avatar', + standalone: true, + templateUrl: './choose-avatar.component.html', + styleUrl: './choose-avatar.component.scss', + imports: [ + StartHeaderComponent, + FooterComponent, + RouterModule, + SmallBtnComponent, + CommonModule, + TranslateModule, + ], +}) +export class ChooseAvatarComponent { + avatarSrc: string = './assets/img/user-icons/guest.svg'; + firestore: Firestore = inject(Firestore); + selectedFile: File | null = null; + avatarImages: string[] = [ + './assets/img/user-icons/female-1.svg', + './assets/img/user-icons/female-2.svg', + './assets/img/user-icons/male-1.svg', + './assets/img/user-icons/male-2.svg', + './assets/img/user-icons/male-3.svg', + './assets/img/user-icons/male-4.svg', + ]; + + constructor(public loginService: loginService) {} + + /** + * Handles file selection changes and initiates the upload of the avatar. + * @param event The DOM event containing the file selection. + */ + onFileChange(event: Event) { + const inputElement = event.target as HTMLInputElement; + + if (inputElement.files && inputElement.files[0]) { + const file = inputElement.files[0]; + + if (!file.type.startsWith('image/')) { + console.error('Datei ist kein Bild.'); + return; + } + this.selectedFile = file; + const reader = new FileReader(); + reader.onload = (e: any) => { + this.avatarSrc = e.target.result; + }; + reader.readAsDataURL(file); + this.uploadFile(file); + } + } + + /** + * Uploads the selected file to Firebase Storage. + * @param file The file to be uploaded. + */ + uploadFile(file: File) { + const storage = getStorage(); + const storageRef = ref(storage, 'avatars/' + file.name); + uploadBytes(storageRef, file) + .then((snapshot) => { + getDownloadURL(ref(storage, 'avatars/' + file.name)) + .then((url) => { + this.avatarSrc = url; + this.loginService.getAvatarUrl(url); + }) + .catch((error) => + console.error('Fehler beim Abrufen der Download-URL:', error) + ); + }) + .catch((error) => { + console.error('Fehler beim Hochladen:', error); + }); + } + + /** + * Selects an avatar from the list of predefined avatars. + * @param index Index of the chosen avatar in the avatarImages list. + */ + chooseExistAvatar(index: number) { + this.avatarSrc = this.avatarImages[index]; + this.loginService.getAvatarUrl(this.avatarSrc); + } +} diff --git a/src/app/components/main-login/login/login.component.html b/src/app/components/main-login/login/login.component.html new file mode 100644 index 0000000..4476587 --- /dev/null +++ b/src/app/components/main-login/login/login.component.html @@ -0,0 +1,102 @@ +
+ +
+
+ {{ "login.header" | translate }} +
+
+ {{ "login.infoText" | translate }} +
+
+
+ + + @if (!emailField.valid && emailField.touched) { +

{{ "login.errorText" | translate }}

+ } +
+
+ + + Toggle visibility + @if (!passwordField.valid && passwordField.touched) { +

{{ "login.errorText2" | translate }}

+ } @if (loginService.errorMessage) { +

{{ loginService.errorMessage }}

+ } +
+ +
+ {{ + "login.midText" | translate + }} +
+ +
+
+ {{ "login.midSeperator" | translate }} +
+
+ +
+ + {{ "login.googleBtn" | translate }} +
+ +
+ + +
+
+
+
+
+ {{ "login.topText" | translate }} +
+ + {{ "login.topText2" | translate }} +
+
+
+ +
diff --git a/src/app/components/main-login/login/login.component.scss b/src/app/components/main-login/login/login.component.scss new file mode 100644 index 0000000..ec25642 --- /dev/null +++ b/src/app/components/main-login/login/login.component.scss @@ -0,0 +1,249 @@ +@import "../../../shared/components/login/mixins/mixin.scss"; +.startIntroScrollProtect { + overflow-x: hidden; + overflow-y: hidden; +} +.loginSektion { + @include SektionBody; +} +.loginContainer { + @include Card; +} +.loginTop { + @include topText; +} + +.loginBackImg { + cursor: pointer; +} +.loginInfoText { + @include InfoText; +} +.inputContainer { + position: relative; + margin-bottom: 32px; +} +.iconP { + position: absolute; + top: 18px; + left: 20px; +} +.inputField { + @include inputStyle; +} +.error { + @include errorStyle; +} +.contactForm { + width: 90%; +} +.passwordContainer { + text-align: center; + color: rgba(121, 126, 243, 1); + font-size: 18px; + margin-bottom: 32px; + margin-top: 40px; + > span { + font-family: Figtree, sans-serif, Nunito; + color: #797ef3; + &:hover { + cursor: pointer; + font-weight: 500; + background-color: #eceefe; + padding: 12px 16px 12px 16px; + border-radius: 100px; + color: #444df2; + } + } +} +.separatorContainer { + display: flex; + justify-content: center; + align-items: baseline; + gap: 10px; + font-size: 18px; + margin-bottom: 32px; + > div { + border: 1px solid #adb0d9; + width: 42%; + height: 0px; + display: flex; + justify-content: center; + } +} +.googleLogingContainer { + display: flex; + justify-content: center; + align-items: center; + gap: 10px; + border: 1px solid #ffff; + font-size: 18px; + outline: none; + width: 100%; + box-sizing: border-box; + background: #eceefe; + height: 60px; + border-radius: 100px; + color: rgba(121, 126, 243, 1); + &:hover { + font-weight: 700; + border: 1px solid #444df2; + color: #444df2; + cursor: pointer; + } +} + +.loginBottom { + display: flex; + justify-content: center; + margin-top: 32px; + gap: 30px; +} + +button { + @include buttonGrey; +} +.aktivButton { + @include aktivButtonBlue; +} +.aktivInput { + border: 1px solid#686868; +} +.guestButton { + padding: 12px 25px; + color: #444df2; + background-color: #ffff; + border: 1px solid #444df2; + outline: none; + box-sizing: border-box; + transition: 0.2s; + border-radius: 25px; + font-size: 18px; + font-weight: 600; + cursor: pointer; + &:hover { + background-color: #444df2; + color: #fff; + border: 1px solid #ffff; + } +} +.mobileRegisterContainer { + display: none; + > div { + display: flex; + flex-direction: column; + gap: 20px; + text-align: center; + > span { + font-weight: 400; + font-size: 18px; + } + } +} +.mobileCreateAccountContainer { + display: flex; + justify-content: end; +} +.mobileCreateAccoun { + font-family: Figtree, sans-serif, Nunito; + color: #797ef3; + cursor: pointer; + padding: 4px 12px 4px 12px; + border-radius: 100px; + border: 1px solid #eceefe; + font-weight: 400; + font-size: 18px; + &:hover { + font-weight: 500; + background-color: #eceefe; + color: #444df2; + border: 1px solid #444df2; + } +} +.passwordEye { + position: absolute; + top: 18px; + right: 25px; +} +@media (max-width: 570px) { + .loginTop { + margin-bottom: 0; + > span { + font-size: 32px; + } + } + .loginInfoText { + margin-bottom: 0; + > span { + font-size: 17px; + } + } + .loginContainer { + padding: 16px; + max-height: 552px; + padding-left: 18px; + padding-right: 18px; + gap: 12px; + max-width: 400px; + } + .contactForm { + width: 100%; + } + .inputContainer { + margin-bottom: 22px; + } + .inputField { + height: 52px; + font-size: 15px; + } + .iconP { + top: 15px; + } + .passwordContainer { + margin-bottom: 22px; + margin-top: 32px; + font-size: 17px; + } + .separatorContainer { + font-size: 17px; + margin-bottom: 22px; + } + .googleLogingContainer { + font-size: 17px; + height: 52px; + gap: 0; + margin-bottom: 22px; + > img { + height: 32px; + } + } + .loginBottom { + margin-top: 0px; + gap: 24px; + > button { + width: 118px; + height: 52px; + padding: 0; + } + } + .guestButton { + font-size: 17px; + white-space: nowrap; + } + .aktivButton { + font-size: 17px; + } + .mobileRegisterContainer { + display: flex; + background-color: #eceefe; + width: 100vw; + padding-top: 40px; + justify-content: center; + } +} + +@media (max-width: 380px) { + .loginContainer { + max-width: 306px; + } +} diff --git a/src/app/components/main-login/login/login.component.spec.ts b/src/app/components/main-login/login/login.component.spec.ts new file mode 100644 index 0000000..1e19e5d --- /dev/null +++ b/src/app/components/main-login/login/login.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { LoginComponent } from './login.component'; + +describe('LoginComponent', () => { + let component: LoginComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [LoginComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(LoginComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/components/main-login/login/login.component.ts b/src/app/components/main-login/login/login.component.ts new file mode 100644 index 0000000..4ca05df --- /dev/null +++ b/src/app/components/main-login/login/login.component.ts @@ -0,0 +1,62 @@ +import { Component, ElementRef, Renderer2 } from '@angular/core'; +import { loginService } from '../../../service/login.service'; +import { FormsModule } from '@angular/forms'; +import { RouterLink } from '@angular/router'; +import { FooterComponent } from '../../../shared/components/login/footer/footer.component'; +import { CommonModule } from '@angular/common'; +import { StartHeaderComponent } from '../../../shared/components/login/start-header/start-header.component'; +import { TranslateModule } from '@ngx-translate/core'; + +@Component({ + selector: 'app-login', + standalone: true, + templateUrl: './login.component.html', + styleUrl: './login.component.scss', + imports: [ + FormsModule, + CommonModule, + FooterComponent, + RouterLink, + StartHeaderComponent, + TranslateModule, + ], +}) +export class LoginComponent { + constructor( + public loginService: loginService, + private elRef: ElementRef, + private renderer: Renderer2 + ) {} + + /** + * Initializes the component and manages the removal of the 'startIntroScrollProtect' class from an element. + * On the first load, this class is removed after a delay of 4.5 seconds to manage initial UI transitions. + * On subsequent loads, the class is removed immediately, ensuring the UI remains consistent without delay. + * This behavior is controlled by the `isFirstLoad` property of the loginService. + */ + ngOnInit(): void { + const element = this.elRef.nativeElement.querySelector( + '.startIntroScrollProtect' + ); + + if (this.loginService.isFirstLoad) { + setTimeout(() => { + if (element) { + this.renderer.removeClass(element, 'startIntroScrollProtect'); + } + }, 4500); + + this.loginService.isFirstLoad = false; + } else if (element) { + this.renderer.removeClass(element, 'startIntroScrollProtect'); + } + } + + /** + * Handles form submission by triggering the login process through a login service. + * This method would typically be called when a user submits a form associated with logging in. + */ + onSubmit() { + this.loginService.login(); + } +} diff --git a/src/app/components/main-login/main-login.component.html b/src/app/components/main-login/main-login.component.html new file mode 100644 index 0000000..ab1b0b2 --- /dev/null +++ b/src/app/components/main-login/main-login.component.html @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/src/app/components/main-login/main-login.component.scss b/src/app/components/main-login/main-login.component.scss new file mode 100644 index 0000000..cba248c --- /dev/null +++ b/src/app/components/main-login/main-login.component.scss @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/app/components/main-login/main-login.component.spec.ts b/src/app/components/main-login/main-login.component.spec.ts new file mode 100644 index 0000000..d44a0b0 --- /dev/null +++ b/src/app/components/main-login/main-login.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { MainLoginComponent } from './main-login.component'; + +describe('LoginComponent', () => { + let component: MainLoginComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [MainLoginComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(MainLoginComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/components/main-login/main-login.component.ts b/src/app/components/main-login/main-login.component.ts new file mode 100644 index 0000000..5da3630 --- /dev/null +++ b/src/app/components/main-login/main-login.component.ts @@ -0,0 +1,20 @@ +import { Component } from '@angular/core'; +import { RegisterComponent } from "./register/register.component"; +import { ChooseAvatarComponent } from "./choose-avatar/choose-avatar.component"; +import { LoginComponent } from "./login/login.component"; +import { PasswordForgetComponent } from "./password-forget/password-forget.component"; +import { PasswordResetComponent } from "./password-reset/password-reset.component"; +import { loginService } from '../../service/login.service'; +import { CommonModule } from '@angular/common'; +import { RouterLink } from '@angular/router'; + +@Component({ + selector: 'app-main-login', + standalone: true, + templateUrl: './main-login.component.html', + styleUrl: './main-login.component.scss', + imports: [CommonModule,RegisterComponent, ChooseAvatarComponent, LoginComponent, PasswordForgetComponent, PasswordResetComponent,RouterLink] +}) +export class MainLoginComponent { + +} diff --git a/src/app/components/main-login/password-forget/password-forget.component.html b/src/app/components/main-login/password-forget/password-forget.component.html new file mode 100644 index 0000000..7015664 --- /dev/null +++ b/src/app/components/main-login/password-forget/password-forget.component.html @@ -0,0 +1,61 @@ +
+ +
+
+
+ + +
+ {{ 'passwordForget.header' | translate }} +
+
+ {{ 'passwordForget.infoText' | translate }} +
+
+
+ + + @if (!emailField.valid && emailField.touched) { +

{{ 'login.errorText' | translate }}

+ } +
+
+ + {{ 'passwordForget.infoTextBottom' | translate }} +
+
+ +
+
+
+
+ +
+ +
diff --git a/src/app/components/main-login/password-forget/password-forget.component.scss b/src/app/components/main-login/password-forget/password-forget.component.scss new file mode 100644 index 0000000..8a6dec6 --- /dev/null +++ b/src/app/components/main-login/password-forget/password-forget.component.scss @@ -0,0 +1,170 @@ +@import "../../../shared/components/login/mixins/mixin.scss"; + +.passwordSektion { + @include SektionBody; +} + +.passwordContainer { + max-width: 606px; + width: 100%; + background-color: #fff; + border-radius: 30px; + box-sizing: border-box; + padding: 32px; + display: flex; + flex-direction: column; + align-items: center; + position: relative; + gap: 24px; + max-height: 470px; + height: 100%; +} + +.passwordTop { + @include topText; + > span { + width: 90%; + padding-right: 48px; + } +} + +.passwordBackImg { + cursor: pointer; +} + +.passwordInfoText { + @include InfoText; +} + +.inputContainer { + position: relative; + margin-bottom: 48px; +} + +.iconP { + position: absolute; + top: 18px; + left: 20px; +} + +.inputField { + @include inputStyle; +} + +.error { + @include errorStyle; +} + +.contactForm { + width: 90%; +} + +.passwordBottom { + display: flex; + justify-content: end; + margin-top: 32px; + gap: 30px; +} + +button { + @include buttonGrey; +} + +.aktivButton { + @include aktivButtonBlue; +} + +.aktivInput { + border: 1px solid#686868; +} + +.bottomInfoText { + display: flex; + justify-content: center; + > span { + width: 380px; + text-align: center; + font-size: 20px; + font-weight: 400; + color: #686868; + } +} + +.sendBtn { + display: none; + position: absolute; + right: 0; + bottom: 11%; + animation: slideInOut 4s ease-in-out forwards; + > img { + height: 118px; + } +} + +@keyframes slideInOut { + 0%, + 100% { + opacity: 0; + transform: translateX(100%); + } + 10%, + 90% { + opacity: 1; + transform: translateX(0); + } + 90% { + transform: translateY(0); + } + 100% { + transform: translateY(100%); + } +} +@media (max-width: 570px) { + .passwordTop { + margin-bottom: 0; + + > span { + font-size: 26px; + } + } + .passwordInfoText { + > span { + font-size: 18px; + } + } + .inputField { + padding-left: 40px; + font-size: 17px; + } + .iconP { + left: 12px; + } + .bottomInfoText { + > span { + font-size: 18px; + } + } +} +@media (max-width: 420px) { + .passwordTop { + > span { + font-size: 24px; + } + } + .contactForm { + min-width: 262px; + } + .passwordContainer { + gap: 16px; + max-width: 306px; + } + .inputField { + font-size: 15px; + } + .bottomInfoText { + margin-bottom: 24px; + } + .inputContainer { + margin-bottom: 24px; + } +} diff --git a/src/app/components/main-login/password-forget/password-forget.component.spec.ts b/src/app/components/main-login/password-forget/password-forget.component.spec.ts new file mode 100644 index 0000000..7d8b114 --- /dev/null +++ b/src/app/components/main-login/password-forget/password-forget.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { PasswordForgetComponent } from './password-forget.component'; + +describe('PasswordForgetComponent', () => { + let component: PasswordForgetComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [PasswordForgetComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(PasswordForgetComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/components/main-login/password-forget/password-forget.component.ts b/src/app/components/main-login/password-forget/password-forget.component.ts new file mode 100644 index 0000000..d218350 --- /dev/null +++ b/src/app/components/main-login/password-forget/password-forget.component.ts @@ -0,0 +1,77 @@ +import { Component, inject } from '@angular/core'; +import { FooterComponent } from '../../../shared/components/login/footer/footer.component'; +import { FormsModule, NgForm } from '@angular/forms'; +import { CommonModule } from '@angular/common'; +import { RouterModule } from '@angular/router'; +import { SmallBtnComponent } from '../../../shared/components/small-btn/small-btn.component'; +import { getAuth, sendPasswordResetEmail } from 'firebase/auth'; +import { Firestore } from '@angular/fire/firestore'; +import { Router } from '@angular/router'; +import { StartHeaderComponent } from '../../../shared/components/login/start-header/start-header.component'; +import { TranslateModule} from '@ngx-translate/core'; + +@Component({ + selector: 'app-password-forget', + standalone: true, + templateUrl: './password-forget.component.html', + styleUrl: './password-forget.component.scss', + imports: [ + FormsModule, + CommonModule, + FooterComponent, + RouterModule, + SmallBtnComponent, + StartHeaderComponent, + TranslateModule + ], +}) + +export class PasswordForgetComponent { + email: string = ''; + emailSentBtn = false; + firestore: Firestore = inject(Firestore); + constructor(private router: Router) {} + + + /** + * Initiates a password reset process for the user. + * Sends a password reset email to the user's registered email address. + * + * @param ngForm The form data from the Angular form, used to manage form state. + */ + passwordReset(ngForm: NgForm) { + const auth = getAuth(); + sendPasswordResetEmail(auth, this.email) + .then(() => { + ngForm.resetForm(ngForm); + this.router.navigate(['/login']); + }) + .catch((error) => { + const errorCode = error.code; + const errorMessage = error.message; + }); + } + + + /** + * Handles the form submission, invoking the password reset function and then sending a notification email. + * + * @param ngForm The form instance containing user input. + */ + onSubmit(ngForm: NgForm) { + this.passwordReset(ngForm); + this.sendEmail(); + } + + + /** + * Simulates sending an email by toggling a button state to show feedback to the user. + * After a set timeout, resets the button state. + */ + sendEmail() { + this.emailSentBtn = true; + setTimeout(() => { + this.emailSentBtn = false; + }, 6000); + } +} diff --git a/src/app/components/main-login/password-reset/password-reset.component.html b/src/app/components/main-login/password-reset/password-reset.component.html new file mode 100644 index 0000000..238e083 --- /dev/null +++ b/src/app/components/main-login/password-reset/password-reset.component.html @@ -0,0 +1,83 @@ +
+ +
+
+
+ + +
+ {{ 'passwordReset.header' | translate }} +
+ +
+
+ + + @if (!passwordField.valid && passwordField.touched) { +

+ {{ 'passwordReset.errorText' | translate }} +

+ } +
+
+ + + +

+ {{ 'passwordReset.errorText2' | translate }} +

+
+
+ +
+
+
+ +
diff --git a/src/app/components/main-login/password-reset/password-reset.component.scss b/src/app/components/main-login/password-reset/password-reset.component.scss new file mode 100644 index 0000000..d3d3657 --- /dev/null +++ b/src/app/components/main-login/password-reset/password-reset.component.scss @@ -0,0 +1,111 @@ +@import "../../../shared/components/login/mixins/mixin.scss"; +.passwordSektion { + @include SektionBody; +} +.passwordContainer { + max-width: 606px; + width: 100%; + background-color: #fff; + border-radius: 30px; + box-sizing: border-box; + padding: 32px; + display: flex; + flex-direction: column; + align-items: center; + position: relative; + gap: 24px; + max-height: 470px; + height: 100%; +} +.passwordTop { + @include topText; + > span { + width: 90%; + padding-right: 48px; + } +} + +.passwordBackImg { + cursor: pointer; +} + +.inputContainer { + position: relative; + margin-bottom: 48px; +} +.iconP { + position: absolute; + top: 18px; + left: 20px; +} +.inputField { + @include inputStyle; +} +.error { + @include errorStyle; +} +.contactForm { + width: 90%; +} + +.passwordBottom { + display: flex; + justify-content: end; + margin-top: 32px; + gap: 30px; +} + +button { + @include buttonGrey; +} +.aktivButton { + @include aktivButtonBlue; +} +.aktivInput { + border: 1px solid#686868; +} +@media (max-width: 570px) { + .passwordTop { + > span { + font-size: 38px; + } + } +} +@media (max-width: 570px) { + .passwordTop { + margin-bottom: 48px; + + > span { + font-size: 34px; + } + } + .inputField { + padding-left: 40px; + font-size: 17px; + } + .iconP { + left: 12px; + } +} +@media (max-width: 420px) { + .passwordTop { + > span { + font-size: 28px; + } + } + .contactForm { + min-width: 262px; + } + .passwordContainer { + gap: 16px; + } + .inputField { + font-size: 15px; + } + .bottomInfoText { + margin-bottom: 24px; + } + .inputContainer { + margin-bottom: 48px; + } +} diff --git a/src/app/components/main-login/password-reset/password-reset.component.spec.ts b/src/app/components/main-login/password-reset/password-reset.component.spec.ts new file mode 100644 index 0000000..8aaad64 --- /dev/null +++ b/src/app/components/main-login/password-reset/password-reset.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { PasswordResetComponent } from './password-reset.component'; + +describe('PasswordResetComponent', () => { + let component: PasswordResetComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [PasswordResetComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(PasswordResetComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/components/main-login/password-reset/password-reset.component.ts b/src/app/components/main-login/password-reset/password-reset.component.ts new file mode 100644 index 0000000..71b0999 --- /dev/null +++ b/src/app/components/main-login/password-reset/password-reset.component.ts @@ -0,0 +1,95 @@ +import { Component, inject } from '@angular/core'; +import { FooterComponent } from '../../../shared/components/login/footer/footer.component'; +import { FormsModule, NgForm } from '@angular/forms'; +import { CommonModule } from '@angular/common'; +import { RouterModule } from '@angular/router'; +import { StartHeaderComponent } from '../../../shared/components/login/start-header/start-header.component'; +import { SmallBtnComponent } from '../../../shared/components/small-btn/small-btn.component'; +import { Router, ActivatedRoute } from '@angular/router'; +import { getAuth } from 'firebase/auth'; +import { confirmPasswordReset } from 'firebase/auth'; +import { Subscription } from 'rxjs'; +import { TranslateModule } from '@ngx-translate/core'; + +@Component({ + selector: 'app-password-reset', + standalone: true, + imports: [ + FormsModule, + CommonModule, + StartHeaderComponent, + FooterComponent, + RouterModule, + SmallBtnComponent, + TranslateModule + ], + templateUrl: './password-reset.component.html', + styleUrl: './password-reset.component.scss', +}) +export class PasswordResetComponent { + password: string = ''; + passwordRepeat: string = ''; + oobCode: string = ''; + private queryParamsSubscription: Subscription = new Subscription(); + + constructor( + private route: ActivatedRoute, + private router: Router, + ) {} + + +/** + * Initializes the component by subscribing to query parameters. + */ + ngOnInit(): void { + this.queryParamsSubscription = this.route.queryParams.subscribe( + (params) => { + this.oobCode = params['oobCode']; + } + ); + } + + +/** + * Handles the submission of the password reset form. + * @param ngForm The form data of the password reset form. + */ + onSubmit(ngForm: NgForm): void { + this.resetPassword(ngForm); + } + + +/** + * Performs the password reset operation using Firebase Authentication. + * @param ngForm The form data of the password reset form. + */ + resetPassword(ngForm: NgForm): void { + const auth = getAuth(); + const newPassword = this.passwordRepeat; + confirmPasswordReset(auth, this.oobCode, newPassword) + .then(() => { + ngForm.resetForm(); + this.router.navigate(['/login']); + }) + .catch((error) => { + console.error('Fehler beim Zurücksetzen des Passworts:', error); + }); + } + + + /** + * Cleans up the component by unsubscribing from the query parameters subscription. + */ + ngOnDestroy(): void { + this.queryParamsSubscription.unsubscribe(); + } + + + /** + * Checks if the entered passwords match. + * @returns true if the password and repeated password are the same. + */ + passwordsMatch(): boolean { + return this.password === this.passwordRepeat; + } +} diff --git a/src/app/components/main-login/register/register.component.html b/src/app/components/main-login/register/register.component.html new file mode 100644 index 0000000..36b8406 --- /dev/null +++ b/src/app/components/main-login/register/register.component.html @@ -0,0 +1,117 @@ +
+ +
+
+
+ + +
+ {{ 'createAccount.header' | translate }} +
+
+ {{ 'createAccount.infoText' | translate }} +
+
+
+ + + @if (!nameField.valid && nameField.touched) { +

{{ 'createAccount.errorText' | translate }}

+ } +
+
+ + + @if (!emailField.valid && emailField.touched) { +

{{ 'createAccount.errorText2' | translate }}

+ } +
+
+ + + Toggle visibility + @if (!passwordField.valid && passwordField.touched) { +

+ {{ 'createAccount.errorText3' | translate }} +

+ } +
+ +
+
+ +
+ {{ 'createAccount.midText' | translate }} + {{ 'createAccount.midText2' | translate }} {{ 'createAccount.midText3' | translate }} +
+
+ +
+
+
+ +
diff --git a/src/app/components/main-login/register/register.component.scss b/src/app/components/main-login/register/register.component.scss new file mode 100644 index 0000000..1bec886 --- /dev/null +++ b/src/app/components/main-login/register/register.component.scss @@ -0,0 +1,135 @@ +@import "../../../shared/components/login/mixins/mixin.scss"; +.registerSektion { + @include SektionBody; +} +.registerContainer { + @include Card; + gap: 42px !important; +} +.registerTop { + @include topText; + > span { + width: 90%; + padding-right: 48px; + } +} + +.registerBackImg { + cursor: pointer; +} +.registerInfoText { + @include InfoText; +} +.inputContainer { + position: relative; + margin-bottom: 32px; +} +.iconP { + position: absolute; + top: 16px; + left: 20px; +} +.inputField { + @include inputStyle; +} + +.error { + @include errorStyle; +} +.contactForm { + width: 90%; +} +.checkBox { + display: flex; + align-items: center; + gap: 8px; + > div { + cursor: pointer; + } +} +.registerBottom { + display: flex; + justify-content: end; + margin-top: 32px; +} + +button { + @include buttonGrey; +} +.aktivButton { + @include aktivButtonBlue; +} +.aktivInput { + border: 1px solid#686868; +} + +.fontColor { + color: #797ef3; + cursor: pointer; + &:hover { + font-weight: 500; + background-color: #eceefe; + padding: 2px 2px 2px 5px; + border-radius: 100px; + color: #444df2; + } +} + +.passwordEye { + position: absolute; + top: 18px; + right: 25px; +} + +@media (max-width: 570px) { + .registerTop { + margin-bottom: 0; + > span { + font-size: 32px; + } + } + .registerInfoText { + margin-bottom: 0; + > span { + font-size: 17px; + } + } + .registerContainer { + padding: 16px; + max-height: 552px; + padding-left: 18px; + padding-right: 18px; + gap: 12px; + max-width: 400px; + } + .contactForm { + width: 100%; + } + .inputContainer { + margin-bottom: 22px; + } + .inputField { + height: 52px; + font-size: 15px; + } + .iconP { + top: 15px; + } + .registerBottom { + margin-top: 26px; + gap: 24px; + } + .guestButton { + font-size: 17px; + white-space: nowrap; + } + .aktivButton { + font-size: 17px; + } +} +@media (max-width: 380px) { + .registerContainer { + max-width: 306px; + gap: 12px !important; + } +} diff --git a/src/app/components/main-login/register/register.component.spec.ts b/src/app/components/main-login/register/register.component.spec.ts new file mode 100644 index 0000000..3a5dfc8 --- /dev/null +++ b/src/app/components/main-login/register/register.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { RegisterComponent } from './register.component'; + +describe('RegisterComponent', () => { + let component: RegisterComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [RegisterComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(RegisterComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/components/main-login/register/register.component.ts b/src/app/components/main-login/register/register.component.ts new file mode 100644 index 0000000..aec7de3 --- /dev/null +++ b/src/app/components/main-login/register/register.component.ts @@ -0,0 +1,95 @@ +import { Component, inject } from '@angular/core'; +import { FormsModule, NgForm } from '@angular/forms'; +import { Firestore } from '@angular/fire/firestore'; +import { CommonModule } from '@angular/common'; +import { RouterLink, Router } from '@angular/router'; +import { SmallBtnComponent } from '../../../shared/components/small-btn/small-btn.component'; +import { FooterComponent } from '../../../shared/components/login/footer/footer.component'; +import { loginService } from '../../../service/login.service'; +import { StartHeaderComponent } from '../../../shared/components/login/start-header/start-header.component'; +import { TranslateModule } from '@ngx-translate/core'; + +@Component({ + selector: 'app-register', + standalone: true, + templateUrl: './register.component.html', + styleUrl: './register.component.scss', + imports: [ + FormsModule, + CommonModule, + SmallBtnComponent, + FooterComponent, + RouterLink, + StartHeaderComponent, + TranslateModule, + ], +}) +export class RegisterComponent { + firestore: Firestore = inject(Firestore); + isChecked: boolean = false; + currentImage: string; + defaultImage = './assets/img/login/box.png'; + clickedImage = './assets/img/login/box-checked.png'; + hoverImage = './assets/img/login/box-hover.png'; + clickedHoverImage = './assets/img/login/box-checked-hover.png'; + + constructor(public loginService: loginService, private router: Router) { + this.currentImage = this.defaultImage; + } + + /** + * Handles the form submission, extracting first and last names from a full name and navigating to the avatar page. + * @param ngForm The Angular form object representing the form submission. + */ + onSubmit(ngForm: NgForm) { + const names = this.loginService.name.split(' '); + this.loginService.firstName = names[0]; + this.loginService.lastName = names.slice(1).join(' '); + this.router.navigate(['/avatar']); + } + + /** + * Toggles a checkbox state and updates the corresponding image based on the new state. + */ + toggleCheckbox() { + this.isChecked = !this.isChecked; + this.updateImage(); + } + + /** + * Updates the current image to a hover state image when the mouse is over the related component. + */ + onMouseOver() { + this.updateImage(true); + } + + /** + * Reverts the current image to its default state when the mouse is out of the related component. + */ + onMouseOut() { + this.updateImage(); + } + + /** + * Updates the image displayed based on the checkbox state and hover state. + * @param isHovering Boolean indicating if the mouse is hovering over the image component (default is false). + */ + updateImage(isHovering: boolean = false) { + if (this.isChecked) { + this.currentImage = isHovering + ? this.clickedHoverImage + : this.clickedImage; + } else { + this.currentImage = isHovering ? this.hoverImage : this.defaultImage; + } + } + + /** + * Clear the values, if user click on the arrow back button. + */ + resetValues() { + this.loginService.name = ''; + this.loginService.email = ''; + this.loginService.password = ''; + } +} diff --git a/src/app/components/main/main.component.html b/src/app/components/main/main.component.html new file mode 100644 index 0000000..dbee3bd --- /dev/null +++ b/src/app/components/main/main.component.html @@ -0,0 +1,76 @@ +
+ @if (userService.isUserLogin) { + +
+ + +
+ + +
+
+ } + +
diff --git a/src/app/components/main/main.component.scss b/src/app/components/main/main.component.scss new file mode 100644 index 0000000..c7f52f4 --- /dev/null +++ b/src/app/components/main/main.component.scss @@ -0,0 +1,129 @@ +@import "../../../styles.scss"; + +app-header { + display: block; + height: 110px; + background-color: #edeefe; +} + +.content { + display: flex; +} + +app-sidebar, +app-main-chat, +app-secondary-chat { + padding: 0 12px 12px 12px; + min-height: calc(100vh - 122px); + background-color: #edeefe; +} + +.chatBox { + display: flex; + width: 100%; + flex-grow: 1; +} + +.minusWidth { + width: calc(100% - 518px); +} + +app-main-chat { + width: 100%; +} + +app-sidebar { + max-width: 366px; +} + +app-secondary-chat { + max-width: 485px; +} + +.slideIn { + float: right; + right: 0; + transition: 0.3s linear; + animation: slideIn; +} + +.slideOut { + float: left; + margin-right: -390px; + transition: 0.3s linear; + animation: slideOut; +} + +.slideInRightWindow { + transition: 0.3s linear; + width: 100%; + animation: slideIn; +} + +@keyframes slideIn { + from { + transform: translateX(-100%); + } + + to { + width: 100%; + transform: translateX(0); + } +} + +.slideOutRightWindow { + transition: 0.3s linear; + animation: slideOut; + width: 0; + padding-right: 0; + padding-left: 0; +} + +@keyframes slideOut { + from { + transform: translateX(0); + } + + to { + transform: translateX(-100%); + } +} + +/*------------- RESPONSIVE -------------*/ + +@media screen and (max-width: $RESPONSIVE_THRESHOLD) { + app-sidebar-toggle { + display: none; + } + + app-secondary-chat { + width: 100vw; + max-width: 100vw; + } + + app-sidebar { + width: 100vw; + max-width: 100vw; + } +} + +@media screen and (max-width: $RESPONSIVE_THRESHOLD_MOBILE) { + app-header { + height: 80px; + } + + app-sidebar, + app-main-chat, + app-secondary-chat { + padding: 0; + min-height: calc(100vh - 80px); + } +} + +@media screen and (max-width: $RESPONSIVE_THRESHOLD_MOBILE380px) { + app-sidebar, + app-main-chat, + app-secondary-chat { + min-height: calc(100vh - 80px); + } +} diff --git a/src/app/components/main/main.component.spec.ts b/src/app/components/main/main.component.spec.ts new file mode 100644 index 0000000..6927de0 --- /dev/null +++ b/src/app/components/main/main.component.spec.ts @@ -0,0 +1,22 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { MainComponent } from './main.component'; + +describe('LandingPageComponent', () => { + let component: MainComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [MainComponent], + }).compileComponents(); + + fixture = TestBed.createComponent(MainComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/components/main/main.component.ts b/src/app/components/main/main.component.ts new file mode 100644 index 0000000..581aea2 --- /dev/null +++ b/src/app/components/main/main.component.ts @@ -0,0 +1,114 @@ +import { + AfterViewChecked, + ChangeDetectorRef, + Component, + ElementRef, + HostListener, + OnChanges, + SimpleChanges, +} from '@angular/core'; +import { HeaderComponent } from '../../shared/components/header/header.component'; +import { ActivatedRoute, Router, RouterModule } from '@angular/router'; +import { UserService } from '../../service/user.service'; +import { SidebarComponent } from '../sidebar/sidebar.component'; +import { MainChatComponent } from '../main-chat/main-chat.component'; +import { SecondaryChatComponent } from '../secondary-chat/secondary-chat.component'; +import { ChatService } from '../../service/chat.service'; +import { ChannleService } from '../../service/channle.service'; +import { SidebarToggleComponent } from '../sidebar/sidebar-toggle/sidebar-toggle.component'; +import { CommonModule } from '@angular/common'; +import { AddNewChannelComponent } from '../sidebar/sidebar-channels/add-new-channel/add-new-channel.component'; +import { OverlayComponent } from '../../shared/components/overlay/overlay.component'; +import { ToggleBooleanService } from '../../service/toggle-boolean.service'; +import { SharedService } from '../../service/shared.service'; + +@Component({ + selector: 'app-landing-page', + standalone: true, + imports: [ + RouterModule, + HeaderComponent, + SidebarComponent, + MainChatComponent, + SecondaryChatComponent, + SidebarToggleComponent, + CommonModule, + AddNewChannelComponent, + OverlayComponent, + ], + templateUrl: './main.component.html', + styleUrl: './main.component.scss', +}) +export class MainComponent { + constructor( + public userService: UserService, + public chatService: ChatService, + public channelService: ChannleService, + private route: Router, + private router: ActivatedRoute, + private elementRef: ElementRef, + public toggleAllBooleans: ToggleBooleanService, + private sharedService: SharedService + ) {} + + currentChannel: string = ''; + viewWidth: number = 0; + + RESPONSIVE_THRESHOLD = this.sharedService.RESPONSIVE_THRESHOLD; + RESPONSIVE_THRESHOLD_MAX = this.sharedService.RESPONSIVE_THRESHOLD_MAX; + + ngOnInit() { + this.ifUserLogin(); + this.routeUserId(); + this.updateViewWidth(); + } + + /** + * Checks if the user is logged in. + */ + ifUserLogin() { + if (this.userService.getCurrentUserId() === undefined) { + this.route.navigateByUrl('/login'); + } + } + + /** + * Subscribes to route params and updates the current channel. + */ + routeUserId() { + if (this.router.params.subscribe()) { + this.router.params.subscribe((params) => { + this.currentChannel = params['id']; + }); + } + } + + /** + * Listens for window resize events. + */ + @HostListener('window:resize') + onResize() { + this.updateViewWidth(); + } + + /** + * Updates the view width based on the current window width. + */ + private updateViewWidth() { + this.viewWidth = window.innerWidth; + if (this.viewWidth <= this.RESPONSIVE_THRESHOLD) { + this.toggleAllBooleans.isSidebarOpen = false; + } else if (this.viewWidth >= this.RESPONSIVE_THRESHOLD) { + this.toggleAllBooleans.isSidebarOpen = true; + } + } + + /** + * Toggles various boolean values to control UI elements. + */ + toggleBooleans() { + this.toggleAllBooleans.openSearchWindow = false; + this.toggleAllBooleans.openSearchWindowHead = false; + this.toggleAllBooleans.selectUserInMsgBox = false; + } +} diff --git a/src/app/components/secondary-chat/secondary-chat.component.html b/src/app/components/secondary-chat/secondary-chat.component.html new file mode 100644 index 0000000..5c752af --- /dev/null +++ b/src/app/components/secondary-chat/secondary-chat.component.html @@ -0,0 +1,66 @@ +
+
+
+
+

{{ "secondary-chat.thread" | translate }}

+ @for (channel of getChannelName(); track channel) { + # {{ channel.name }} + } +
+
+ +
+
+
+ @for (chat of getSingleChat(this.chatService.isSecondaryChatId); track + chat; let i = $index) { +
+ @for (user of getChatUsers(chat.userId); track user) { + + } +
+
+

+ {{ displayCountChatAnswer(chat.id) }} + {{ "secondary-chat.answer" | translate }} +

+
+
+ } +
+ @for (chat of getChatAnswers(this.chatService.isSecondaryChatId); track + chat; let i = $index) { +
+ @for (user of getChatUsers(chat.userId); track user) { + + } +
+ } +
+
+
+
+ +
+
diff --git a/src/app/components/secondary-chat/secondary-chat.component.scss b/src/app/components/secondary-chat/secondary-chat.component.scss new file mode 100644 index 0000000..c670016 --- /dev/null +++ b/src/app/components/secondary-chat/secondary-chat.component.scss @@ -0,0 +1,129 @@ +@import "./../../../styles.scss"; + +section { + height: 100%; + width: 100%; + border-radius: 24px; + background-color: #fff; + display: flex; + flex-direction: column; + justify-content: space-between; +} + +.header { + display: flex; + align-items: center; + justify-content: space-between; + height: 40px; + padding: 24px 48px; + box-shadow: 0px 3px 3px 0px rgba(0, 0, 0, 0.05); +} + +.messages { + display: flex; + flex-direction: column-reverse; +} + +.content { + height: calc(100vh - 500px); + overflow-y: auto; + padding: 28px 0; +} + +.headline { + display: flex; + align-items: center; + font-size: 24px; + font-weight: 700; + span { + font-size: 14px; + font-weight: 400; + color: #797ef3; + padding-left: 12px; + } +} + +.close { + display: flex; + justify-content: center; + align-items: center; + width: 28px; + height: 28px; + cursor: pointer; + &:hover { + background-color: #edeefe; + border-radius: 100%; + img { + width: 16px; + height: 16px; + } + } + img { + width: 14px; + height: 14px; + } +} + +.spacer { + display: flex; + align-items: center; + justify-content: space-between; + padding: 0 48px; + margin-bottom: 12px; + p { + display: flex; + justify-content: center; + width: 30%; + font-size: 18px; + font-weight: 400; + color: #adb0d9; + } + .line { + width: 70%; + margin: 24px 6px; + border: 1px solid #adb0d9; + opacity: 0.4; + } +} + +.mirror { + transform: scaleX(-1); +} + +//----------- responsive --------------- + +@media screen and (max-width: $RESPONSIVE_THRESHOLD_MOBILE) { + section { + height: calc(100vh - 80px); + border-radius: 0; + } + + .header { + height: 36px; + padding: 12px; + } + + .content { + height: calc(100vh - 350px); + } + + .spacer { + padding: 0 12px; + p { + font-size: 16px; + } + .line { + width: 70%; + margin: 24px 0px 24px 12px; + } + } +} + +@media screen and (max-width: $RESPONSIVE_THRESHOLD_MOBILE380px) { + section { + height: calc(100vh - 80px); + } + .content { + height: calc(100vh - 350px); + } +} diff --git a/src/app/components/secondary-chat/secondary-chat.component.spec.ts b/src/app/components/secondary-chat/secondary-chat.component.spec.ts new file mode 100644 index 0000000..8f29711 --- /dev/null +++ b/src/app/components/secondary-chat/secondary-chat.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SecondaryChatComponent } from './secondary-chat.component'; + +describe('SecondaryChatComponent', () => { + let component: SecondaryChatComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [SecondaryChatComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(SecondaryChatComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/components/secondary-chat/secondary-chat.component.ts b/src/app/components/secondary-chat/secondary-chat.component.ts new file mode 100644 index 0000000..d22f08e --- /dev/null +++ b/src/app/components/secondary-chat/secondary-chat.component.ts @@ -0,0 +1,164 @@ +import { + AfterViewChecked, + AfterViewInit, + Component, + ElementRef, + Input, + Renderer2, + ViewChild, +} from '@angular/core'; +import { UserService } from '../../service/user.service'; +import { ChannleService } from '../../service/channle.service'; +import { ChatService } from '../../service/chat.service'; +import { Channel } from '../../interface/channel.interface'; +import { MainComponent } from '../main/main.component'; +import { SingleChatComponent } from '../main-chat/single-chat/single-chat.component'; +import { Chat, ChatAnswers } from '../../interface/chat.interface'; +import { CommonModule } from '@angular/common'; +import { User } from '../../interface/user.interface'; +import { ChatMsgBoxComponent } from '../main-chat/chat-msg-box/chat-msg-box.component'; +import { TranslateModule } from '@ngx-translate/core'; + +@Component({ + selector: 'app-secondary-chat', + standalone: true, + imports: [ + MainComponent, + SingleChatComponent, + ChatMsgBoxComponent, + CommonModule, + TranslateModule, + ], + templateUrl: './secondary-chat.component.html', + styleUrl: './secondary-chat.component.scss', +}) +export class SecondaryChatComponent implements AfterViewChecked { + @Input() currentChannel: string = ''; + @Input() viewWidth: number = 0; + @ViewChild('messageBody') messageBody: ElementRef | undefined; + sidebarLoaded: boolean = false; + isNewMessage: boolean = false; + + constructor( + public userService: UserService, + public channelService: ChannleService, + public chatService: ChatService, + private renderer: Renderer2 + ) {} + + /** + * Scrolls to the bottom if the secondary chat is open and the sidebar has not been loaded yet. + */ + ngAfterViewChecked() { + setTimeout(() => { + if (this.chatService.isSecondaryChatOpen && !this.sidebarLoaded) { + this.scrollToBottom(); + } + }, 200); + } + + /** + * Updates the isNewMessage flag and scrolls to the bottom if there's a new message. + * @param {boolean} variable - Flag indicating if there's a new message. + */ + editMsgEmitter(variable: boolean) { + this.isNewMessage = variable; + if (this.isNewMessage) { + this.scrollToBottom(); + } + } + + /** + * Scrolls the message body to the bottom. + */ + scrollToBottom(): void { + if (this.messageBody) { + const element = this.messageBody.nativeElement; + this.renderer.setProperty( + element, + 'scrollTop', + element.scrollHeight - element.clientHeight + ); + this.sidebarLoaded = true; + } + } + + /** + * Returns the count of chat answers for a given chat ID. + * @param {string} chatId - The ID of the chat. + * @returns {number} - The count of chat answers. + */ + displayCountChatAnswer(chatId: string) { + return this.chatService.getChatAnswers(chatId).length; + } + + /** + * Closes the thread chat window. + */ + closeSecondaryChat() { + this.chatService.toggleSecondaryChat('none'); + this.sidebarLoaded = false; + } + + /** + * Retrieves a single chat by its ID. + * @param {string} chatId - The ID of the chat. + * @returns {Chat[]} - An array containing the single chat. + */ + getSingleChat(chatId: string): Chat[] { + const filteredTasks = this.chatService.allChats.filter( + (chat) => chat.id == chatId + ); + return filteredTasks; + } + + /** + * Retrieves chat answers for a given chat ID. + * @param {string} chatId - The ID of the chat. + * @returns {ChatAnswers[]} - An array containing chat answers. + */ + getChatAnswers(chatId: string): ChatAnswers[] { + const filteredTasks = this.chatService.allChatAnswers.filter( + (chat) => chat.chatId === chatId + ); + + filteredTasks.sort((a, b) => b.publishedTimestamp - a.publishedTimestamp); + + return filteredTasks; + } + + /** + * Retrieves users belonging to a chat. + * @param {string} chatId - The ID of the chat. + * @returns {User[]} - An array containing users. + */ + getChatUsers(chatId: string) { + const filteredTasks = this.userService.allUsers.filter( + (user) => user.id == chatId + ); + return filteredTasks; + } + + /** + * Retrieves the name of the channel. + * @returns {Channel[]} - An array containing the channel name. + */ + getChannelName() { + const filteredTasks = this.channelService.allChannels.filter( + (channel) => channel.id == this.currentChannel + ); + return filteredTasks; + } + + /** + * Retrieves chats belonging to a channel. + * @param {string} chatId - The ID of the chat (channel). + * @returns {Chat[]} - An array containing chats. + */ + getChatChannel(chatId: string) { + const filteredTasks = this.chatService.allChats.filter( + (chat) => chat.channelId == chatId + ); + return filteredTasks; + } +} diff --git a/src/app/components/sidebar/searchbar/searchbar.component.html b/src/app/components/sidebar/searchbar/searchbar.component.html new file mode 100644 index 0000000..c2d538f --- /dev/null +++ b/src/app/components/sidebar/searchbar/searchbar.component.html @@ -0,0 +1,9 @@ +
+
+ + +
+ @if (inputValue) { +
+ } +
diff --git a/src/app/components/sidebar/searchbar/searchbar.component.scss b/src/app/components/sidebar/searchbar/searchbar.component.scss new file mode 100644 index 0000000..1b10a30 --- /dev/null +++ b/src/app/components/sidebar/searchbar/searchbar.component.scss @@ -0,0 +1,54 @@ +@import "./../../../../styles.scss"; + +section{ + position: relative; + @include displayFlex(); + .whiteBox{ + z-index: 1; + position: absolute; + top: -16px; + left: 322px; + @include displayFlex(); + width: auto; + height: 56px; + background-color: #fff; + padding: 2px 8px 2px; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 34px; + border-top-left-radius: 0; + box-shadow: rgb(111 139 169) 0px 20px 30px -10px; + input{ + width: 30vw; + height: 46px; + border-radius: 26px; + padding-right: 40px; + padding-left: 8px; + margin-right: 2px; + font-size: larger; + border: 1px solid #888dec; + font-family: "Nunito", sans-serif; + outline: none; + &:hover{ + border: 1px solid #5f66e7; + } + } + img{ + margin-left: -36px; + padding-right: 4px; + cursor: pointer; + } + } +} + +.suggestions{ + width: 200px; + height: 300px; + background-color: coral; + position: absolute; + top: 46px; + left: 360px; + border-bottom-left-radius: 25px; + border-bottom-right-radius: 25px; + z-index: 1; + box-shadow: rgb(111 139 169) 0px 20px 30px -10px; +} \ No newline at end of file diff --git a/src/app/components/sidebar/searchbar/searchbar.component.spec.ts b/src/app/components/sidebar/searchbar/searchbar.component.spec.ts new file mode 100644 index 0000000..5031dad --- /dev/null +++ b/src/app/components/sidebar/searchbar/searchbar.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SearchbarComponent } from './searchbar.component'; + +describe('SearchbarComponent', () => { + let component: SearchbarComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [SearchbarComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(SearchbarComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/components/sidebar/searchbar/searchbar.component.ts b/src/app/components/sidebar/searchbar/searchbar.component.ts new file mode 100644 index 0000000..fff28e9 --- /dev/null +++ b/src/app/components/sidebar/searchbar/searchbar.component.ts @@ -0,0 +1,38 @@ +import { CommonModule } from '@angular/common'; +import { Component } from '@angular/core'; +import { ToggleBooleanService } from '../../../service/toggle-boolean.service'; +import { FormsModule } from '@angular/forms'; + +@Component({ + selector: 'app-searchbar', + standalone: true, + imports: [CommonModule, FormsModule], + templateUrl: './searchbar.component.html', + styleUrl: './searchbar.component.scss', +}) +export class SearchbarComponent { + inputValue: string = ''; + + constructor(private toggleBoolean: ToggleBooleanService) {} + + + /** + * Closes the search window. + * @param event The event object. + */ + closeSearchWindow(event: Event) { + this.toggleBoolean.openSearchWindow = false; + event.stopPropagation(); + this.inputValue = ''; + } + + /** + * Opens the search bar. + * @param event The event object. + */ + openSearchbar(event: Event){ + this.toggleBoolean.openSearchWindow = true; + event.stopPropagation(); + } + +} diff --git a/src/app/components/sidebar/show-all-users/show-all-users.component.html b/src/app/components/sidebar/show-all-users/show-all-users.component.html new file mode 100644 index 0000000..d760183 --- /dev/null +++ b/src/app/components/sidebar/show-all-users/show-all-users.component.html @@ -0,0 +1,34 @@ +
+
+
+

{{ "sidebar-direct-messages.members" | translate }}

+ +
+
+ @for(user of userService.getUsers(); track user){ +
+
+ + +
+

{{ user.firstName }} {{ user.lastName }}

+
+ } +
+
+
diff --git a/src/app/components/sidebar/show-all-users/show-all-users.component.scss b/src/app/components/sidebar/show-all-users/show-all-users.component.scss new file mode 100644 index 0000000..61c9caf --- /dev/null +++ b/src/app/components/sidebar/show-all-users/show-all-users.component.scss @@ -0,0 +1,66 @@ +@import "../../../../styles.scss"; + +section { + position: absolute; + top: -10px; + right: 0px; +} + +.whiteBoxAllUsersWindow { + height: fit-content; + max-height: 30vh; + width: 240px; + z-index: 4; + border-radius: 35px; + border-top-right-radius: 0; + background-color: #fff; + border: 1px solid #888dec; + padding: 24px; + @include displayFlex($g: 20px); + flex-direction: column; + + .positionHeader { + @include displayFlex($j: space-between); + font-size: 24px; + font-weight: 600; + width: 100%; + } +} + +.positionOfAllUsersInBox { + @include displayFlex($j: flex-start, $a: flex-start); + flex-direction: column; + height: fit-content; + max-height: 300px; + overflow: auto; + width: 100%; + + .user { + @include displayFlex($g: 12px); + padding: 6px; + cursor: pointer; + transition: 0.2s ease-in-out; + + &:hover { + background-color: #edeefe; + border-radius: 25px; + } + + .positionImgs { + @include displayFlex($a: flex-end); + + .avatarImg { + width: 40px; + height: 40px; + object-fit: cover; + border-radius: 50%; + } + + .onlineIcon { + width: 12px; + height: 12px; + margin-left: -10px; + } + } + } +} diff --git a/src/app/components/sidebar/show-all-users/show-all-users.component.spec.ts b/src/app/components/sidebar/show-all-users/show-all-users.component.spec.ts new file mode 100644 index 0000000..441ed21 --- /dev/null +++ b/src/app/components/sidebar/show-all-users/show-all-users.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ShowAllUsersComponent } from './show-all-users.component'; + +describe('ShowAllUsersComponent', () => { + let component: ShowAllUsersComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [ShowAllUsersComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(ShowAllUsersComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/components/sidebar/show-all-users/show-all-users.component.ts b/src/app/components/sidebar/show-all-users/show-all-users.component.ts new file mode 100644 index 0000000..04a9aea --- /dev/null +++ b/src/app/components/sidebar/show-all-users/show-all-users.component.ts @@ -0,0 +1,93 @@ +import { Component, EventEmitter, Input, Output } from '@angular/core'; +import { TranslateModule } from '@ngx-translate/core'; +import { UserService } from '../../../service/user.service'; +import { User } from '../../../interface/user.interface'; +import { ChannleService } from '../../../service/channle.service'; +import { Router } from '@angular/router'; +import { SmallBtnComponent } from '../../../shared/components/small-btn/small-btn.component'; +import { ChatService } from '../../../service/chat.service'; +import { SharedService } from '../../../service/shared.service'; +import { ToggleBooleanService } from '../../../service/toggle-boolean.service'; + +@Component({ + selector: 'app-show-all-users', + standalone: true, + imports: [TranslateModule, SmallBtnComponent], + templateUrl: './show-all-users.component.html', + styleUrl: './show-all-users.component.scss', +}) +export class ShowAllUsersComponent { + @Input() viewWidth: number = 0; + @Output() toggleMemberListEmitter: EventEmitter = + new EventEmitter(); + + constructor( + public userService: UserService, + private route: Router, + private channelService: ChannleService, + private chatService: ChatService, + public toggleBoolean: ToggleBooleanService, + private sharedService: SharedService + ) {} + + RESPONSIVE_THRESHOLD = this.sharedService.RESPONSIVE_THRESHOLD; + + /** + * Toggles the member list by emitting an event. + * @param {boolean} isVisible - Indicates whether the member list should be visible or not. + */ + toggleMemberList() { + this.toggleMemberListEmitter.emit(false); + } + + /** + * Closes the secondary chat window & sidebar. + */ + closeSecondaryChatAndSidebar() { + this.chatService.toggleSecondaryChat('none'); + this.toggleMemberList(); + if (this.viewWidth <= this.RESPONSIVE_THRESHOLD) { + this.toggleBoolean.isSidebarOpen = false; + } + } + + /** + * Checks the route based on the specified user. + * @param user The user to check the route for. + */ + async checkRoute(user: User[]) { + const userId = user[0].id!; + const channelExistsBoolean = this.channelService.allPrvChannels.some( + (channel) => + (channel.creatorId === userId && + channel.talkToUserId === this.userService.getCurrentUserId()) || + (channel.creatorId === this.userService.getCurrentUserId() && + channel.talkToUserId === userId) + ); + if (!channelExistsBoolean) { + const id = await this.userService.createPrvChannel(userId); + if (id) { + this.route.navigateByUrl(`main/${id}`); + } + } + this.getRouteToPrvChat(userId, channelExistsBoolean); + } + + /** + * Navigates to the private chat route based on the specified user. + * @param userId The ID of the user. + * @param channelExistsBoolean A boolean indicating whether the channel exists. + */ + getRouteToPrvChat(userId: string, channelExistsBoolean: boolean) { + if (channelExistsBoolean) { + const existingChannel = this.channelService.allPrvChannels.find( + (channel) => + (channel.creatorId === userId && + channel.talkToUserId === this.userService.getCurrentUserId()) || + (channel.creatorId === this.userService.getCurrentUserId() && + channel.talkToUserId === userId) + ); + this.route.navigateByUrl(`main/${existingChannel!.id}`); + } + } +} diff --git a/src/app/components/sidebar/sidebar-channels/add-new-channel/add-new-channel.component.html b/src/app/components/sidebar/sidebar-channels/add-new-channel/add-new-channel.component.html new file mode 100644 index 0000000..2b39068 --- /dev/null +++ b/src/app/components/sidebar/sidebar-channels/add-new-channel/add-new-channel.component.html @@ -0,0 +1,150 @@ +
+
+ +
+ @if (!showNextWindow) { +
+
+

{{ 'add-new-channel.header' | translate }}

+ +
+ {{ 'add-new-channel.info' | translate }} +
+

{{ 'add-new-channel.header2' | translate }}

+   + {{ 'add-new-channel.required' | translate }} + @if (chechIfChannelExist(channelName)) { +

{{ 'add-new-channel.warning' | translate }}

+ } + +
+ +
+

{{ 'add-new-channel.description' | translate }}

+   + {{ 'add-new-channel.optional' | translate }} +
+ +
+ +
+
+ } @if (showNextWindow || showNextWindowMobile) { +
+
+

{{ 'add-new-channel.addPeople' | translate }}

+ +
+
+ +

{{ 'add-new-channel.addAll' | translate }}  {{ 'add-new-channel.devspace' | translate }}

+
+
+ +

{{ 'add-new-channel.add' | translate }}

+
+
+
+ +

{{ user.firstName }} {{ user.lastName }}

+ +
+ +
+
+ @for(user of getSearchedUser; track user){ +
+
+ + +
+

{{ user.firstName }} {{ user.lastName }}

+
+ } +
+
+
+
+ +
+
+ } +
diff --git a/src/app/components/sidebar/sidebar-channels/add-new-channel/add-new-channel.component.scss b/src/app/components/sidebar/sidebar-channels/add-new-channel/add-new-channel.component.scss new file mode 100644 index 0000000..77f049e --- /dev/null +++ b/src/app/components/sidebar/sidebar-channels/add-new-channel/add-new-channel.component.scss @@ -0,0 +1,343 @@ +@import "../../../../../styles.scss"; + +.darkBackground { + position: absolute; + top: 0; + left: 0; + width: 100vw; + height: 100vh; + background-color: rgba(0, 0, 0, 0.3); + z-index: 2; +} + +.grayBackground { + position: absolute; + top: 0; + left: 0; + width: 100vw; + height: 100vh; + background-color: rgba(0, 0, 0, 0.3); + z-index: 4; +} + +.infoMsg { + font-size: 18px; + font-weight: 400; + padding: 12px 0; +} + +.newChannelDescription { + position: absolute; + top: 0; + left: 0; + width: 100vw; + height: 100vh; + @include displayFlex(); + font-family: "Nunito"; +} + +.whiteWindow { + width: 60vw; + max-width: 872px; + height: auto; + background-color: #fff; + border-radius: 25px; + z-index: 3; + @include displayFlex($a: flex-start, $g: 8px); + flex-direction: column; + text-align: left; + padding: 32px; +} + +.posiotionHeader { + @include displayFlex($j: space-between); + width: 100%; + p { + font-size: 24px; + font-weight: 700; + } +} + +.textfieldStyle { + width: calc(100% - 40px); + border: 1px solid #888dec; + overflow: auto; + scrollbar-width: none; + outline: none; + height: 22px; + padding: 18px 20px; + border-radius: 40px; + opacity: 0px; + transition: 0.3s ease-in-out; + font-size: 18px; + font-weight: 400; + margin: 12px 0; + &:hover { + border: 1px solid #2c36f0; + } +} +textarea { + resize: none; + min-height: 72px; +} +.descriptionBox { + @include displayFlex(); + position: relative; + p { + font-size: 18px; + font-weight: 700; + padding-top: 6px; + } + span { + font-size: 16px; + font-weight: 400; + padding-top: 6px; + } + .warning{ + font-size: 18px; + font-weight: 500; + padding-top: 6px; + color: #ff0000; + margin-left: 26px; + } +} +.hashtag { + position: absolute; + bottom: -58px; + left: 18px; + filter: brightness(0) saturate(100%) invert(45%) sepia(22%) saturate(0%) + hue-rotate(159deg) brightness(97%) contrast(88%); +} +.hashtagPadding { + width: calc(100% - 60px); + padding: 18px 20px 18px 40px !important; +} + +.btnBox { + width: 100%; + @include displayFlex($j: flex-end); + .furterBtnClass { + width: 120px; + height: 48px; + background-color: white; + border: 1px solid #888dec; + border-radius: 25px; + font-size: larger; + color: #444df2; + transition: 0.3s ease-in-out; + &:hover { + background-color: #444df2; + color: white; + cursor: pointer; + } + } +} + +.smalWhiteBox { + padding: 32px; + width: 48vw; + height: auto; + background-color: #fff; + border-radius: 25px; + z-index: 3; + display: flex; + flex-direction: column; + gap: 16px; + position: relative; + .positionSelectionBtn { + @include displayFlex($j: flex-start, $g: 12px); + p { + display: flex; + font-size: 18px; + font-weight: 400; + } + span { + font-size: 18px; + font-weight: 400; + color: #535af1; + } + img { + cursor: pointer; + } + } + .addedUserBox { + display: flex; + flex-wrap: wrap; + height: auto; + max-width: 100%; + border: 1px solid #888dec; + background-color: white; + border-radius: 25px; + transition: 0.3s ease-in-out; + position: relative; + &:hover { + border: 1px solid #2c36f0; + } + .userPosition { + @include displayFlex($g: 8px); + padding: 4px; + padding-left: 8px; + padding-right: 8px; + background-color: #edeefe; + border-radius: 25px; + border-radius: 25px; + margin: 4px; + .avatarImg { + width: 32px; + height: 32px; + object-fit: cover; + border-radius: 50%; + } + .imgClose { + width: 12px; + object-fit: contain; + transition: 0.1s ease-in-out; + cursor: pointer; + &:hover { + scale: 1.1; + filter: brightness(0) saturate(100%) invert(8%) sepia(96%) + saturate(6339%) hue-rotate(1deg) brightness(102%) contrast(109%); + } + } + } + .inputfieldStyle { + width: auto; + flex-grow: 1; + outline: none; + border: none; + border-radius: 25px; + height: 26px; + padding: 12px; + height: auto; + font-size: larger; + } + } + .positionCreateBtn { + width: 100%; + @include displayFlex($j: flex-end); + } + + .textfieldStyle { + width: calc(100% - 24px); + border: 1px solid #888dec; + outline: none; + height: 26px; + border-radius: 25px; + padding: 8px; + padding-left: 12px; + padding-right: 12px; + height: auto; + font-size: larger; + transition: 0.3s ease-in-out; + &:hover { + border: 1px solid #2c36f0; + } + } + button { + @include displayFlex(); + width: 120px; + height: 48px; + background-color: white; + border: 1px solid #888dec; + border-radius: 25px; + font-size: larger; + color: #444df2; + transition: 0.3s ease-in-out; + &:hover { + background-color: #444df2; + color: white; + cursor: pointer; + } + } +} + +.showSearchedUsersWindow { + width: auto; + max-height: 222px; + overflow: auto; + scrollbar-width: none; + background-color: white; + border-radius: 25px; + border-top-left-radius: 0; + border: 1px solid #888dec; + position: absolute; + top: 88%; + left: 24px; + padding: 8px; + text-align: start; + .positionOfAllUsersInBox { + @include displayFlex($a: flex-start); + flex-direction: column; + .user { + @include displayFlex($g: 12px); + padding: 6px; + margin-bottom: 6px; + cursor: pointer; + transition: 0.2s ease-in-out; + &:hover { + background-color: #edeefe; + border-radius: 25px; + } + .positionImgs { + @include displayFlex($a: flex-end); + .avatarImg { + width: 40px; + height: 40px; + object-fit: cover; + border-radius: 50%; + } + .onlineIcon { + width: 12px; + height: 12px; + border-radius: 50%; + margin-left: -10px; + } + } + } + } +} + +.headerAddPeople { + @include displayFlex($j: space-between); +} + +.disabledBtn { + background-color: #22222242; + border: none; + font-size: larger; + color: #fff; + width: 120px; + height: 48px; + border-radius: 25px; + font-size: larger; +} + +/*------------- RESPONSIVE -------------*/ + +@media screen and (max-width: $RESPONSIVE_THRESHOLD_MOBILE) { + .whiteWindow { + justify-content: start; + width: 100vw; + height: calc(100vh - 64px); + border-radius: 0; + } + + .smalWhiteBox { + position: absolute; + bottom: 0; + left: 0; + right: 0; + z-index: 5; + width: calc(100vw - 64px); + height: fit-content; + border-top-left-radius: 25px; + border-top-right-radius: 25px; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + box-shadow: 0px -3px 10px 0px #00000033; + } + + .showSearchedUsersWindow { + max-height: 80px; + } +} diff --git a/src/app/components/sidebar/sidebar-channels/add-new-channel/add-new-channel.component.spec.ts b/src/app/components/sidebar/sidebar-channels/add-new-channel/add-new-channel.component.spec.ts new file mode 100644 index 0000000..03b8ee8 --- /dev/null +++ b/src/app/components/sidebar/sidebar-channels/add-new-channel/add-new-channel.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { AddNewChannelComponent } from './add-new-channel.component'; + +describe('AddNewChannelComponent', () => { + let component: AddNewChannelComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [AddNewChannelComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(AddNewChannelComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/components/sidebar/sidebar-channels/add-new-channel/add-new-channel.component.ts b/src/app/components/sidebar/sidebar-channels/add-new-channel/add-new-channel.component.ts new file mode 100644 index 0000000..ebc2e2b --- /dev/null +++ b/src/app/components/sidebar/sidebar-channels/add-new-channel/add-new-channel.component.ts @@ -0,0 +1,219 @@ +import { CommonModule } from '@angular/common'; +import { Component, Input } from '@angular/core'; +import { ChannleService } from '../../../../service/channle.service'; +import { SmallBtnComponent } from '../../../../shared/components/small-btn/small-btn.component'; +import { FormsModule } from '@angular/forms'; +import { UserService } from '../../../../service/user.service'; +import { User } from '../../../../interface/user.interface'; +import { Channel } from '../../../../interface/channel.interface'; +import { Router } from '@angular/router'; +import { SharedService } from '../../../../service/shared.service'; +import { ToggleBooleanService } from '../../../../service/toggle-boolean.service'; +import { TranslateModule } from '@ngx-translate/core'; + +@Component({ + selector: 'app-add-new-channel', + standalone: true, + imports: [CommonModule, SmallBtnComponent, FormsModule, TranslateModule], + templateUrl: './add-new-channel.component.html', + styleUrl: './add-new-channel.component.scss', +}) +export class AddNewChannelComponent { + @Input() viewWidth: number = 0; + + currentDate: string = new Date().toISOString().split('T')[0]; + changeImg: boolean = false; + userName: string = ''; + showExistenUsers: boolean = false; + getSearchedUser: User[] = []; + channelName: string = ''; + channelDescription: string = ''; + privatChannel: boolean = false; + getSelectedUsers: User[] = []; + selectedUsers: string[] = []; + testarray: string[] = []; + channelIsPrivat: boolean = false; + showNextWindow: boolean = false; + showNextWindowMobile: boolean = false; + + constructor( + public channelService: ChannleService, + public userService: UserService, + public route: Router, + private sharedService: SharedService, + private toggleBooleanService: ToggleBooleanService + ) {} + + RESPONSIVE_THRESHOLD_MOBILE = this.sharedService.RESPONSIVE_THRESHOLD_MOBILE; + + /** + * Toggles the visibility of the add channel box. + */ + toggleShowAddChannelBox() { + this.channelService.showAddChannelBox = + !this.channelService.showAddChannelBox; + this.showNextWindow = false; + this.showNextWindowMobile = false; + this.channelName = ''; + this.channelDescription = ''; + } + + /** + * Toggles the visibility of the next window. + */ + createNewChannel() { + if (this.viewWidth <= this.RESPONSIVE_THRESHOLD_MOBILE) { + this.showNextWindowMobile = true; + } else { + this.showNextWindow = true; + } + } + + /** + * Toggles the button to true. + */ + toggleBtnTrue() { + this.changeImg = true; + this.channelIsPrivat = true; + } + + /** + * Toggles the button to false. + */ + toggleBtnFalse() { + this.changeImg = false; + this.channelIsPrivat = false; + } + + /** + * Filters users based on input. + * @param userName The name of the user to filter. + */ + filterUsers(userName: string) { + this.showExistenUsers = true; + this.getSearchedUser = []; + const searchedUser = userName.toLowerCase().trim(); + const filteredUsers = this.userService.getUsers().filter((user) => { + const fullName = `${user.firstName} ${user.lastName}`.toLowerCase(); + return ( + fullName.includes(searchedUser) && + user.id !== this.userService.getCurrentUserId() + ); + }); + this.getSearchedUser.push(...filteredUsers); + } + + /** + * Chooses a user. + * @param user The user to choose. + */ + chooseUser(user: User) { + const isUserAlreadySelected = this.getSelectedUsers.some( + (selectedUser) => selectedUser.id === user.id + ); + + if (!isUserAlreadySelected) { + this.selectedUsers.push(user.id!); + this.getSelectedUsers.push(user); + console.log('this.selectedUsers', this.selectedUsers); + } else { + console.log('User already selected!'); + } + this.userName = ''; + this.showExistenUsers = false; + } + + /** + * Removes the current user. + * @param index The index of the user to remove. + */ + spliceCurrentUser(index: number) { + this.getSelectedUsers.splice(index, 1); + this.showExistenUsers = false; + } + + /** + * Toggles the added user box. + */ + toggleAddedUserBox() { + this.showExistenUsers = false; + } + + /** + * Checks if the channel name is valid. + * @param channelName The name of the channel to check. + */ + checkIfChannelNameIsValid(channelName: string) { + const channelNameLenght = channelName.length; + if (channelNameLenght >= 6 && !this.chechIfChannelExist(channelName)) { + this.channelService.btnIsValid = true; + } else { + this.channelService.btnIsValid = false; + } + } + + /** + * Check if channel is allready existing. + * @param channelName + * @returns + */ + chechIfChannelExist(channelName: string){ + const filterChannel = this.channelService.allChannels.some(channel => channel.name === channelName); + if (filterChannel) { + return true; + } else { + return false; + } + } + + /** + * Adds a new channel. + */ + async addNewChannel() { + const newChannel: Channel = { + name: this.channelName, + description: this.channelDescription || '', + creator: this.userService.getCurrentUserId(), + privatChannel: this.privatChannel, + hashtag: this.channelName, + createdDate: this.currentDate, + addedUser: this.checkUserArray(), + }; + const channelId = await this.channelService.createNewChannel( + newChannel, + 'channels' + ); + this.openAddNewChannelWindow(); + if (this.viewWidth <= this.RESPONSIVE_THRESHOLD_MOBILE) { + this.toggleBooleanService.isSidebarOpen = false; + } + this.route.navigateByUrl(`main/${channelId}`); + } + + /** + * Checks the user array. + * @returns The user array. + */ + checkUserArray() { + if (this.channelIsPrivat) { + return [...this.selectedUsers, this.userService.getCurrentUserId()]; + } else { + return this.userService.getUserIDs; + } + } + + /** + * Opens the add new channel window. + */ + openAddNewChannelWindow() { + this.channelService.showAddChannelBox = + !this.channelService.showAddChannelBox; + this.channelName = ''; + this.channelDescription = ''; + this.channelService.btnIsValid = false; + this.getSelectedUsers = []; + this.selectedUsers = []; + this.showNextWindow = false; + this.showNextWindowMobile = false; + } +} diff --git a/src/app/components/sidebar/sidebar-channels/sidebar-channels.component.html b/src/app/components/sidebar/sidebar-channels/sidebar-channels.component.html new file mode 100644 index 0000000..c26f8f6 --- /dev/null +++ b/src/app/components/sidebar/sidebar-channels/sidebar-channels.component.html @@ -0,0 +1,59 @@ +
+
+
+ + +

{{ 'sidebar-channels.channel' | translate }}

+
+
+ + +
+
+
+ @for (channel of getChannels(); track channel; let i = $index) { +
+ +

{{ channel.name }}

+
+ } +
+
+
+ +
+

{{ 'sidebar-channels.addChannel' | translate }}

+
+ +
diff --git a/src/app/components/sidebar/sidebar-channels/sidebar-channels.component.scss b/src/app/components/sidebar/sidebar-channels/sidebar-channels.component.scss new file mode 100644 index 0000000..3266cbd --- /dev/null +++ b/src/app/components/sidebar/sidebar-channels/sidebar-channels.component.scss @@ -0,0 +1,168 @@ +@import "../../../../styles.scss"; + +section { + display: flex; + flex-direction: column; + min-width: 300px; +} + +.headline { + display: flex; + justify-content: space-between; + padding-bottom: 12px; +} + +.btn { + display: flex; + align-items: center; + justify-content: right; + padding-right: 12px; + width: 60px; +} + +.headlineText { + display: flex; + align-items: center; + cursor: pointer; + .arrowImg { + width: 10px; + height: 10px; + object-fit: contain; + } + img { + &:first-child { + padding-right: 24px; + } + + &:nth-child(2) { + padding-right: 6px; + } + } + + p { + font-size: 20px; + font-weight: 700; + } + + &:hover { + filter: invert(25%) sepia(100%) saturate(1833%) hue-rotate(230deg) + brightness(101%) contrast(89%); + } +} + +.boxOfAllChannels { + max-height: 16vh; + overflow: auto; + .channelName { + display: flex; + align-items: center; + margin: 12px 24px; + padding: 8px; + max-width: fit-content; + cursor: pointer; + + img { + width: 16px; + height: 16px; + padding-right: 12px; + margin-left: 4px; + } + + p { + font-size: 18px; + font-weight: 400; + padding-right: 8px; + } + + &:hover, + &:focus { + background-color: #edeefe; + border-radius: 24px; + } + } +} + +.active { + cursor: default; + background-color: #edeefe; + border-radius: 24px; +} + +.addChannel { + display: flex; + align-items: center; + margin: 12px 24px; + padding: 8px; + cursor: pointer; + .circle { + display: flex; + align-items: center; + justify-content: center; + width: 24px; + height: 24px; + margin-left: 6px; + + img { + width: 20px; + height: 20px; + padding-right: 12px; + } + } + + p { + font-size: 18px; + font-weight: 400; + padding-left: 2px; + } + + &:hover { + filter: invert(25%) sepia(100%) saturate(1833%) hue-rotate(230deg) + brightness(101%) contrast(89%); + + .circle { + img { + width: 22px; + height: 24px; + } + } + } +} + +.showAllChanneld { + animation-name: slideIn; + overflow: auto; + transition: max-height 0.3s ease-in-out; + max-height: 25vh; +} + +@keyframes slideIn { + from { + max-height: 0; + } + + to { + max-height: 16vh; + } +} + +.hideAllChannels { + animation-name: slideOut; + transition: max-height 0.3s ease-in-out; + max-height: 0; +} + +@keyframes slideOut { + from { + max-height: 16vh; + } + + to { + max-height: 0; + } +} + +@media screen and (max-width: $RESPONSIVE_THRESHOLD_MOBILE380px) { + .showAllChanneld { + max-height: 16vh; + } +} diff --git a/src/app/components/sidebar/sidebar-channels/sidebar-channels.component.spec.ts b/src/app/components/sidebar/sidebar-channels/sidebar-channels.component.spec.ts new file mode 100644 index 0000000..0a3290c --- /dev/null +++ b/src/app/components/sidebar/sidebar-channels/sidebar-channels.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SidebarChannelsComponent } from './sidebar-channels.component'; + +describe('SidebarChannelsComponent', () => { + let component: SidebarChannelsComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [SidebarChannelsComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(SidebarChannelsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/components/sidebar/sidebar-channels/sidebar-channels.component.ts b/src/app/components/sidebar/sidebar-channels/sidebar-channels.component.ts new file mode 100644 index 0000000..a8905d9 --- /dev/null +++ b/src/app/components/sidebar/sidebar-channels/sidebar-channels.component.ts @@ -0,0 +1,87 @@ +import { Component, Input } from '@angular/core'; +import { ChannleService } from '../../../service/channle.service'; +import { Channel, publicChannels } from '../../../interface/channel.interface'; +import { RouterLink } from '@angular/router'; +import { ChatService } from '../../../service/chat.service'; +import { SmallBtnComponent } from '../../../shared/components/small-btn/small-btn.component'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { AddNewChannelComponent } from './add-new-channel/add-new-channel.component'; +import { UserService } from '../../../service/user.service'; +import { ToggleBooleanService } from '../../../service/toggle-boolean.service'; +import { TranslateModule } from '@ngx-translate/core'; +import { SharedService } from '../../../service/shared.service'; + +@Component({ + selector: 'app-sidebar-channels', + standalone: true, + imports: [ + RouterLink, + SmallBtnComponent, + CommonModule, + FormsModule, + AddNewChannelComponent, + TranslateModule, + ], + templateUrl: './sidebar-channels.component.html', + styleUrl: './sidebar-channels.component.scss', +}) +export class SidebarChannelsComponent { + @Input() currentChannel: string = ''; + @Input() viewWidth: number = 0; + + minimizeChannels: boolean = true; + + constructor( + public channelService: ChannleService, + public chatService: ChatService, + public userService: UserService, + public toggleBoolean: ToggleBooleanService, + private sharedService: SharedService + ) {} + + RESPONSIVE_THRESHOLD = this.sharedService.RESPONSIVE_THRESHOLD; + + /** + * Toggles the visibility of channels. + */ + minimizeAllChannels() { + this.minimizeChannels = !this.minimizeChannels; + } + + /** + * Opens the add new channel window. + */ + openAddChannelWindow() { + this.channelService.btnIsValid = false; + this.channelService.showAddChannelBox = true; + } + + /** + * Closes the secondary chat window & sidebar. + */ + closeSecondaryChatAndSidebar() { + this.chatService.toggleSecondaryChat('none'); + if (this.viewWidth <= this.RESPONSIVE_THRESHOLD) { + this.toggleBoolean.isSidebarOpen = false; + } + } + + /** + * The channels accessible to the current user are scrolled, public channels are at the top + * @returns {Channel[]} An array of Channel objects. + */ + getChannels(): Channel[] { + const userChannels = this.channelService.allChannels.filter((channel) => + channel.addedUser.includes(this.userService.getCurrentUserId()) + ); + const priorityChannels = userChannels.filter((channel) => + publicChannels.includes(channel.id!) + ); + const otherChannels = userChannels.filter( + (channel) => !priorityChannels.includes(channel) + ); + + return [...priorityChannels, ...otherChannels]; + } +} diff --git a/src/app/components/sidebar/sidebar-direct-messages-user/sidebar-direct-messages-user.component.html b/src/app/components/sidebar/sidebar-direct-messages-user/sidebar-direct-messages-user.component.html new file mode 100644 index 0000000..79e1f40 --- /dev/null +++ b/src/app/components/sidebar/sidebar-direct-messages-user/sidebar-direct-messages-user.component.html @@ -0,0 +1,81 @@ +
+ @for (directMessage of + displayPrivateChat(this.userService.getCurrentUserId()); track directMessage; + let i = $index) { + + @if (directMessage.creatorId === this.userService.getCurrentUserId() && + directMessage.talkToUserId === this.userService.getCurrentUserId()) { @for + (user of getChatUsers(directMessage.creatorId); track user){ +
+
+ + +
+

+ {{ user.firstName }} {{ user.lastName }} ({{ + "sidebar-direct-messages-user.you" | translate + }}) +

+
+ } } + + @if (directMessage.talkToUserId === this.userService.getCurrentUserId() && + directMessage.creatorId !== this.userService.getCurrentUserId()) { @for (user + of getChatUsers(directMessage.creatorId); track user){ +
+
+ + +
+

{{ user.firstName }} {{ user.lastName }}

+
+ } } + + @if (directMessage.creatorId === this.userService.getCurrentUserId() && + directMessage.talkToUserId !== this.userService.getCurrentUserId()) { @for + (user of getChatUsers(directMessage.talkToUserId); track user){ +
+
+ + +
+

{{ user.firstName }} {{ user.lastName }}

+
+ } } } +
diff --git a/src/app/components/sidebar/sidebar-direct-messages-user/sidebar-direct-messages-user.component.scss b/src/app/components/sidebar/sidebar-direct-messages-user/sidebar-direct-messages-user.component.scss new file mode 100644 index 0000000..ba48864 --- /dev/null +++ b/src/app/components/sidebar/sidebar-direct-messages-user/sidebar-direct-messages-user.component.scss @@ -0,0 +1,59 @@ +@import "../../../../styles.scss"; + +section { + display: flex; + flex-direction: column; + max-height: 27vh; + margin: 18px 0 0 12px; + overflow: auto; + min-width: 300px; +} + +.user { + display: flex; + align-items: center; + margin: 6px; + padding: 6px; + max-width: fit-content; + cursor: pointer; + .imgBox { + display: flex; + align-items: flex-end; + .userImg { + width: 50px; + height: 50px; + object-fit: cover; + border-radius: 50%; + } + .onlineIcon { + width: 16px; + height: 16px; + border-radius: 50%; + margin-left: -12px; + } + } + p { + font-size: 18px; + font-weight: 400; + padding: 0 12px 0 18px; + text-align: left; + } + &:hover, + &:active { + background-color: #edeefe; + border-radius: 36px; + } +} + +.active { + cursor: default; + background-color: #edeefe; + border-radius: 36px; +} + + +@media screen and (max-width: $RESPONSIVE_THRESHOLD_MOBILE380px) { + section { + max-height: 22vh; + } +} \ No newline at end of file diff --git a/src/app/components/sidebar/sidebar-direct-messages-user/sidebar-direct-messages-user.component.spec.ts b/src/app/components/sidebar/sidebar-direct-messages-user/sidebar-direct-messages-user.component.spec.ts new file mode 100644 index 0000000..bd02fcf --- /dev/null +++ b/src/app/components/sidebar/sidebar-direct-messages-user/sidebar-direct-messages-user.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SidebarDirectMessagesUserComponent } from './sidebar-direct-messages-user.component'; + +describe('SidebarDirectMessagesUserComponent', () => { + let component: SidebarDirectMessagesUserComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [SidebarDirectMessagesUserComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(SidebarDirectMessagesUserComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/components/sidebar/sidebar-direct-messages-user/sidebar-direct-messages-user.component.ts b/src/app/components/sidebar/sidebar-direct-messages-user/sidebar-direct-messages-user.component.ts new file mode 100644 index 0000000..c3e8028 --- /dev/null +++ b/src/app/components/sidebar/sidebar-direct-messages-user/sidebar-direct-messages-user.component.ts @@ -0,0 +1,117 @@ +import { Component, Input } from '@angular/core'; +import { UserService } from '../../../service/user.service'; +import { CommonModule } from '@angular/common'; +import { ChannleService } from '../../../service/channle.service'; +import { RouterLink } from '@angular/router'; +import { ChatService } from '../../../service/chat.service'; +import { ToggleBooleanService } from '../../../service/toggle-boolean.service'; +import { SharedService } from '../../../service/shared.service'; +import { PrvChannel } from '../../../interface/channel.interface'; +import { TranslateModule } from '@ngx-translate/core'; + +@Component({ + selector: 'app-sidebar-direct-messages-user', + standalone: true, + imports: [CommonModule, RouterLink, TranslateModule], + templateUrl: './sidebar-direct-messages-user.component.html', + styleUrl: './sidebar-direct-messages-user.component.scss', +}) +export class SidebarDirectMessagesUserComponent { + @Input() currentChannel: string = ''; + @Input() viewWidth: number = 0; + + constructor( + public userService: UserService, + private channelService: ChannleService, + public chatService: ChatService, + public toggleBoolean: ToggleBooleanService, + private sharedService: SharedService + ) {} + + RESPONSIVE_THRESHOLD = this.sharedService.RESPONSIVE_THRESHOLD; + + /** + * Get users for private chat. + * @param userId The ID of the user. + * @returns Array of User objects. + */ + getChatUsers(userId: string) { + const filteredTasks = this.userService + .getUsers() + .filter((user) => user.id == userId); + return filteredTasks; + } + + /** + * Closes the secondary chat window & sidebar. + */ + closeSecondaryChatAndSidebar() { + this.chatService.toggleSecondaryChat('none'); + if (this.viewWidth <= this.RESPONSIVE_THRESHOLD) { + this.toggleBoolean.isSidebarOpen = false; + } + } + + /** + * Display private chat channels associated with the provided user ID. + * @param {string} userId - The ID of the user for whom private chat channels are to be displayed. + * @returns {Array} - An array of unique private chat channels sorted based on specific criteria. + */ + displayPrivateChat(userId: string) { + const creatorChannels = this.channelService.allPrvChannels.filter( + (channel) => channel.creatorId === userId + ); + const talkToUserChannels = this.channelService.allPrvChannels.filter( + (channel) => channel.talkToUserId === userId + ); + const allChannels = creatorChannels.concat(talkToUserChannels); + + // Sort the channels so that the channel with corrent logged in userId comes first + this.sortUserPrivatChannel(allChannels, userId); + const firstChannel = allChannels.shift(); + + // Sort the channels based on the last date of the chat + this.sortAllAnotherChannel(allChannels, userId); + + if (firstChannel) { + allChannels.unshift(firstChannel); + } + + return Array.from(new Set(allChannels)); + } + + /** + * Sorts an array if it is the own user channel + * @param {PrvChannel[]} allChannels - Array of private channels to sort. + * @param {string} userId - The ID of the user. + */ + sortUserPrivatChannel(allChannels: PrvChannel[], userId: string) { + allChannels.sort((a, b) => { + if (a.creatorId === userId) return -1; + if (b.creatorId === userId) return 1; + return 0; + }); + } + + /** + * Sorts an array of private channels based on the last message's timestamp. + * @param {PrvChannel[]} allChannels - Array of private channels to sort. + * @param {string} userId - The ID of the user. + */ + sortAllAnotherChannel(allChannels: PrvChannel[], userId: string) { + allChannels.sort((a, b) => { + const lastMessageA = this.chatService.allChats + .filter((chat) => chat.channelId === a.id) + .sort((x, y) => y.publishedTimestamp - x.publishedTimestamp)[0]; + + const lastMessageB = this.chatService.allChats + .filter((chat) => chat.channelId === b.id) + .sort((x, y) => y.publishedTimestamp - x.publishedTimestamp)[0]; + + if (!lastMessageA) return 1; + if (!lastMessageB) return -1; + + return lastMessageB.publishedTimestamp - lastMessageA.publishedTimestamp; + }); + } +} diff --git a/src/app/components/sidebar/sidebar-direct-messages/sidebar-direct-messages.component.html b/src/app/components/sidebar/sidebar-direct-messages/sidebar-direct-messages.component.html new file mode 100644 index 0000000..222f8d1 --- /dev/null +++ b/src/app/components/sidebar/sidebar-direct-messages/sidebar-direct-messages.component.html @@ -0,0 +1,39 @@ +
+
+
+ + +

{{ "sidebar-direct-messages.messages" | translate }}

+
+ @if (!showAllUsers) { +
+ + +
+ } @if (showAllUsers) { +
+ +
+ } +
+ +
diff --git a/src/app/components/sidebar/sidebar-direct-messages/sidebar-direct-messages.component.scss b/src/app/components/sidebar/sidebar-direct-messages/sidebar-direct-messages.component.scss new file mode 100644 index 0000000..3d7a435 --- /dev/null +++ b/src/app/components/sidebar/sidebar-direct-messages/sidebar-direct-messages.component.scss @@ -0,0 +1,87 @@ +section { + display: flex; + flex-direction: column; + min-width: 300px; +} + +.headline { + display: flex; + justify-content: space-between; + align-items: center; +} + +.invisibleDiv { + display: flex; + justify-content: space-between; + align-items: center; + position: relative; +} + +.btnAllUsersWindow { + display: flex; + align-items: center; + justify-content: right; + padding-right: 12px; + width: 60px; +} + +.headlineText { + display: flex; + align-items: center; + cursor: pointer; + .arrowImg { + width: 10px; + height: 10px; + object-fit: contain; + } + img { + &:first-child { + padding-right: 24px; + } + &:nth-child(2) { + padding-right: 6px; + } + } + p { + font-size: 20px; + font-weight: 700; + } + &:hover { + filter: invert(25%) sepia(100%) saturate(1833%) hue-rotate(230deg) + brightness(101%) contrast(89%); + } +} + +.showAllUsers { + animation-name: slideIn; + transition: max-height 0.3s ease-in-out; + overflow: hidden; + max-height: 32vh; +} + +@keyframes slideIn { + from { + height: 0; + } + + to { + height: 100%; + } +} + +.hideAllUsers { + transition: max-height 0.3s ease-in-out; + animation-name: slideOut; + overflow: hidden; + max-height: 0; +} + +@keyframes slideOut { + from { + max-height: 0; + } + + to { + max-height: 32vh; + } +} diff --git a/src/app/components/sidebar/sidebar-direct-messages/sidebar-direct-messages.component.spec.ts b/src/app/components/sidebar/sidebar-direct-messages/sidebar-direct-messages.component.spec.ts new file mode 100644 index 0000000..e77b171 --- /dev/null +++ b/src/app/components/sidebar/sidebar-direct-messages/sidebar-direct-messages.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SidebarDirectMessagesComponent } from './sidebar-direct-messages.component'; + +describe('SidebarDirectMessagesComponent', () => { + let component: SidebarDirectMessagesComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [SidebarDirectMessagesComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(SidebarDirectMessagesComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/components/sidebar/sidebar-direct-messages/sidebar-direct-messages.component.ts b/src/app/components/sidebar/sidebar-direct-messages/sidebar-direct-messages.component.ts new file mode 100644 index 0000000..979ef45 --- /dev/null +++ b/src/app/components/sidebar/sidebar-direct-messages/sidebar-direct-messages.component.ts @@ -0,0 +1,64 @@ +import { Component, HostListener, Input } from '@angular/core'; +import { SidebarDirectMessagesUserComponent } from '../sidebar-direct-messages-user/sidebar-direct-messages-user.component'; +import { CommonModule } from '@angular/common'; +import { TranslateModule } from '@ngx-translate/core'; +import { SmallBtnComponent } from '../../../shared/components/small-btn/small-btn.component'; +import { ShowAllUsersComponent } from '../show-all-users/show-all-users.component'; + +@Component({ + selector: 'app-sidebar-direct-messages', + standalone: true, + imports: [ + SidebarDirectMessagesUserComponent, + CommonModule, + TranslateModule, + SmallBtnComponent, + ShowAllUsersComponent, + ], + templateUrl: './sidebar-direct-messages.component.html', + styleUrl: './sidebar-direct-messages.component.scss', +}) +export class SidebarDirectMessagesComponent { + @Input() currentChannel: string = ''; + @Input() viewWidth: number = 0; + + minimizeUsers: boolean = false; + showAllUsers: boolean = false; + + /** + * Toggles the visibility of direct message users. + */ + minimizeAllUsers() { + this.minimizeUsers = !this.minimizeUsers; + } + + /** + * Toggles the state of the member list emitter. + * @param {boolean} variable - The boolean variable determining the state of the member list emitter. + */ + toggleMemberListEmitter(variable: boolean) { + this.showAllUsers = variable; + } + + /** + * Toggles the visibility of the all users window. + */ + toggleAllUsersWindow() { + this.showAllUsers = !this.showAllUsers; + } + + /** + * Checks if the click event happens outside of the all users window, and closes it if necessary. + * @param {MouseEvent} event - The mouse event object. + */ + @HostListener('document:click', ['$event']) + checkOpenAllUsersWindow(event: MouseEvent) { + const targetElement = event.target as HTMLElement; + if ( + !targetElement.closest('.whiteBoxAllUsersWindow') && + !targetElement.closest('.btnAllUsersWindow') + ) { + this.showAllUsers = false; + } + } +} diff --git a/src/app/components/sidebar/sidebar-toggle/sidebar-toggle.component.html b/src/app/components/sidebar/sidebar-toggle/sidebar-toggle.component.html new file mode 100644 index 0000000..2cc8864 --- /dev/null +++ b/src/app/components/sidebar/sidebar-toggle/sidebar-toggle.component.html @@ -0,0 +1,6 @@ +
+ +
diff --git a/src/app/components/sidebar/sidebar-toggle/sidebar-toggle.component.scss b/src/app/components/sidebar/sidebar-toggle/sidebar-toggle.component.scss new file mode 100644 index 0000000..35cfde0 --- /dev/null +++ b/src/app/components/sidebar/sidebar-toggle/sidebar-toggle.component.scss @@ -0,0 +1,44 @@ +section { + display: flex; + align-items: center; + justify-content: center; + position: fixed; + bottom: 10vh; + left: 0; + width: 40px; + height: 306px; + border-top-right-radius: 24px; + border-bottom-right-radius: 24px; + background-color: #fff; + box-shadow: 10px 5px 5px rgba($color: #000000, $alpha: 0.2); + z-index: 1; + cursor: pointer; + &:hover { + box-shadow: 10px 5px 5px rgba($color: #000000, $alpha: 0.3); + p { + color: #535af1; + } + img { + filter: brightness(0) saturate(100%) invert(29%) sepia(86%) + saturate(1584%) hue-rotate(224deg) brightness(96%) contrast(96%); + } + } +} + +.menu { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + p { + font-size: 20px; + font-weight: 500; + writing-mode: vertical-lr; + transform: scale(-1); + padding-bottom: 12px; + } + img { + width: 18px; + height: 18px; + } +} diff --git a/src/app/components/sidebar/sidebar-toggle/sidebar-toggle.component.spec.ts b/src/app/components/sidebar/sidebar-toggle/sidebar-toggle.component.spec.ts new file mode 100644 index 0000000..b03c60c --- /dev/null +++ b/src/app/components/sidebar/sidebar-toggle/sidebar-toggle.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SidebarToggleComponent } from './sidebar-toggle.component'; + +describe('SidebarToggleComponent', () => { + let component: SidebarToggleComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [SidebarToggleComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(SidebarToggleComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/components/sidebar/sidebar-toggle/sidebar-toggle.component.ts b/src/app/components/sidebar/sidebar-toggle/sidebar-toggle.component.ts new file mode 100644 index 0000000..ffeac38 --- /dev/null +++ b/src/app/components/sidebar/sidebar-toggle/sidebar-toggle.component.ts @@ -0,0 +1,43 @@ +import { Component, Input } from '@angular/core'; +import { ChatService } from '../../../service/chat.service'; +import { ToggleBooleanService } from '../../../service/toggle-boolean.service'; +import { TranslateModule } from '@ngx-translate/core'; + +@Component({ + selector: 'app-sidebar-toggle', + standalone: true, + imports: [TranslateModule], + templateUrl: './sidebar-toggle.component.html', + styleUrl: './sidebar-toggle.component.scss', +}) +export class SidebarToggleComponent { + @Input() viewWidth: number = 0; + + constructor( + private chatService: ChatService, + private toggleBoolean: ToggleBooleanService + ) {} + + + /** + * Toggles the sidebar visibility and checks the view width. + */ + toggleSidebar() { + this.toggleBoolean.isSidebarOpen = !this.toggleBoolean.isSidebarOpen; + this.checkViewWidth(); + } + + + /** + * Checks the view width and adjusts sidebar and chat states accordingly. + */ + checkViewWidth() { + if (this.viewWidth <= 1900 && this.chatService.isSecondaryChatOpen) { + this.toggleBoolean.isSidebarOpen = true; + } + if (this.viewWidth <= 1900) { + this.chatService.isSecondaryChatId = ''; + this.chatService.isSecondaryChatOpen = false; + } + } +} diff --git a/src/app/components/sidebar/sidebar.component.html b/src/app/components/sidebar/sidebar.component.html new file mode 100644 index 0000000..1734d18 --- /dev/null +++ b/src/app/components/sidebar/sidebar.component.html @@ -0,0 +1,45 @@ +
+ @if (viewWidth >= RESPONSIVE_THRESHOLD) { +
+ +
+ + +
+
+ } @else { + + } + +
+ +
+
+ +
+
diff --git a/src/app/components/sidebar/sidebar.component.scss b/src/app/components/sidebar/sidebar.component.scss new file mode 100644 index 0000000..ba59d12 --- /dev/null +++ b/src/app/components/sidebar/sidebar.component.scss @@ -0,0 +1,61 @@ +@import "./../../../styles.scss"; + +section { + height: 100%; + border-radius: 24px; + background-color: #fff; +} + +.btn { + display: flex; + align-items: center; + justify-content: right; + padding-right: 12px; + width: 60px; +} + +.headline { + display: flex; + justify-content: space-between; + align-items: center; + .logo { + display: flex; + justify-content: left; + align-items: center; + img { + width: 60px; + height: 60px; + background-color: black; + border-radius: 100%; + margin-right: 12px; + } + p { + font-size: 24px; + font-weight: 700; + } + } +} + +.channels, +.directMessages, +.headline { + padding: 36px 36px 0 36px; +} + +.searchBar { + padding: 12px; +} + +/*------------- RESPONSIVE -------------*/ + +@media screen and (max-width: $RESPONSIVE_THRESHOLD_MOBILE) { + section { + border-radius: 0; + } + + .channels, + .directMessages, + .headline { + padding: 12px; + } +} diff --git a/src/app/components/sidebar/sidebar.component.spec.ts b/src/app/components/sidebar/sidebar.component.spec.ts new file mode 100644 index 0000000..85e49bd --- /dev/null +++ b/src/app/components/sidebar/sidebar.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SidebarComponent } from './sidebar.component'; + +describe('SidebarComponent', () => { + let component: SidebarComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [SidebarComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(SidebarComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/components/sidebar/sidebar.component.ts b/src/app/components/sidebar/sidebar.component.ts new file mode 100644 index 0000000..0946046 --- /dev/null +++ b/src/app/components/sidebar/sidebar.component.ts @@ -0,0 +1,75 @@ +import { ChangeDetectorRef, Component, Input, OnInit } from '@angular/core'; +import { ActivatedRoute, RouterModule } from '@angular/router'; +import { SidebarChannelsComponent } from './sidebar-channels/sidebar-channels.component'; +import { SidebarDirectMessagesComponent } from './sidebar-direct-messages/sidebar-direct-messages.component'; +import { SmallBtnComponent } from '../../shared/components/small-btn/small-btn.component'; +import { CommonModule } from '@angular/common'; +import { ChannleService } from '../../service/channle.service'; +import { SearchbarComponent } from './searchbar/searchbar.component'; +import { ToggleBooleanService } from '../../service/toggle-boolean.service'; +import { ChatService } from '../../service/chat.service'; +import { SharedService } from '../../service/shared.service'; +import { SearchBarComponent } from '../../shared/components/header/search-bar/search-bar.component'; +@Component({ + selector: 'app-sidebar', + standalone: true, + imports: [ + RouterModule, + SidebarChannelsComponent, + SidebarDirectMessagesComponent, + SmallBtnComponent, + CommonModule, + SearchbarComponent, + SearchBarComponent, + ], + templateUrl: './sidebar.component.html', + styleUrl: './sidebar.component.scss', +}) +export class SidebarComponent implements OnInit { + @Input() viewWidth: number = 0; + @Input() btnPosition: boolean = false; + + currentChannel: string = ''; + + constructor( + public channelService: ChannleService, + public toggleBoolean: ToggleBooleanService, + private router: ActivatedRoute, + public chatService: ChatService, + private sharedService: SharedService + ) {} + + RESPONSIVE_THRESHOLD = this.sharedService.RESPONSIVE_THRESHOLD; + + ngOnInit() { + this.routeUserId(); + } + + /** + * Opens the search bar by toggling a boolean value. + */ + openSearchbar() { + this.toggleBoolean.openSearchWindow = true; + } + + /** + * Closes the secondary chat window & sidebar. + */ + closeSecondaryChatAndSidebar() { + this.chatService.toggleSecondaryChat('none'); + if (this.viewWidth <= this.RESPONSIVE_THRESHOLD) { + this.toggleBoolean.isSidebarOpen = false; + } + } + + /** + * Retrieves the user ID from the route parameters. + */ + routeUserId() { + if (this.router.params.subscribe()) { + this.router.params.subscribe((params) => { + this.currentChannel = params['id']; + }); + } + } +} diff --git a/src/app/highlight.pipe.spec.ts b/src/app/highlight.pipe.spec.ts new file mode 100644 index 0000000..f64cac0 --- /dev/null +++ b/src/app/highlight.pipe.spec.ts @@ -0,0 +1,8 @@ +import { HighlightPipe } from './highlight.pipe'; + +describe('HighlightPipe', () => { + it('create an instance', () => { + const pipe = new HighlightPipe(); + expect(pipe).toBeTruthy(); + }); +}); diff --git a/src/app/highlight.pipe.ts b/src/app/highlight.pipe.ts new file mode 100644 index 0000000..0b7d585 --- /dev/null +++ b/src/app/highlight.pipe.ts @@ -0,0 +1,22 @@ +import { Pipe, PipeTransform } from '@angular/core'; + +@Pipe({ + name: 'highlight', + standalone: true, +}) +export class HighlightPipe implements PipeTransform { + /** + * Transforms the input text by highlighting matches of the search query. + * @param wholeText The entire text where matches will be highlighted. + * @param inputValue The search query to highlight. + * @returns The transformed text with highlighted matches. + */ + transform(wholeText: string, inputValue: string): string { + if (!inputValue) { + return wholeText; + } + const escapedInputValue = inputValue.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); + const re = new RegExp(escapedInputValue, 'gi'); + return wholeText.replace(re, '$&'); + } +} diff --git a/src/app/interface/channel.interface.ts b/src/app/interface/channel.interface.ts new file mode 100644 index 0000000..16a676a --- /dev/null +++ b/src/app/interface/channel.interface.ts @@ -0,0 +1,20 @@ +export const publicChannels: string[] = [ + 'ktoVhTjif9OndCsLfEF7', + 't0zOHsjKzq0uYSqsMx8j', +]; +export interface Channel { + id?: string; + name: string; + description: string; + creator: string; + privatChannel: boolean; + hashtag: string; + createdDate: string; + addedUser: Array; +} + +export interface PrvChannel { + id?: string; + creatorId: string; + talkToUserId: string; +} diff --git a/src/app/interface/chat.interface.ts b/src/app/interface/chat.interface.ts new file mode 100644 index 0000000..c679387 --- /dev/null +++ b/src/app/interface/chat.interface.ts @@ -0,0 +1,33 @@ +export interface Chat { + id: string; + userId: string; + channelId: string; + message: string; + edited: boolean; + publishedTimestamp: number; +} + +export interface ChatAnswers { + id: string; + chatId: string; + message: string; + edited: boolean; + publishedTimestamp: number; + userId: string; +} + +export interface ChatReactions { + id?: string; + chatId: string; + icon: string; + userId: string[]; +} + +export interface MessageData { + message: string; + publishedTimestamp: number; + userId: string; + channelId?: string; + chatId?: string; + edited: boolean; +} diff --git a/src/app/interface/user.interface.ts b/src/app/interface/user.interface.ts new file mode 100644 index 0000000..8c39df4 --- /dev/null +++ b/src/app/interface/user.interface.ts @@ -0,0 +1,9 @@ +export interface User { + id?: string; + uid:string; + firstName: string; + lastName: string; + avatar: string; + email:string; + status:boolean; +} diff --git a/src/app/service/channle.service.ts b/src/app/service/channle.service.ts new file mode 100644 index 0000000..6ddeabd --- /dev/null +++ b/src/app/service/channle.service.ts @@ -0,0 +1,163 @@ +import { Injectable, OnDestroy, inject } from '@angular/core'; +import { + Firestore, + addDoc, + collection, + doc, + onSnapshot, + updateDoc, +} from '@angular/fire/firestore'; +import { + publicChannels, + Channel, + PrvChannel, +} from '../interface/channel.interface'; +import { ChatService } from './chat.service'; + +@Injectable({ + providedIn: 'root', +}) +export class ChannleService implements OnDestroy { + firestore: Firestore = inject(Firestore); + + allChannels: Channel[] = []; + publicChannels: string[] = publicChannels; + showAddChannelBox: boolean = false; + btnIsValid: boolean = false; + saveEditBtnIsValid: boolean = false; + openPrvChat: boolean = false; + allPrvChannels: PrvChannel[] = []; + channelMembers: string[] = []; + loggedInUser: string = ''; + getChannelID: string = ''; + + unsubChannel; + unsubPrvChannel; + + constructor(private chatService: ChatService) { + this.unsubChannel = this.subChannelList(); + this.unsubPrvChannel = this.subPrvChannelList(); + } + + /** + * Construct Firestore path for a given collection. + * @param path Path of the collection in Firestore. + * @returns Firestore collection reference. + */ + firesorePath(path: string) { + return collection(this.firestore, path); + } + + /** + * Subscribe to the list of public channels in Firestore. + * @returns Unsubscribe function. + */ + subChannelList() { + return onSnapshot(this.firesorePath('channels'), (list) => { + this.allChannels = []; + list.forEach((element) => { + const channelWithId = { id: element.id, ...element.data() } as Channel; + this.allChannels.push(channelWithId); + }); + }); + } + + /** + * Subscribe to the list of public channels in Firestore. + * @returns Unsubscribe function. + */ + subPrvChannelList() { + return onSnapshot(this.firesorePath('prv-channels'), (list) => { + this.allPrvChannels = []; + list.forEach((element) => { + const channelWithId = { + id: element.id, + ...element.data(), + } as PrvChannel; + this.allPrvChannels.push(channelWithId); + }); + }); + } + + /** + * Update name or description of a channel in Firestore. + * @param category Collection category (e.g., 'channels' or 'prv-channels'). + * @param channelID ID of the channel to update. + * @param channelCategory Category to update ('name' or 'description'). + * @param textValue New value for the category. + */ + async saveAddedNameOrDescription( + category: string, + channelID: string, + channelCategory: string, + textValue: string + ) { + const docRef = doc(this.firestore, `${category}/${channelID}`); + await updateDoc(docRef, { [channelCategory]: textValue }); + } + + /** + * Create a new channel or private channel in Firestore. + * @param newChannel Channel or private channel object to create. + * @param path Path of the collection in Firestore. + * @returns ID of the newly created channel or undefined if creation fails. + */ + async createNewChannel( + newChannel: Channel | PrvChannel, + path: string + ): Promise { + try { + const docRef = await addDoc(this.firesorePath(path), newChannel); + this.chatService.getPrvChatId = docRef.id; + return docRef.id; + } catch (err) { + console.error('Error creating channel:', err); + return undefined; + } + } + + /** + * Add new member(s) to a channel in Firestore. + * @param category Collection category (e.g., 'channels' or 'prv-channels'). + * @param channelID ID of the channel to update. + * @param selectedUsers Array of user IDs to add as members. + * @param checkCategory Category to check ('addUserToChannel'). + */ + async addNewMemberToChannel( + category: string, + channelID: string, + selectedUsers: string[], + checkCategory: string + ) { + const currentChannelUsers = this.allChannels.filter( + (channel) => channel.id === channelID + ); + if (checkCategory === 'addUserToChannel') { + const allMembers: string[] = [ + ...selectedUsers, + ...currentChannelUsers[0].addedUser, + ]; + const docRef = doc(this.firestore, `${category}/${channelID}`); + await updateDoc(docRef, { addedUser: allMembers }); + } else if (checkCategory === 'leaveChannel') { + const docRef = doc(this.firestore, `${category}/${channelID}`); + await updateDoc(docRef, { addedUser: selectedUsers }); + } + } + + /** + * Clean up subscriptions when the service is destroyed. + */ + ngOnDestroy() { + this.unsubChannel(); + this.unsubPrvChannel(); + } + + /** + * Placeholder function for committing a batch of Firestore writes. + * @param batch Firestore batch object. + */ + commitBatch(batch: any) { + throw new Error('Function not implemented.'); + } +} diff --git a/src/app/service/chat.service.ts b/src/app/service/chat.service.ts new file mode 100644 index 0000000..a50b80d --- /dev/null +++ b/src/app/service/chat.service.ts @@ -0,0 +1,192 @@ +import { Injectable, OnDestroy, inject } from '@angular/core'; +import { + Firestore, + addDoc, + collection, + deleteDoc, + doc, + onSnapshot, + orderBy, + query, + updateDoc, +} from '@angular/fire/firestore'; +import { Chat, ChatAnswers, ChatReactions } from '../interface/chat.interface'; + +@Injectable({ + providedIn: 'root', +}) +export class ChatService implements OnDestroy { + firestore: Firestore = inject(Firestore); + + allChats: Chat[] = []; + allChatAnswers: ChatAnswers[] = []; + allChatReactions: ChatReactions[] = []; + isSecondaryChatId: string = ''; + isSecondaryChatOpen: boolean = false; + getChannelId: string = ''; + getPrvChatId: string = ''; + inputValue: string = ''; + + unsubChat; + unsubChatAnswers; + unsubChatReactions; + + constructor() { + this.unsubChat = this.subChatList(); + this.unsubChatAnswers = this.subChatAnswersList(); + this.unsubChatReactions = this.subChatListReactions(); + } + + + /** + * Subscribes to the chat list collection in Firestore and updates the local chat list accordingly. + * @returns A function to unsubscribe from the chat list. + */ + subChatList() { + const queryRef = query( + collection(this.firestore, 'chats'), + orderBy('publishedTimestamp') + ); + + return onSnapshot(queryRef, (list) => { + this.allChats = []; + list.forEach((element) => { + const chatWithId = { id: element.id, ...element.data() } as Chat; + this.allChats.push(chatWithId); + }); + }); + } + + + /** + * Subscribes to the chat answers list collection in Firestore and updates the local chat answers list accordingly. + * @returns A function to unsubscribe from the chat answers list. + */ + subChatAnswersList() { + return onSnapshot(collection(this.firestore, 'chat-answers'), (list) => { + this.allChatAnswers = []; + list.forEach((element) => { + const chatWithId = { id: element.id, ...element.data() } as ChatAnswers; + this.allChatAnswers.push(chatWithId); + }); + }); + } + + + /** + * Subscribes to the chat reactions list collection in Firestore and updates the local chat reactions list accordingly. + * @returns A function to unsubscribe from the chat reactions list. + */ + subChatListReactions() { + return onSnapshot(collection(this.firestore, 'reactions'), (list) => { + this.allChatReactions = []; + list.forEach((element) => { + const chatReactionsWithId = { + id: element.id, + ...element.data(), + } as ChatReactions; + this.allChatReactions.push(chatReactionsWithId); + }); + }); + } + + + /** + * Updates the specified chat document with the provided data. + * @param chatId The ID of the chat document to update. + * @param update The partial data to update the chat document with. + */ + async updateChat(chatId: string, update: Partial) { + const chatRef = doc(collection(this.firestore, 'chats'), chatId); + const updatedData = { ...update, edited: true }; + await updateDoc(chatRef, updatedData).catch((err) => { + console.error(err); + throw err; + }); + } + + + /** + * Updates the reaction document with the specified ID with the provided array of user IDs. + * @param reactionId The ID of the reaction document to update. + * @param array The array of user IDs to update the reaction with. + */ + async updateReaction(reactionId: any, array: string[]) { + await updateDoc(doc(collection(this.firestore, 'reactions'), reactionId), { + userId: array, + }).catch((err) => { + console.error(err); + }); + } + + + /** + * Creates a new reaction document with the provided data. + * @param reaction The reaction data to add to Firestore. + */ + async createNewReaction(reaction: ChatReactions) { + await addDoc(collection(this.firestore, 'reactions'), reaction).catch( + (err) => { + console.error(err); + } + ); + } + + + /** + * Deletes a document from the specified Firestore collection. + * @param docId The ID of the document to delete. + * @param database The name of the Firestore collection. + */ + async deleteData(docId: string, database: string) { + await deleteDoc(doc(collection(this.firestore, database), docId)).catch( + (err) => { + console.error(err); + } + ); + } + + + /** + * Retrieves chat answers associated with the specified chat ID. + * @param chatId The ID of the chat to retrieve answers for. + * @returns An array of chat answers. + */ + getChatAnswers(chatId: string): ChatAnswers[] { + const filteredTasks = this.allChatAnswers.filter( + (chat) => chat.chatId == chatId + ); + return filteredTasks; + } + + + /** + * Toggles the secondary chat window based on the provided chat ID. + * @param chatId The ID of the chat to toggle the secondary window for. + */ + toggleSecondaryChat(chatId: string) { + if (this.isSecondaryChatId == chatId) { + chatId = 'none'; + } + if (chatId == 'none') { + this.isSecondaryChatOpen = false; + this.isSecondaryChatId = ''; + } else { + this.isSecondaryChatOpen = true; + } + + if (this.isSecondaryChatOpen) { + this.isSecondaryChatId = chatId; + } + } + + + /** + * Unsubscribes from all Firestore subscriptions when the service is destroyed. + */ + ngOnDestroy() { + this.unsubChat(); + this.unsubChatAnswers(); + this.unsubChatReactions(); + } +} diff --git a/src/app/service/download-files.service.ts b/src/app/service/download-files.service.ts new file mode 100644 index 0000000..016c791 --- /dev/null +++ b/src/app/service/download-files.service.ts @@ -0,0 +1,65 @@ +import { Injectable, Input, OnInit } from '@angular/core'; +import { + getDownloadURL, + getStorage, + listAll, + ref, + uploadBytes, +} from '@angular/fire/storage'; +import { BehaviorSubject } from 'rxjs'; + +@Injectable({ + providedIn: 'root', +}) +export class DownloadFilesService { + uploadFiles: File[] = []; + downloadedFiles: BehaviorSubject<{ id: string; files: string[] }[]> = + new BehaviorSubject<{ id: string; files: string[] }[]>([]); + + fileNames: any[] = []; + + constructor() { + this.listAllFiles(); + } + + loadAllFiles(docID: string) { + // lädt die fails in den firebase storage + const storage = getStorage(); + for (const file of this.uploadFiles) { + const storageRef = ref(storage, `chatFiles/${docID}/${file.name}`); + uploadBytes(storageRef, file).then((snapshot) => { + this.listAllFiles(); + }); + } + } + + listAllFiles() { + const storage = getStorage(); + const listRef2 = ref(storage, 'chatFiles'); + + listAll(listRef2) + .then(async (res) => { + const downloadedFilesData: { id: string; files: string[] }[] = []; + + for (const folderRef of res.prefixes) { + const folderID = folderRef.name; + const folderFiles = []; + + const folderRes = await listAll(folderRef); + + for (const fileRef of folderRes.items) { + const url = await getDownloadURL(fileRef); + folderFiles.push(url); + } + + downloadedFilesData.push({ id: folderID, files: folderFiles }); + } + + // Emit the updated value + this.downloadedFiles.next(downloadedFilesData); + }) + .catch((error) => { + console.error('Fehler beim Abrufen der Dateien:', error); + }); + } +} diff --git a/src/app/service/language.service.ts b/src/app/service/language.service.ts new file mode 100644 index 0000000..e491b1d --- /dev/null +++ b/src/app/service/language.service.ts @@ -0,0 +1,26 @@ +import { Injectable } from '@angular/core'; +import { TranslateService } from '@ngx-translate/core'; + +@Injectable({ + providedIn: 'root', +}) +export class LanguageService { + currentLang = 'en'; + + constructor(private translate: TranslateService) { + this.translate.setDefaultLang(this.currentLang); + } + + + /** + * Switches the application's current language. + * + * This method sets the current language based on the specified `lang` parameter and updates the translation service to use the new language. This is useful for enabling runtime language switching in a multi-lingual application. + * + * @param lang The language code to switch to. Supported values are 'en' for English and 'de' for German. + */ + switchLanguage() { + this.currentLang = this.currentLang === 'en' ? 'de' : 'en'; + this.translate.use(this.currentLang); + } +} diff --git a/src/app/service/login.service.ts b/src/app/service/login.service.ts new file mode 100644 index 0000000..6dd06f5 --- /dev/null +++ b/src/app/service/login.service.ts @@ -0,0 +1,390 @@ +import { Injectable, inject } from '@angular/core'; +import { + Firestore, + QuerySnapshot, + addDoc, + arrayUnion, + collection, + doc, + getDocs, + query, + updateDoc, + where, +} from '@angular/fire/firestore'; +// import { User } from '../interface/user.interface'; +import { + getAuth, + signInWithPopup, + GoogleAuthProvider, + signInWithEmailAndPassword, + createUserWithEmailAndPassword, +} from 'firebase/auth'; +import { Router } from '@angular/router'; +import { User } from '../interface/user.interface'; +import { UserService } from './user.service'; +import { publicChannels } from '../interface/channel.interface'; +// import { User } from 'firebase/auth'; + +@Injectable({ + providedIn: 'root', +}) +export class loginService { + firestore: Firestore = inject(Firestore); + email: string = ''; + password: string = ''; + name: string = ''; + firstName: string = ''; + lastName: string = ''; + avatar: string = './assets/img/user-icons/guest.svg'; + currentUser: string = ''; + errorMessage: string = ''; + isFirstLoad: boolean = true; + passwordFieldType: string = 'password'; + passwordIcon: string = './assets/img/login/close-eye.svg'; + private hasAnimationPlayed = false; + private introCompleteStatus = false; + + constructor(private router: Router, private userService: UserService) { + this.ifUserLoggedIn(); + } + + /** + * Checks if a user is logged in by checking if there is a user stored in the local storage. + * If a user is found, it redirects to the main page. + * @returns {void} + */ + ifUserLoggedIn() { + let currentUser = localStorage.getItem('currentUserDABubble'); + if (currentUser !== null) { + this.router.navigate([`/main`]); + } + } + + // -------------------- login start -------------------------------> + + /** + * Authenticates a user using their email and password, fetches the user document, and handles errors. + */ + login() { + const auth = getAuth(); + signInWithEmailAndPassword(auth, this.email, this.password) + .then((userCredential) => { + const user = userCredential.user; + const usersCollection = collection(this.firestore, 'users'); + const querySnapshot = query( + usersCollection, + where('uid', '==', user.uid) + ); + getDocs(querySnapshot) + .then((snapshot) => this.userDocument(snapshot)) + .catch((error) => { + console.error('Fehler beim Abrufen des Benutzerdokuments:', error); + }); + }) + .catch((error) => { + const errorCode = error.code; + this.switchCase(errorCode); + }); + } + + /** + * Processes the query snapshot to fetch user document data and updates local and session state. + * @param snapshot QuerySnapshot object containing user documents. + */ + userDocument(snapshot: QuerySnapshot) { + if (snapshot.docs.length > 0) { + const userDoc = snapshot.docs[0]; + this.currentUser = userDoc.id; + this.getUserIdInLocalStorage(this.currentUser); + this.email = ''; + this.password = ''; + } else { + console.error('Kein zugehöriges Benutzerdokument gefunden.'); + } + } + + /** + * Handles error codes returned from login attempts and sets appropriate error messages. + * @param errorCode String representing the error code returned from Firebase authentication. + */ + switchCase(errorCode: string) { + switch (errorCode) { + case 'auth/invalid-credential': + this.errorMessage = + '*Ungültige Anmeldeinformationen. Bitte überprüfen Sie Ihre Eingaben.'; + break; + case 'auth/too-many-requests': + this.errorMessage = + '*Der Zugriff auf dieses Konto wurde aufgrund zahlreicher fehlgeschlagener Anmeldeversuche vorübergehend deaktiviert.'; + break; + default: + this.errorMessage = '*Bitte Überprüfe deine Eingaben.'; + break; + } + } + + /** + * Performs a guest login using predetermined credentials and updates the user's online status. + */ + guestLogin() { + const auth = getAuth(); + const email = 'guest@guestaccount.com'; + const password = 'guest@guestaccount.com'; + const userId = 'BSUUclnjovMeE3v85Hmy'; + this.email = 'guest@guestaccount.com'; + this.password = 'guest@guestaccount.com'; + + signInWithEmailAndPassword(auth, email, password) + .then(() => { + this.getUserIdInLocalStorage(userId); + this.email = ''; + this.password = ''; + }) + .catch((error) => { + console.error(error); + this.errorMessage = + 'Fehler bei der Gastanmeldung. Bitte versuchen Sie es später erneut.'; + }); + } + + // -------------------- register -------------------------------> + + /** + * Registers a new user with Firebase authentication and stores user data in Firestore. + */ + register() { + const auth = getAuth(); + createUserWithEmailAndPassword(auth, this.email, this.password) + .then((userCredential) => { + const user = userCredential.user; + + const userDataToSave: User = { + uid: user.uid, + firstName: this.firstName, + lastName: this.lastName, + avatar: this.avatar, + email: this.email, + status: true, + }; + + this.createUserInFirestore(userDataToSave); + this.deleteUserFormData(); + }) + .catch((error) => { + console.error(error); + this.deleteUserFormData(); + }); + } + + /** + * Saves user data to Firestore and updates the application state. + * @param user The user object containing information to be saved. + */ + async createUserInFirestore(user: User) { + const userDataToSave: User = { + uid: user.uid, + email: user.email, + firstName: user.firstName || '', + lastName: user.lastName || '', + avatar: user.avatar || './assets/img/user-icons/guest.svg', + status: true, + }; + const usersCollection = collection(this.firestore, 'users'); + try { + const docRef = await addDoc(usersCollection, userDataToSave); + this.currentUser = docRef.id; + await this.addUserToChannels(this.currentUser, publicChannels); + await this.addPrivateChannel(this.currentUser); + this.getUserIdInLocalStorage(this.currentUser); + this.email = ''; + this.password = ''; + } catch (error) { + console.error(error); + } + } + + // -------------------- choose avatar -------------------------------> + + /** + * Gets the URL of the avatar and updates the avatar source. + * @param url String URL of the avatar. + * @return Updated avatar URL. + */ + getAvatarUrl(url: string) { + return (this.avatar = url); + } + + // -------------------- animation login -------------------------------> + + /** + * Retrieves the animation state indicating whether it has played. + * @returns {boolean} True if the animation has already played, false otherwise. + */ + getAnimationState(): boolean { + return this.hasAnimationPlayed; + } + + /** + * Retrieves the completion status of the introduction class. + * @returns {boolean} True if the introduction is complete, false otherwise. + */ + getFinalclass(): boolean { + return this.introCompleteStatus; + } + + /** + * Sets the animation state. + * @param {boolean} state - The new state of the animation. + */ + setAnimationState(state: boolean): void { + this.hasAnimationPlayed = state; + } + + /** + * Sets the final class completion status. + * @param {boolean} state - The new completion status of the introduction. + */ + setFinalClass(state: boolean): void { + this.introCompleteStatus = state; + } + + // -------------------- GoogleLogin -------------------------------> + + /** + * Handles the user's sign-in process via Google authentication. + * Invokes Firebase's signInWithPopup to authenticate and potentially creates or updates the user's data in Firestore. + */ + googleLogin() { + const auth = getAuth(); + const provider = new GoogleAuthProvider(); + + signInWithPopup(auth, provider) + .then((result) => { + const user = result.user; + const usersCollection = collection(this.firestore, 'users'); + const querySnapshot = query( + usersCollection, + where('uid', '==', user.uid) + ); + getDocs(querySnapshot).then((snapshot) => { + if (snapshot.empty) { + this.createUserInFirestore({ + uid: user.uid, + email: user.email || 'leer@gmail.com', + firstName: user.displayName + ? user.displayName.split(' ')[0] + : 'FirstName', + lastName: user.displayName + ? user.displayName.split(' ').slice(1).join(' ') + : 'LastName', + avatar: user.photoURL || './assets/img/user-icons/guest.svg', + status: true, + }); + } else { + this.ifExistUser(snapshot); + } + }); + }) + .catch((error) => { + console.error(error); + }); + } + + /** + * Processes existing user data after successful Google login. + * @param {QuerySnapshot} snapshot - Firestore snapshot containing the user's data. + */ + ifExistUser(snapshot: QuerySnapshot) { + this.currentUser = snapshot.docs[0].id; + this.getUserIdInLocalStorage(this.currentUser); + } + + // -------------------- UserAddFunktions -------------------------------> + + /** + * Updates the online status of the user in Firestore. + * @param userId The user's document ID in Firestore. + */ + async updateUserOnlineStatus(userId: string) { + const userDocRef = doc(this.firestore, 'users', userId); + const updates = { + status: true, + }; + await updateDoc(userDocRef, updates) + .then(() => { + console.error(); + }) + .catch((error) => { + console.error(error); + }); + } + + /** + * Adds the current user to specified channels in Firestore. It updates each channel document + * to include the user's ID in an array of added users, ensuring that the user is part of the channel. + * Each operation is performed independently, and errors are handled individually. + * + * @param {string} currentUser - The ID of the user to be added to the channels. + * @param {string[]} channelIds - An array of channel IDs to which the user will be added. + */ + addUserToChannels(currentUser: string, channelIds: string[]) { + channelIds.forEach((channelId) => { + const channelDocRef = doc(this.firestore, 'channels', channelId); + + updateDoc(channelDocRef, { + addedUser: arrayUnion(currentUser), + }).catch((error) => { + console.error(error); + }); + }); + } + + /** + * Asynchronously adds a private channel for the current user. + * + * This method creates a new document in the 'prv-channels' collection within Firestore. The new document contains the creator's user ID for both the creator and recipient fields, implying a private or personal channel. + * + * @param currentUser The user ID of the current user and the creator of the private channel. + * @async + * @returns {Promise} A promise that resolves when the channel is successfully added or rejects with an error message if the operation fails. + */ + async addPrivateChannel(currentUser: string) { + try { + await addDoc(collection(this.firestore, 'prv-channels'), { + creatorId: currentUser, + talkToUserId: currentUser, + }); + } catch (error) { + console.error('Fehler beim Erstellen des privaten Kanals: ', error); + } + } + + /** + * Stores the current user's ID in the local storage. + * @param {string} userId - The ID of the current user to be stored. + */ + async getUserIdInLocalStorage(userId: string) { + localStorage.setItem('currentUserDABubble', JSON.stringify(userId)); + await this.updateUserOnlineStatus(userId); + window.location.reload(); + } + + deleteUserFormData() { + this.name = ''; + this.email = ''; + this.password = ''; + } + + togglePasswordVisibility() { + this.passwordFieldType = + this.passwordFieldType === 'password' ? 'text' : 'password'; + this.toggleIcon(); + } + + toggleIcon() { + this.passwordIcon = + this.passwordIcon === './assets/img/login/close-eye.svg' + ? './assets/img/login/open-eye.svg' + : './assets/img/login/close-eye.svg'; + } +} diff --git a/src/app/service/overlay.service.ts b/src/app/service/overlay.service.ts new file mode 100644 index 0000000..9e021d4 --- /dev/null +++ b/src/app/service/overlay.service.ts @@ -0,0 +1,16 @@ +import { Injectable } from '@angular/core'; +import { BehaviorSubject } from 'rxjs'; + +@Injectable({ + providedIn: 'root', +}) +export class OverlayService { + private overlayDataSubject = new BehaviorSubject(null); + overlayData$ = this.overlayDataSubject.asObservable(); + + constructor() {} + + setOverlayData(data: any) { + this.overlayDataSubject.next(data); + } +} diff --git a/src/app/service/shared.service.ts b/src/app/service/shared.service.ts new file mode 100644 index 0000000..ce85102 --- /dev/null +++ b/src/app/service/shared.service.ts @@ -0,0 +1,12 @@ +import { Injectable } from '@angular/core'; + +@Injectable({ + providedIn: 'root', +}) +export class SharedService { + // Responsive design: + RESPONSIVE_THRESHOLD_MOBILE: number = 600; + RESPONSIVE_THRESHOLD: number = 1300; + RESPONSIVE_THRESHOLD_MAX: number = 1900; + RESPONSIVE_THRESHOLD_SEARCHBAR: number = 1100; +} diff --git a/src/app/service/toggle-boolean.service.ts b/src/app/service/toggle-boolean.service.ts new file mode 100644 index 0000000..a3f1823 --- /dev/null +++ b/src/app/service/toggle-boolean.service.ts @@ -0,0 +1,25 @@ +import { Injectable } from '@angular/core'; + + +@Injectable({ + providedIn: 'root' +}) +export class ToggleBooleanService { + + constructor() { } + + openSearchWindow: boolean = false; + openChannelMemberWindow: boolean = false; + closeChannelMemberWindow: boolean = false; + openSearchWindowHead: boolean = false; + selectUserInMsgBox:boolean = false; + isSidebarOpen: boolean = true; + + /** + * Opens or closes the add member window based on the provided boolean value. + * @param boolean A boolean value to determine whether to open or close the add member window. + */ + openAddMemberWindow(boolean : boolean){ + this.closeChannelMemberWindow = boolean; + } +} diff --git a/src/app/service/user.service.ts b/src/app/service/user.service.ts new file mode 100644 index 0000000..ff30b62 --- /dev/null +++ b/src/app/service/user.service.ts @@ -0,0 +1,174 @@ +import { Injectable, OnDestroy, inject } from '@angular/core'; +import { + Firestore, + collection, + doc, + onSnapshot, + updateDoc, +} from '@angular/fire/firestore'; +import { User } from '../interface/user.interface'; +import { ChannleService } from './channle.service'; +import { getAuth, signOut } from 'firebase/auth'; +import { Router } from '@angular/router'; + +@Injectable({ + providedIn: 'root', +}) +export class UserService implements OnDestroy { + firestore: Firestore = inject(Firestore); + nameValue: string = ''; + emailValue: string = ''; + allUsers: User[] = []; + getUserIDs: string[] = []; + getFiltertUsers: User[] = []; + isUserLogin: boolean = true; + + unsubUser; + + constructor(private channelService: ChannleService, private route: Router) { + this.unsubUser = this.subUserList(); + } + + /** + * Retrieves the current user's ID from local storage. + * @returns {string|number|undefined} The ID of the current user if found in local storage, otherwise undefined. + */ + getCurrentUserId() { + let currentUser = localStorage.getItem('currentUserDABubble'); + if (currentUser !== null) { + return JSON.parse(currentUser); + } + } + + /** + * Subscribe to the list of users in Firestore. + * @returns Unsubscribe function. + */ + subUserList() { + return onSnapshot(collection(this.firestore, 'users'), (list) => { + this.allUsers = []; + this.getUserIDs = []; + list.forEach((element) => { + const userWithId = { id: element.id, ...element.data() } as User; + this.allUsers.push(userWithId); + this.getUserIDs.push(userWithId.id!); + }); + }); + } + + /** + * Get all users. + * @returns Array of User objects. + */ + getUsers(): User[] { + return this.allUsers; + } + + /** + * Get current user's data. + * @returns Array containing current user's data. + */ + getCurentUsers() { + const filteredUser = this.getUsers().filter( + (user) => user.id == this.getCurrentUserId() + ); + this.nameValue = + filteredUser[0]?.firstName + ' ' + filteredUser[0]?.lastName; + this.emailValue = filteredUser[0]?.email; + return filteredUser; + } + + /** + * Create a private channel between the current user and another user. + * @param filterUserID ID of the user to create the private channel with. + * @returns Existing private channel if it already exists, otherwise an empty string. + */ + createPrvChannel(filterUserID: string) { + const newPrvChannel = { + creatorId: this.getCurrentUserId(), + talkToUserId: filterUserID, + }; + + const channelExistsBoolean = this.channelService.allPrvChannels.some( + (channel) => + (channel.creatorId === newPrvChannel.creatorId && + channel.talkToUserId === newPrvChannel.talkToUserId) || + (channel.creatorId === newPrvChannel.talkToUserId && + channel.talkToUserId === newPrvChannel.creatorId) + ); + if (!channelExistsBoolean) { + const docId = this.channelService.createNewChannel( + newPrvChannel, + 'prv-channels' + ); + return docId; + } + return ''; + } + + /** + * Update current user's data in Firestore. + * @param newFirstName New first name. + * @param newLastName New last name. + * @param newEmail New email. + */ + updateUserData(newFirstName: string, newLastName: string, newEmail: string) { + const userDocRef = doc(this.firestore, 'users', this.getCurrentUserId()); + const updates: any = {}; + + if (newEmail !== '') { + updates.email = newEmail; + } + if (newFirstName !== '') { + updates.firstName = newFirstName; + updates.lastName = newLastName; + } + + updateDoc(userDocRef, updates).catch((error) => { + console.error(error); + }); + } + + /** + * Log out the current user. + */ + currentUserLogout() { + const auth = getAuth(); + const userId = this.getCurrentUserId(); + + if (userId) { + const userDocRef = doc(this.firestore, `users/${userId}`); + + updateDoc(userDocRef, { status: false }) + .then(() => { + signOut(auth) + .then(() => { + this.deleteUserIdInLocalStorage(); + this.route.navigate(['/login']); + }) + .catch((error) => { + console.error(error); + }); + }) + .catch((error) => { + console.error(error); + }); + } else { + console.error('Keine UserID gefunden'); + } + } + + /** + * Deletes the user ID from local storage. + */ + deleteUserIdInLocalStorage() { + localStorage.removeItem('currentUserDABubble'); + } + + /** + * Clean up subscriptions when the service is destroyed. + */ + ngOnDestroy() { + this.unsubUser(); + } +} diff --git a/src/app/shared/components/emoji-picker/emoji-picker.component.html b/src/app/shared/components/emoji-picker/emoji-picker.component.html new file mode 100644 index 0000000..770dcdf --- /dev/null +++ b/src/app/shared/components/emoji-picker/emoji-picker.component.html @@ -0,0 +1,7 @@ + diff --git a/src/app/shared/components/emoji-picker/emoji-picker.component.scss b/src/app/shared/components/emoji-picker/emoji-picker.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/shared/components/emoji-picker/emoji-picker.component.spec.ts b/src/app/shared/components/emoji-picker/emoji-picker.component.spec.ts new file mode 100644 index 0000000..c555cd5 --- /dev/null +++ b/src/app/shared/components/emoji-picker/emoji-picker.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { EmojiPickerComponent } from './emoji-picker.component'; + +describe('EmojiPickerComponent', () => { + let component: EmojiPickerComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [EmojiPickerComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(EmojiPickerComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/shared/components/emoji-picker/emoji-picker.component.ts b/src/app/shared/components/emoji-picker/emoji-picker.component.ts new file mode 100644 index 0000000..3dc604a --- /dev/null +++ b/src/app/shared/components/emoji-picker/emoji-picker.component.ts @@ -0,0 +1,35 @@ +import { Component, EventEmitter, Input, Output, output } from '@angular/core'; +import { PickerComponent } from '@ctrl/ngx-emoji-mart'; + +@Component({ + selector: 'app-emoji-picker', + standalone: true, + imports: [PickerComponent], + templateUrl: './emoji-picker.component.html', + styleUrl: './emoji-picker.component.scss', +}) +export class EmojiPickerComponent { + @Input() output: string = ''; + @Output() emojiOutputEmitter: EventEmitter = new EventEmitter(); + @Output() emojiVisibleEmitter: EventEmitter = + new EventEmitter(); + + + /** + * Adds an emoji. + * @param event The event object. + */ + addEmoji(event: any) { + this.output == 'id' ? this.emojiOutputEmitter.emit(event.emoji.id) : null; + this.output == 'native' + ? this.emojiOutputEmitter.emit(event.emoji.native) + : null; + this.closeEmojiPicker(); + } + + + /** Closes the emoji picker. */ + closeEmojiPicker() { + this.emojiVisibleEmitter.emit(false); + } +} diff --git a/src/app/shared/components/header/edit-user/edit-user-details/edit-user-details.component.html b/src/app/shared/components/header/edit-user/edit-user-details/edit-user-details.component.html new file mode 100644 index 0000000..e3b7996 --- /dev/null +++ b/src/app/shared/components/header/edit-user/edit-user-details/edit-user-details.component.html @@ -0,0 +1,109 @@ +
+@for(i of userService.getCurentUsers(); track i){ +
+
+
+

{{ "edit-user-details.profile" | translate }}

+ +
+ + + +
+
+
+ +

+ {{ "edit-user-details.fullName" | translate }} +

+
+ @if (!filterGuest()) { + + + } @else { + + } +
+ +
+
+ +

{{ "edit-user-details.email" | translate }}

+
+ @if (!filterGuest()) { + + + } @else { + + } +
+
+ +
+ + +
+ @if (asGuestOnline) { +

{{ "edit-user-details.errorMessage" | translate }}

+ } +
+
+} diff --git a/src/app/shared/components/header/edit-user/edit-user-details/edit-user-details.component.scss b/src/app/shared/components/header/edit-user/edit-user-details/edit-user-details.component.scss new file mode 100644 index 0000000..b6329d4 --- /dev/null +++ b/src/app/shared/components/header/edit-user/edit-user-details/edit-user-details.component.scss @@ -0,0 +1,194 @@ +@import "../../../../../../styles.scss"; + +.whiteBox { + width: 400px; + height: auto; + background-color: white; + border-radius: 35px; + position: absolute; + z-index: 5; + top: 110px; + right: 20px; + @include displayFlex(); + flex-direction: column; + padding: 24px; + .boxHeader { + width: 360px; + @include displayFlex($j: space-between); + } + .profileImg { + width: 200px; + height: 200px; + object-fit: cover; + border-radius: 50%; + margin: 56px; + } + p { + color: red; + margin-bottom: 16px; + } +} + +.inputBox { + width: calc(100% - 24px); + margin-bottom: 24px; + .positionName { + .positionNameIcon { + margin: 12px 0; + @include displayFlex($j: flex-start, $g: 20px); + p { + font-size: 21px; + font-weight: 600; + margin: 0; + color: #000; + } + } + .inputName { + width: calc(100% - 24px); + border: 1px solid #888dec; + outline: none; + height: 26px; + border-radius: 25px; + padding: 8px 12px; + margin-bottom: 12px; + font-size: 18px; + font-weight: 400; + transition: 0.3s ease-in-out; + &:hover { + border: 1px solid #2c36f0; + } + } + } +} + +.inputDisabled { + width: calc(100% - 24px); + border: none; + background-color: rgba(34, 34, 34, 0.2588235294); + outline: none; + height: 26px; + border-radius: 25px; + padding: 8px 12px; + margin-bottom: 12px; + font-size: 18px; + font-weight: 400; +} + +.position2Btn { + margin-bottom: 24px; + @include displayFlex($g: 26px); + .cancelBtn { + width: 120px; + height: 48px; + background-color: white; + border: 1px solid #888dec; + border-radius: 25px; + font-size: larger; + color: #444df2; + transition: 0.3s ease-in-out; + &:hover { + background-color: #444df2; + color: white; + cursor: pointer; + } + } + .saveBtn { + width: 120px; + height: 48px; + background-color: #444df2; + border: none; + border-radius: 25px; + font-size: larger; + color: white; + transition: 0.3s ease-in-out; + &:hover { + background-color: #888dec; + cursor: pointer; + } + } +} + +.grayBackground { + width: 100vw; + height: 100vh; + position: absolute; + top: 0; + left: 0; + z-index: 5; +} + +.disabledBtn { + background-color: #22222242; + border: none; + font-size: larger; + color: #fff; + width: 120px; + height: 48px; + border-radius: 25px; + font-size: larger; +} + +/*------------- RESPONSIVE -------------*/ + +@media screen and (max-width: $RESPONSIVE_THRESHOLD_MOBILE) { + .whiteBox { + border-radius: 35px; + width: auto; + right: 22px; + height: auto; + top: unset; + right: 15vw; + left: 15vw; + padding: 24px; + .boxHeader { + width: 100%; + padding: 0 12px; + p { + font-size: 21px; + font-weight: 700; + } + } + .profileImg { + width: 120px; + height: 120px; + margin: 18px; + } + p { + font-size: 13px; + } + } + .detailsBox { + width: 100%; + padding: 0 12px; + .editBtnPosition { + .name { + font-size: 24px; + font-weight: 700; + } + } + } + + .emailBox { + @include displayFlex($j: flex-start, $a: flex-start, $g: 10px); + img { + margin-top: 2px; + } + .email { + > p { + font-size: 18px; + font-weight: 600; + margin-bottom: 10px; + } + > a { + margin-bottom: 0; + } + } + } +} + +@media screen and (max-width: 450px) { + .whiteBox { + right: 5vw; + left: 5vw; + } +} diff --git a/src/app/shared/components/header/edit-user/edit-user-details/edit-user-details.component.spec.ts b/src/app/shared/components/header/edit-user/edit-user-details/edit-user-details.component.spec.ts new file mode 100644 index 0000000..04dd6cf --- /dev/null +++ b/src/app/shared/components/header/edit-user/edit-user-details/edit-user-details.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { EditUserDetailsComponent } from './edit-user-details.component'; + +describe('EditUserDetailsComponent', () => { + let component: EditUserDetailsComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [EditUserDetailsComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(EditUserDetailsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/shared/components/header/edit-user/edit-user-details/edit-user-details.component.ts b/src/app/shared/components/header/edit-user/edit-user-details/edit-user-details.component.ts new file mode 100644 index 0000000..48b2a14 --- /dev/null +++ b/src/app/shared/components/header/edit-user/edit-user-details/edit-user-details.component.ts @@ -0,0 +1,176 @@ +import { CommonModule } from '@angular/common'; +import { + Component, + ElementRef, + EventEmitter, + Input, + Output, + ViewChild, +} from '@angular/core'; +import { EditUserComponent } from '../edit-user.component'; +import { UserService } from '../../../../../service/user.service'; +import { FormsModule, NgForm } from '@angular/forms'; +import { ChannleService } from '../../../../../service/channle.service'; +import { TranslateModule } from '@ngx-translate/core'; +import { SmallBtnComponent } from '../../../small-btn/small-btn.component'; + +@Component({ + selector: 'app-edit-user-details', + standalone: true, + imports: [ + CommonModule, + EditUserComponent, + FormsModule, + TranslateModule, + SmallBtnComponent, + ], + templateUrl: './edit-user-details.component.html', + styleUrl: './edit-user-details.component.scss', +}) +export class EditUserDetailsComponent { + asGuestOnline: boolean = false; + nameValueBoolean: boolean = false; + emailValueBoolean: boolean = false; + changedName: string = ''; + changedEmail: string = ''; + @Input() openEditUserValue!: boolean; + @Input() showCurrentProfile!: boolean; + @ViewChild('inputName') inputName!: ElementRef; + @ViewChild('inputEmail') inputEmail!: ElementRef; + + @Output() closeEditWindow = new EventEmitter(); + @Output() saveUserData = new EventEmitter(); + + constructor( + public userService: UserService, + public channelService: ChannleService + ) {} + + /** Filters whether the user is a guest. */ + filterGuest() { + const getGuest = this.userService.allUsers.filter( + (user) => user.id === this.userService.getCurrentUserId() + ); + if ('BSUUclnjovMeE3v85Hmy' === getGuest[0].id) { + this.asGuestOnline = true; + return false; + } else { + this.asGuestOnline = false; + return true; + } + } + + /** Closes the edit user window. */ + closeEditUserWindow() { + this.openEditUserValue = false; + this.closeEditWindow.emit(this.openEditUserValue); + this.channelService.saveEditBtnIsValid = false; + this.inputName.nativeElement.value = this.userService.nameValue; + this.inputEmail.nativeElement.value = this.userService.emailValue; + } + + /** Saves the new user data. */ + saveNewUserData(ngForm: NgForm) { + if (ngForm.submitted && ngForm.form.valid) { + if (this.channelService.saveEditBtnIsValid || this.emailValueBoolean) { + this.changeNameValue(); + const getName = this.splitNameValue(); + this.changeNameValue(); + this.userService.updateUserData( + getName[0], + getName[1], + this.changedEmail + ); + + this.showCurrentProfile = false; + this.channelService.saveEditBtnIsValid = false; + this.saveUserData.emit(this.showCurrentProfile); + } + } + } + + /** Get the name value. */ + changeNameValue() { + if (this.changedName == '') { + this.changedName = this.userService.nameValue; + } + } + + /**Separate the first ans lastname. */ + splitNameValue() { + const fullname: string[] = this.changedName.split(' '); + const newFirstName: string = fullname[0]; + let newLastName: string = fullname[1]; + if (fullname[2]) { + newLastName += ' ' + fullname[2]; + } + return [newFirstName, newLastName]; + } + + /** Get the email value. */ + chechEmailValue() { + if (this.changedEmail == '') { + this.changedEmail = this.userService.emailValue; + } + } + + /** + * Checks if the user name is valid. + * @param nameValue The value of the user's name. + */ + checkIfUserNameIsValid(nameValue: string) { + if (nameValue.trim() === '') { + this.nameValueBoolean = false; + } else { + const channelNameLenght = nameValue.length; + if (channelNameLenght >= 3) { + this.nameValueBoolean = true; + this.changedName = nameValue; + } else { + this.nameValueBoolean = false; + } + } + this.chackSaveBtnName(); + } + + /** + * Checks if the user email is valid. + * @param emailValue The value of the user's email. + */ + checkIfUserEmailIsValid(emailValue: string) { + if (emailValue.trim() === '') { + this.emailValueBoolean = false; + } else { + const emailRegex = /^[\w.%+-]+@[\w.-]+\.[a-zA-Z]{2,}$/; + if (emailRegex.test(emailValue)) { + this.emailValueBoolean = true; + this.changedEmail = emailValue; + } else { + this.emailValueBoolean = false; + } + } + this.checkSaveBtnEmail(); + } + + /** + * Checks if the save button is valid. + */ + chackSaveBtnName() { + if (this.nameValueBoolean) { + this.channelService.saveEditBtnIsValid = true; + } else { + this.channelService.saveEditBtnIsValid = false; + } + } + + /** + * Checks if the save button is valid. + */ + checkSaveBtnEmail() { + if (this.nameValueBoolean) { + this.channelService.saveEditBtnIsValid = true; + } else { + this.channelService.saveEditBtnIsValid = false; + } + } +} diff --git a/src/app/shared/components/header/edit-user/edit-user.component.html b/src/app/shared/components/header/edit-user/edit-user.component.html new file mode 100644 index 0000000..bbdb46d --- /dev/null +++ b/src/app/shared/components/header/edit-user/edit-user.component.html @@ -0,0 +1,55 @@ +
+@for(i of userService.getCurentUsers(); track i){ +
+
+

Profil

+ +
+ +
+
+

{{ i.firstName }} {{ i.lastName }}

+ +
+ +
+ + @if (i.status) { +

Aktiv

+ } @else { +

Offline

+ } +
+ +
+ + +
+
+
+} + + diff --git a/src/app/shared/components/header/edit-user/edit-user.component.scss b/src/app/shared/components/header/edit-user/edit-user.component.scss new file mode 100644 index 0000000..d1492d0 --- /dev/null +++ b/src/app/shared/components/header/edit-user/edit-user.component.scss @@ -0,0 +1,192 @@ +@import "../../../../../styles.scss"; + +.grayBackground { + position: absolute; + top: 0; + left: 0; + width: 100vw; + height: 100vh; + background-color: rgba(0, 0, 0, 0.3); + @include displayFlex(); + z-index: 2; +} + +.whiteBox { + width: 400px; + height: auto; + background-color: white; + border-radius: 35px; + position: absolute; + z-index: 5; + top: 110px; + right: 20px; + @include displayFlex(); + flex-direction: column; + padding: 24px; + .boxHeader { + width: 360px; + @include displayFlex($j: space-between); + p { + font-size: 24px; + font-weight: 700; + } + } + .profileImg { + width: 200px; + height: 200px; + object-fit: cover; + border-radius: 50%; + margin: 56px; + } + > button { + @include displayFlex($g: 12px); + background-color: #444df2; + border: none; + border-radius: 25px; + padding: 12px; + padding-left: 22px; + padding-right: 22px; + font-size: larger; + font-weight: 500; + color: white; + margin: 32px; + cursor: pointer; + } +} + +.detailsBox { + width: 360px; + .editBtnPosition { + @include displayFlex($j: space-between); + margin-bottom: 20px; + .name { + font-size: 32px; + font-weight: 700; + } + .editBtn { + color: #535af1; + cursor: pointer; + &:hover { + font-weight: 600; + } + } + } + .statusBox { + @include displayFlex($j: flex-start, $g: 12px); + margin-bottom: 40px; + > p { + margin: 0; + font-size: medium; + font-weight: 500; + } + } +} + +.fontColorGreen { + color: #92c83e; +} + +.emailBox { + @include displayFlex($j: flex-start, $a: flex-start, $g: 20px); + height: 96px; + margin-top: 24px; + img { + width: 25px; + height: 20px; + margin-top: 3px; + } + .email { + > p { + font-size: 20px; + font-weight: 600; + margin-bottom: 20px; + } + > a { + color: #4ea1ff; + font-size: 16px; + text-decoration: none; + margin-bottom: 20px; + background: linear-gradient(currentColor 0 0) bottom left/ + var(--underline-width, 0%) 0.1em no-repeat; + display: inline-block; + transition: background-size 0.5s; + &:hover { + --underline-width: 100%; + } + } + } +} + +/*------------- RESPONSIVE -------------*/ + +@media screen and (max-width: $RESPONSIVE_THRESHOLD_MAX) { + .arrowLeft { + display: block; + margin-left: 18px; + transition: 0.3 linear; + &:hover { + cursor: pointer; + scale: 1.2; + } + } +} + +@media screen and (max-width: $RESPONSIVE_THRESHOLD_MOBILE) { + .whiteBox { + border-radius: 35px; + width: auto; + right: 22px; + height: fit-content; + top: unset; + right: 15vw; + left: 15vw; + padding: 24px; + .boxHeader { + width: 100%; + padding: 0 12px; + p { + font-size: 21px; + font-weight: 700; + } + } + .profileImg { + width: 120px; + height: 120px; + margin: 18px; + } + } + .detailsBox { + width: 100%; + padding: 0 12px; + .editBtnPosition { + .name { + font-size: 24px; + font-weight: 700; + } + } + } + + .emailBox { + @include displayFlex($j: flex-start, $a: flex-start, $g: 10px); + img { + margin-top: 2px; + } + .email { + > p { + font-size: 18px; + font-weight: 600; + margin-bottom: 10px; + } + > a { + margin-bottom: 0; + } + } + } +} + +@media screen and (max-width: 450px) { + .whiteBox { + right: 5vw; + left: 5vw; + } +} diff --git a/src/app/shared/components/header/edit-user/edit-user.component.spec.ts b/src/app/shared/components/header/edit-user/edit-user.component.spec.ts new file mode 100644 index 0000000..d38a16c --- /dev/null +++ b/src/app/shared/components/header/edit-user/edit-user.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { EditUserComponent } from './edit-user.component'; + +describe('EditUserComponent', () => { + let component: EditUserComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [EditUserComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(EditUserComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/shared/components/header/edit-user/edit-user.component.ts b/src/app/shared/components/header/edit-user/edit-user.component.ts new file mode 100644 index 0000000..4158c1b --- /dev/null +++ b/src/app/shared/components/header/edit-user/edit-user.component.ts @@ -0,0 +1,55 @@ +import { CommonModule } from '@angular/common'; +import { Component, EventEmitter, Input, Output } from '@angular/core'; +import { EditUserDetailsComponent } from './edit-user-details/edit-user-details.component'; +import { UserService } from '../../../../service/user.service'; +import { TranslateModule } from '@ngx-translate/core'; +import { SmallBtnComponent } from '../../small-btn/small-btn.component'; + +@Component({ + selector: 'app-edit-user', + standalone: true, + imports: [ + CommonModule, + EditUserDetailsComponent, + TranslateModule, + SmallBtnComponent, + ], + templateUrl: './edit-user.component.html', + styleUrl: './edit-user.component.scss', +}) +export class EditUserComponent { + isOnline = true; + openProfil = false; + openEditUserValue = false; + @Input() showCurrentProfile!: boolean; + + @Output() testValueChange = new EventEmitter(); + + constructor(public userService: UserService) {} + + /** Toggles the side menu. */ + showSideMenu() { + this.openEditUserValue = !this.openEditUserValue; + } + + /** Opens the edit user section. */ + openEditUser() { + this.openEditUserValue = true; + } + + /** Closes the current profile. */ + closeCurrentProfile() { + this.showCurrentProfile = false; + this.testValueChange.emit(this.showCurrentProfile); + this.openEditUserValue = false; + } + + /** + * Updates the close value. + * @param value The value to update. + */ + updateCloseValue(value: boolean) { + this.showCurrentProfile = value; + this.openEditUserValue = value; + } +} diff --git a/src/app/shared/components/header/header.component.html b/src/app/shared/components/header/header.component.html new file mode 100644 index 0000000..1d99c93 --- /dev/null +++ b/src/app/shared/components/header/header.component.html @@ -0,0 +1,65 @@ +
+
+ @if (viewWidth <= RESPONSIVE_THRESHOLD && !this.toggleBoolean.isSidebarOpen) + { + + } @else { + + } +
+
+ +
+
+
+ @for(i of userService.getCurentUsers(); track i){ +

{{ i.firstName }} {{ i.lastName }}

+ +
+ + +
+ } + +
+
+
+ + + + diff --git a/src/app/shared/components/header/header.component.scss b/src/app/shared/components/header/header.component.scss new file mode 100644 index 0000000..1b2d807 --- /dev/null +++ b/src/app/shared/components/header/header.component.scss @@ -0,0 +1,217 @@ +@import "../../../../styles.scss"; + +header { + height: 100%; + @include displayFlex($j: space-between); +} + +.logo { + display: flex; + justify-content: left; + align-items: center; + max-width: fit-content; + transition: 0.3 linear; + cursor: pointer; + img { + &:first-child { + margin: 0 15px 0 20px; + } + &:nth-child(2) { + width: 60px; + height: 60px; + background-color: black; + border-radius: 100%; + margin-right: 12px; + } + } + p { + font-size: 24px; + font-weight: 700; + } + &:hover { + scale: 1.025; + } +} + +.leftSide { + @include displayFlex($j: start, $g: 20px); + width: 20vw; + .homeIcon { + width: 242px; + height: 70px; + margin-left: 20px; + } +} + +.middleSide { + width: 40vw; +} + +.rightSide { + width: 20vw; + @include displayFlex($j: end, $g: 20px); + p { + font-size: 28px; + font-weight: 700; + } + .img { + margin-right: 20px; + cursor: pointer; + .profileImg { + width: 80px; + height: 80px; + object-fit: cover; + border-radius: 50%; + } + .onlineIcon { + margin-left: -20px; + } + } + .positionPlanet { + margin-left: -24px; + margin-right: 12px; + margin-top: -54px; + } +} + +.suggestionBox::-webkit-scrollbar { + display: none; +} + +.menu { + position: absolute; + left: 0; + top: 0; + width: 100vw; + height: 100vh; + background-color: rgba(0, 0, 0, 0.3); + z-index: 5; +} + +.whiteBox { + background-color: white; + @include displayFlex($g: 20px); + flex-direction: column; + width: 220px; + height: 160px; + border-top-left-radius: 40px; + border-bottom-left-radius: 40px; + border-bottom-right-radius: 40px; + position: absolute; + top: 110px; + right: 20px; + p { + font-size: 22px; + font-weight: 600; + cursor: pointer; + text-align: center; + padding: 8px; + &:hover { + width: 62%; + background-color: #edeefe; + border-radius: 15px; + color: #444df2; + } + } +} + +.arrowLeft { + display: none; +} + +/*------------- RESPONSIVE -------------*/ + +@media screen and (max-width: $RESPONSIVE_THRESHOLD) { + .middleSide { + display: none; + } + + .rightSide, + .leftSide { + width: 50vw; + margin-left: 0; + } + + .profileImg { + margin: 0; + } +} + +@media screen and (max-width: 800px) { + .rightSide { + @include displayFlex($j: end, $g: 20px); + p { + display: none; + } + .img { + margin-right: 20px; + } + } + + .whiteBox { + @include displayFlex(); + width: 178px; + height: 122px; + } +} + +@media screen and (max-width: $RESPONSIVE_THRESHOLD_MOBILE) { + .whiteBox { + top: unset; + bottom: 0; + right: 0; + width: 100%; + height: 186px; + gap: 16px; + border-radius: 40px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; + } + + .rightSide { + .img { + .profileImg { + width: 50px; + height: 50px; + } + .onlineIcon { + margin-left: -12px; + } + } + .positionPlanet { + margin-left: -38px; + margin-right: 6px; + margin-top: -34px; + } + } + + .leftSide { + @include displayFlex($j: start, $g: 8px); + .homeIcon { + width: 162px; + height: 45px; + } + } + + .logo { + img { + &:first-child { + margin: 0 12px 0 16px; + } + &:nth-child(2) { + width: 50px; + height: 50px; + background-color: black; + border-radius: 100%; + margin-right: 12px; + } + } + p { + font-size: 20px; + font-weight: 700; + } + &:hover { + scale: 1.025; + } + } +} diff --git a/src/app/shared/components/header/header.component.spec.ts b/src/app/shared/components/header/header.component.spec.ts new file mode 100644 index 0000000..4ff21e8 --- /dev/null +++ b/src/app/shared/components/header/header.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { HeaderComponent } from './header.component'; + +describe('HeaderComponent', () => { + let component: HeaderComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [HeaderComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(HeaderComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/shared/components/header/header.component.ts b/src/app/shared/components/header/header.component.ts new file mode 100644 index 0000000..81875c6 --- /dev/null +++ b/src/app/shared/components/header/header.component.ts @@ -0,0 +1,90 @@ +import { CommonModule } from '@angular/common'; +import { Component, Input } from '@angular/core'; +import { EditUserComponent } from './edit-user/edit-user.component'; +import { UserService } from '../../../service/user.service'; +import { SearchBarComponent } from './search-bar/search-bar.component'; +import { ToggleBooleanService } from '../../../service/toggle-boolean.service'; +import { ChatService } from '../../../service/chat.service'; +import { SharedService } from '../../../service/shared.service'; +import { SmallBtnComponent } from '../small-btn/small-btn.component'; +import { LanguageService } from '../../../service/language.service'; +import { TranslateModule } from '@ngx-translate/core'; + +@Component({ + selector: 'app-header', + standalone: true, + imports: [ + CommonModule, + EditUserComponent, + SearchBarComponent, + SmallBtnComponent, + TranslateModule, + ], + templateUrl: './header.component.html', + styleUrl: './header.component.scss', +}) +export class HeaderComponent { + @Input() viewWidth: number = 0; + + openMenu: boolean = false; + showCurrentProfile: boolean = false; + closeProfil: boolean = false; + + constructor( + public userService: UserService, + public toggleBoolean: ToggleBooleanService, + public chatService: ChatService, + private sharedService: SharedService, + public languageService: LanguageService + ) {} + + RESPONSIVE_THRESHOLD = this.sharedService.RESPONSIVE_THRESHOLD; + RESPONSIVE_THRESHOLD_MOBILE = this.sharedService.RESPONSIVE_THRESHOLD_MOBILE; + + /** + * Toggles the display of the side menu. + */ + showSideMenu() { + this.openMenu = !this.openMenu; + } + + /** + * Displays the current user's profile. + */ + showProfile() { + this.showCurrentProfile = true; + this.closeProfil = false; + } + + /** + * Logs out the current user. + */ + logout(): void { + this.userService.currentUserLogout(); + this.chatService.isSecondaryChatId = ''; + this.chatService.isSecondaryChatOpen = false; + } + + /** + * Updates the value indicating whether the current profile is displayed. + * @param value The new value indicating whether the current profile is displayed. + */ + updateTestValue(value: boolean) { + this.showCurrentProfile = value; + } + + /** + * Toggle the Sidebar. + */ + toggleSidebar() { + this.closeSecondaryChat(); + this.toggleBoolean.isSidebarOpen = !this.toggleBoolean.isSidebarOpen; + } + + /** + * Closes the secondary chat window. + */ + closeSecondaryChat() { + this.chatService.toggleSecondaryChat('none'); + } +} diff --git a/src/app/shared/components/header/search-bar/search-bar.component.html b/src/app/shared/components/header/search-bar/search-bar.component.html new file mode 100644 index 0000000..e810ad3 --- /dev/null +++ b/src/app/shared/components/header/search-bar/search-bar.component.html @@ -0,0 +1,86 @@ +
+ + +
+ + @if (filteredUsers.length > 0 && inputValue != '') { +
+

{{ 'search-bar-header.user' | translate }}:

+
+ @for (user of filteredUsers; track user) { +
+
+ + @if (user.status === true) { + + } @else { + + } +
+

+
+ } +
+
+ } @if (filteredChannels.length > 0 && inputValue != '') { +
+

{{ 'search-bar-header.channels' | translate }}:

+
+ @for (channel of filteredChannels; track channel) { +

+ # +

+ } +
+
+ } @if (filteredChats.length > 0 && inputValue != '') { +
+

{{ 'search-bar-header.thread' | translate }}:

+
+ @for (chat of filteredChats; track chat) { +
+

[ {{ getChannel(chat.channelId) }} ]

+
+

+
+
+ } +
+
+ } @if ((filteredUsers.length === 0 && inputValue != '') && + (filteredChannels.length === 0 && inputValue != '') && (filteredChats.length + === 0 && inputValue != '')) { +

{{ "search-bar.errorMessage" | translate }}

+ } +
+
diff --git a/src/app/shared/components/header/search-bar/search-bar.component.scss b/src/app/shared/components/header/search-bar/search-bar.component.scss new file mode 100644 index 0000000..5aeabd3 --- /dev/null +++ b/src/app/shared/components/header/search-bar/search-bar.component.scss @@ -0,0 +1,193 @@ +@import "./../../../../../styles.scss"; + +.inputPosition { + @include displayFlex(); + position: relative; + input { + width: 40vw; + height: 70px; + border-radius: 30px; + padding: 0 24px; + font-size: larger; + border: none; + outline: none; + } + .searchImg { + position: absolute; + right: 36px; + } +} + +.suggestionBox { + z-index: 5; + position: absolute; + top: 100%; + left: 0; + border-radius: 30px; + background-color: white; + box-shadow: rgb(79 98 117) 0px 20px 30px -10px; + scrollbar-width: none; + overflow: scroll; + -ms-overflow-style: none; + display: flex; + gap: 20px; + flex-direction: column; +} +.contantBox { + @include displayFlex($j: space-between, $a: flex-start); + width: 100%; + h4 { + width: 30%; + } + .ansersBox { + @include displayFlex($a: flex-start, $g: 4px); + flex-direction: column; + width: 70%; + } +} + +.contantBoxChats { + @include displayFlex($j: space-between, $a: flex-start); + flex-direction: column; + width: 100%; + .channelAnswers { + width: 100%; + @include displayFlex($g: 4px); + flex-direction: column; + .ansersBoxChats { + width: 100%; + @include displayFlex($j: space-between, $a: flex-start); + .threadNmae { + width: 30%; + } + .threadContetntBox { + width: 70%; + .threadContetnt { + width: fit-content; + padding: 4px; + &:hover { + background-color: #edeefe; + border-radius: 25px; + cursor: pointer; + } + } + } + } + } +} + +.channelName { + padding: 4px; + &:hover { + background-color: #edeefe; + border-radius: 25px; + cursor: pointer; + } +} + +.userDiv { + @include displayFlex(); + padding: 4px; + position: relative; + &:hover { + background-color: #edeefe; + border-radius: 25px; + cursor: pointer; + } + .userImgDiv { + @include displayFlex($j: space-between, $a: flex-end); + .userProfilImg { + width: 32px; + height: 32px; + object-fit: cover; + border-radius: 50%; + } + .userOnlineImg { + position: absolute; + left: 28px; + width: 12px; + height: 12px; + object-fit: cover; + } + } + p { + margin-left: 12px; + } +} + +.showSearchWindow { + animation: shwoSW 0.3s ease-in-out; + width: calc(40vw - 42px); + max-height: 40vh; + padding: 20px; +} + +@keyframes shwoSW { + from { + max-height: 0; + } + to { + max-height: 40vh; + padding: 20px; + } +} + +.hideSearchWindow { + animation: hideSW 0.3s ease-in-out; + width: calc(40vw - 42px); + max-height: 0; + padding: 0; +} + +@keyframes hideSW { + from { + max-height: 40vh; + padding: 20px; + } + to { + max-height: 0; + padding: 20px; + } +} + +/*------------- RESPONSIVE -------------*/ + +@media screen and (max-width: $RESPONSIVE_THRESHOLD) { + .inputPosition { + input { + width: calc(100vw - 72px); + height: 38px; + border-radius: 24px; + padding: 6px 12px; + border: 1px solid #adb0d9; + } + } + + .showSearchWindow, + .hideSearchWindow { + width: calc(100vw - 86px); + max-height: 60vh; + } +} + +@media screen and (max-width: $RESPONSIVE_THRESHOLD_MOBILE) { + .inputPosition { + input { + width: calc(100vw - 56px); + } + } + + .showSearchWindow, + .hideSearchWindow { + width: calc(100vw - 56px); + padding: 20px 10px; + } + + .hideSearchWindow { + padding: 0; + } + + .suggestionBox { + left: unset; + } +} diff --git a/src/app/shared/components/header/search-bar/search-bar.component.spec.ts b/src/app/shared/components/header/search-bar/search-bar.component.spec.ts new file mode 100644 index 0000000..d89e9f1 --- /dev/null +++ b/src/app/shared/components/header/search-bar/search-bar.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SearchBarComponent } from './search-bar.component'; + +describe('SearchBarComponent', () => { + let component: SearchBarComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [SearchBarComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(SearchBarComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/shared/components/header/search-bar/search-bar.component.ts b/src/app/shared/components/header/search-bar/search-bar.component.ts new file mode 100644 index 0000000..42c2bc6 --- /dev/null +++ b/src/app/shared/components/header/search-bar/search-bar.component.ts @@ -0,0 +1,237 @@ +import { CommonModule } from '@angular/common'; +import { Component, Input } from '@angular/core'; +import { User } from '../../../../interface/user.interface'; +import { Channel } from '../../../../interface/channel.interface'; +import { Chat } from '../../../../interface/chat.interface'; +import { UserService } from '../../../../service/user.service'; +import { ToggleBooleanService } from '../../../../service/toggle-boolean.service'; +import { ChannleService } from '../../../../service/channle.service'; +import { ChatService } from '../../../../service/chat.service'; +import { DomSanitizer } from '@angular/platform-browser'; +import { Router, RouterLink } from '@angular/router'; +import { FormsModule } from '@angular/forms'; +import { HighlightPipe } from '../../../../highlight.pipe'; +import { TranslateModule } from '@ngx-translate/core'; +import { SharedService } from '../../../../service/shared.service'; + +@Component({ + selector: 'app-search-bar', + standalone: true, + templateUrl: './search-bar.component.html', + styleUrl: './search-bar.component.scss', + imports: [ + CommonModule, + FormsModule, + RouterLink, + HighlightPipe, + TranslateModule, + ], +}) +export class SearchBarComponent { + @Input() viewWidth: number = 0; + + openMenu: boolean = false; + showCurrentProfile: boolean = false; + isOnline: boolean = true; + closeProfil: boolean = false; + openSearchWindow: boolean = false; + inputValue: string = ''; + filteredUsers: User[] = []; + filteredChannels: Channel[] = []; + filteredChats: Chat[] = []; + + constructor( + public userService: UserService, + public toggleBoolean: ToggleBooleanService, + private channelService: ChannleService, + private chatService: ChatService, + public sanitizer: DomSanitizer, + private route: Router, + private sharedService: SharedService + ) {} + + RESPONSIVE_THRESHOLD = this.sharedService.RESPONSIVE_THRESHOLD; + + /** + * Closes the secondary chat window & sidebar. + */ + closeSecondaryChatAndSidebar() { + this.chatService.toggleSecondaryChat('none'); + if (this.viewWidth <= this.RESPONSIVE_THRESHOLD) { + this.toggleBoolean.isSidebarOpen = false; + this.inputValue = ''; + } + } + + /** + * Filters all information based on the input value. + * @param inputValue The input value entered by the user. + */ + filterAllInfo(inputValue: string) { + if (inputValue !== '') { + this.toggleBoolean.openSearchWindowHead = true; + const getInputValue = inputValue.toLowerCase().trim(); + this.filterUsersChannelsChats(getInputValue); + } else { + this.toggleBoolean.openSearchWindowHead = false; + } + } + + /** + * Filters users, channels, and chats based on the input value. + * @param inputValue The input value entered by the user. + */ + filterUsersChannelsChats(inputValue: string) { + const filterUsers = this.getFilterUsers(inputValue); + const filterChannels = this.getFilterChannels(inputValue); + const filterChants = this.getFilterChats(inputValue); + + this.sortPrvAndPublicMessages(filterChants); + + this.filteredUsers = filterUsers; + this.filteredChannels = filterChannels; + } + + /** + * Filters users based on the input value. + * @param inputValue The input value entered by the user. + * @returns An array of filtered users. + */ + getFilterUsers(inputValue: string) { + return this.userService.getUsers().filter((user) => { + const fullName = `${user.firstName} ${user.lastName}`.toLowerCase(); + return fullName.includes(inputValue); + }); + } + + /** + * Filters channels based on the input value. + * @param inputValue The input value entered by the user. + * @returns An array of filtered channels. + */ + getFilterChannels(inputValue: string) { + const userHasAccessChannels = this.checkUserHasAccessToChannel(); + return userHasAccessChannels.filter((channel) => { + const channelName = `${channel.name}`.toLowerCase(); + return channelName.includes(inputValue); + }); + } + + /** + * Filters chats based on the input value. + * @param inputValue The input value entered by the user. + * @returns An array of filtered chats. + */ + getFilterChats(inputValue: string) { + const userChannels = this.checkUserHasAccessToChannel(); + + return this.chatService.allChats.filter((chat) => { + const chatMessage = `${chat.message}`.toLowerCase(); + return ( + chatMessage.includes(inputValue) && + userChannels.some((channel) => channel.id === chat.channelId) + ); + }); + } + + /** + * Checks whether the user has access to a channel. + * @returns {Array} - A list of channels to which the user has access. + */ + checkUserHasAccessToChannel() { + const isUserAChannelMember = this.channelService.allChannels.some( + (channel) => + channel.addedUser.includes(this.userService.getCurrentUserId()) + ); + + if (isUserAChannelMember) { + return this.channelService.allChannels.filter((channel) => + channel.addedUser.includes(this.userService.getCurrentUserId()) + ); + } + return []; + } + + /** + * Retrieves the channel associated with the specified chat ID. + * @param chatID The ID of the chat. + * @returns The name of the channel. + */ + getChannel(chatID: string) { + if (this.inputValue != '') { + const filteredChatBoolean = this.filteredChats.some( + (chat) => chat.channelId === chatID + ); + if (filteredChatBoolean) { + const filteredChat = this.filteredChats.find( + (chat) => chat.channelId === chatID + ); + const channelName = this.channelService.allChannels.find( + (channel) => channel.id === filteredChat!.channelId + ); + return channelName!.name; + } + } else { + return ''; + } + return ''; + } + + /** + * Sorts private and public messages. + * @param chats The array of chats to sort. + */ + sortPrvAndPublicMessages(chats: Chat[]) { + const publicChats: Chat[] = []; + + for (const chat of chats) { + const isPublicChannel = this.channelService.allPrvChannels.some( + (prvChannel) => prvChannel.id === chat.channelId + ); + if (!isPublicChannel) { + publicChats.push(chat); + } + } + this.filteredChats = publicChats; + } + + /** + * Checks the route based on the specified user. + * @param user The user to check the route for. + */ + async checkRoute(user: User[]) { + const userId = user[0].id!; + const channelExistsBoolean = this.channelService.allPrvChannels.some( + (channel) => + (channel.creatorId === userId && + channel.talkToUserId === this.userService.getCurrentUserId()) || + (channel.creatorId === this.userService.getCurrentUserId() && + channel.talkToUserId === userId) + ); + if (!channelExistsBoolean) { + const id = await this.userService.createPrvChannel(userId); + if (id) { + this.route.navigateByUrl(`main/${id}`); + } + } + this.getRouteToPrvChat(userId, channelExistsBoolean); + } + + /** + * Navigates to the private chat route based on the specified user. + * @param userId The ID of the user. + * @param channelExistsBoolean A boolean indicating whether the channel exists. + */ + getRouteToPrvChat(userId: string, channelExistsBoolean: boolean) { + if (channelExistsBoolean) { + const existingChannel = this.channelService.allPrvChannels.find( + (channel) => + (channel.creatorId === userId && + channel.talkToUserId === this.userService.getCurrentUserId()) || + (channel.creatorId === this.userService.getCurrentUserId() && + channel.talkToUserId === userId) + ); + this.route.navigateByUrl(`main/${existingChannel!.id}`); + } + } +} diff --git a/src/app/shared/components/imprint/imprint.component.html b/src/app/shared/components/imprint/imprint.component.html new file mode 100644 index 0000000..444ceed --- /dev/null +++ b/src/app/shared/components/imprint/imprint.component.html @@ -0,0 +1,74 @@ +
+ +
+
+

{{ "imprint.headline" | translate }}

+ + +
+ {{ "imprint.tmg" | translate }} +

+
+
+

Andre Kempf

+

Großschneidersweg 2a

+

76149 Karlsruhe

+
+
+

Björn ten Eicken

+

Baisieperstraße 31

+

42859 Remscheid

+
+
+

Aleksander Demyanovych

+

Heidweilerstr. 23

+

54313 Zemmer

+
+
+

{{ "imprint.contact" | translate }}

+

+ {{ "imprint.tel" | translate }}: + 0172-4180328 +

+

+ {{ "imprint.mail" | translate }}: + mail@andre-kempf.com +

+
+

{{ "imprint.disclaimer" | translate }}:

+ +

{{ "imprint.liabilityContentHeadline" | translate }}

+ +

{{ "imprint.liabilityContentDescription" | translate }}

+ +

{{ "imprint.liabilityLinksHeadline" | translate }}

+ +

{{ "imprint.liabilityLinksDescription" | translate }}

+ +

{{ "imprint.copyrightHeadline" | translate }}

+ +

{{ "imprint.copyrightDescription" | translate }}

+ +

{{ "imprint.dataProtectionHeadline" | translate }}

+ +

{{ "imprint.dataProtectionDescription" | translate }}

+
+

+ {{ "imprint.sourceText0" | translate }} + {{ + "imprint.sourceLink0" | translate + }} + {{ "imprint.sourceText1" | translate }} + {{ + "imprint.sourceLink1" | translate + }} +

+
+
+
diff --git a/src/app/shared/components/imprint/imprint.component.scss b/src/app/shared/components/imprint/imprint.component.scss new file mode 100644 index 0000000..0105d3d --- /dev/null +++ b/src/app/shared/components/imprint/imprint.component.scss @@ -0,0 +1,105 @@ +section { + word-wrap: break-word; + padding-left: 16px; + padding-right: 16px; + background-color: #eceefe; +} +.container { + background-color: #ffff; + border-radius: 24px; + padding: 80px; + margin-left: 75px; + margin-right: 75px; +} +.header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 32px; + img { + width: 32px; + height: 32px; + cursor: pointer; + margin-left: 48px; + &:hover { + width: 36px; + height: 36px; + background-color: var(--light-gray); + border-radius: 18px; + } + } +} + +h1 { + font-size: 61px; + font-weight: 700; + padding-bottom: 24px; + color: #444df2; +} + +h2 { + font-size: 32px; + font-weight: 700; + padding: 48px 0 24px 0; + color: #444df2; +} + +h3 { + font-size: 20px; + font-weight: 700; + padding: 24px 0; + color: #444df2; +} + +p { + font-size: 16px; + font-weight: 400; + padding-bottom: 10px; +} + +a { + color: var(--light-blue); + text-decoration: none; + &:hover { + text-decoration: underline; + } +} + +.team { + display: flex; + justify-content: start; + gap: 98px; +} +.placholder { + height: 24px; +} + +/*------------- RESPONSIVE -------------*/ +@media screen and (max-width: 1040px) { + section { + padding-right: 0; + } + .team { + flex-direction: column; + gap: 21px; + } +} + +@media screen and (max-width: 910px) { + section { + padding-right: 0; + } +} +@media screen and (max-width: 600px) { + .container { + padding: 24px; + margin-left: 0px; + margin-right: 16px; + } +} + +@media screen and (max-width: 400px) { + h2 { + font-size: 24px; + } +} diff --git a/src/app/shared/components/imprint/imprint.component.spec.ts b/src/app/shared/components/imprint/imprint.component.spec.ts new file mode 100644 index 0000000..f2b9c25 --- /dev/null +++ b/src/app/shared/components/imprint/imprint.component.spec.ts @@ -0,0 +1,21 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { ImprintComponent } from './imprint.component'; + +describe('Imprint', () => { + let component: ImprintComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [ImprintComponent], + }).compileComponents(); + + fixture = TestBed.createComponent(ImprintComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/shared/components/imprint/imprint.component.ts b/src/app/shared/components/imprint/imprint.component.ts new file mode 100644 index 0000000..0ac7c4c --- /dev/null +++ b/src/app/shared/components/imprint/imprint.component.ts @@ -0,0 +1,25 @@ +import { Component } from '@angular/core'; +import { Location } from '@angular/common'; +import { TranslateModule } from '@ngx-translate/core'; +import { HeaderComponent } from "../login/header/header.component"; +import { SmallBtnComponent } from "../small-btn/small-btn.component"; +import { RouterLink } from '@angular/router'; + +@Component({ + selector: 'app-imprint', + standalone: true, + templateUrl: './imprint.component.html', + styleUrl: './imprint.component.scss', + imports: [TranslateModule, HeaderComponent, SmallBtnComponent,RouterLink] +}) +export class ImprintComponent { + constructor(private location: Location) {} + + + /** + * Navigates back to the previous location. + */ + backClicked() { + this.location.back(); + } +} diff --git a/src/app/shared/components/login/footer/footer.component.html b/src/app/shared/components/login/footer/footer.component.html new file mode 100644 index 0000000..b3f50d4 --- /dev/null +++ b/src/app/shared/components/login/footer/footer.component.html @@ -0,0 +1,4 @@ + diff --git a/src/app/shared/components/login/footer/footer.component.scss b/src/app/shared/components/login/footer/footer.component.scss new file mode 100644 index 0000000..0133ec4 --- /dev/null +++ b/src/app/shared/components/login/footer/footer.component.scss @@ -0,0 +1,33 @@ +.footer { + display: flex; + justify-content: center; + gap: 32px; + background-color: #eceefe; + padding-top: 132px; + padding-bottom: 24px; + width: 100vw; + + > a { + font-size: 18px; + font-weight: 400px; + text-decoration: none; + color: #797ef3; + padding-right: 8px; + padding: 0px; + padding: 4px 12px 4px 12px; + border-radius: 100px; + border: 1px solid #eceefe; + &:hover { + border: 1px solid #444df2; + } + } +} +.fontColor { + cursor: pointer; + color: #444df2; +} +@media (max-width: 570px) { + .footer { + padding-top: 32px; + } +} diff --git a/src/app/shared/components/login/footer/footer.component.spec.ts b/src/app/shared/components/login/footer/footer.component.spec.ts new file mode 100644 index 0000000..4647de8 --- /dev/null +++ b/src/app/shared/components/login/footer/footer.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { FooterComponent } from './footer.component'; + +describe('FooterComponent', () => { + let component: FooterComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [FooterComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(FooterComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/shared/components/login/footer/footer.component.ts b/src/app/shared/components/login/footer/footer.component.ts new file mode 100644 index 0000000..5db97b2 --- /dev/null +++ b/src/app/shared/components/login/footer/footer.component.ts @@ -0,0 +1,14 @@ +import { Component } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { TranslateModule } from '@ngx-translate/core'; + +@Component({ + selector: 'app-footer', + standalone: true, + imports: [RouterModule, TranslateModule], + templateUrl: './footer.component.html', + styleUrl: './footer.component.scss' +}) +export class FooterComponent { + +} diff --git a/src/app/shared/components/login/header/header.component.html b/src/app/shared/components/login/header/header.component.html new file mode 100644 index 0000000..995dd95 --- /dev/null +++ b/src/app/shared/components/login/header/header.component.html @@ -0,0 +1,5 @@ +
+
+ +
+
diff --git a/src/app/shared/components/login/header/header.component.scss b/src/app/shared/components/login/header/header.component.scss new file mode 100644 index 0000000..4cab410 --- /dev/null +++ b/src/app/shared/components/login/header/header.component.scss @@ -0,0 +1,13 @@ +.headerContainer { + display: flex; +} +.header { + margin: 75px; + display: flex; + background-color: #eceefe; +} +@media screen and (max-width: 600px) { + .headerContainer { + justify-content: center; + } +} diff --git a/src/app/shared/components/login/header/header.component.spec.ts b/src/app/shared/components/login/header/header.component.spec.ts new file mode 100644 index 0000000..4ff21e8 --- /dev/null +++ b/src/app/shared/components/login/header/header.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { HeaderComponent } from './header.component'; + +describe('HeaderComponent', () => { + let component: HeaderComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [HeaderComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(HeaderComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/shared/components/login/header/header.component.ts b/src/app/shared/components/login/header/header.component.ts new file mode 100644 index 0000000..4f46d3b --- /dev/null +++ b/src/app/shared/components/login/header/header.component.ts @@ -0,0 +1,10 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-header', + standalone: true, + imports: [], + templateUrl: './header.component.html', + styleUrl: './header.component.scss', +}) +export class HeaderComponent {} diff --git a/src/app/shared/components/login/mixins/mixin.scss b/src/app/shared/components/login/mixins/mixin.scss new file mode 100644 index 0000000..a98ec59 --- /dev/null +++ b/src/app/shared/components/login/mixins/mixin.scss @@ -0,0 +1,137 @@ +@mixin SektionBody { + display: flex; + justify-content: space-between; + align-items: center; + flex-direction: column; + background: #eceefe; + height: 100vh; +} +@mixin Card { + max-width: 606px; + width: 100%; + background-color: #fff; + border-radius: 30px; + box-sizing: border-box; + padding: 32px; + display: flex; + flex-direction: column; + align-items: center; + position: relative; + gap: 16px; + height: 690px; +} +@mixin topText { + margin-bottom: 8px; + display: flex; + justify-content: center; + align-items: center; + width: 110%; + > span { + text-align: center; + font-size: 46px; + font-weight: 700; + color: #444df2; + } +} + +.loginBackImg { + cursor: pointer; +} +@mixin InfoText { + margin-bottom: 24px; + text-align: center; + max-width: 486px; + > span { + font-size: 20px; + font-weight: 400; + line-height: 24px; + } +} + +@mixin inputStyle { + padding-left: 60px; + border: 1px solid #ffff; + font-size: 18px; + font-weight: 500; + outline: none; + width: 100%; + box-sizing: border-box; + background: #eceefe; + height: 60px; + border-radius: 100px; + &:hover { + border: 1px solid#686868; + } + &:focus { + border: 1px solid #444df2; + } +} +@mixin errorStyle { + color: #ed1e79; + position: absolute; + margin: 4px; + font-size: 14px; +} + +@mixin buttonGrey { + padding: 12px 25px; + color: #fff; + background-color: #cacad6; + outline: none; + border: none; + box-sizing: border-box; + transition: 0.2s; + border-radius: 25px; + font-size: 18px; + font-weight: 600; +} +@mixin aktivButtonBlue { + padding: 12px 25px; + color: #fff; + background-color: #444df2; + outline: none; + border: none; + box-sizing: border-box; + transition: 0.2s; + border-radius: 25px; + font-size: 18px; + font-weight: 600; + cursor: pointer; + &:hover { + background-color: #676eec; + } +} + +.mobileRegisterContainer { + display: none; + > div { + display: flex; + flex-direction: column; + gap: 20px; + text-align: center; + > span { + font-weight: 400; + font-size: 18px; + } + } +} +.mobileCreateAccountContainer { + display: flex; + justify-content: end; +} +.mobileCreateAccoun { + font-family: Figtree, sans-serif, Nunito; + color: #797ef3; + cursor: pointer; + padding: 4px 12px 4px 12px; + border-radius: 100px; + border: 1px solid #eceefe; + font-weight: 400; + font-size: 18px; + &:hover { + font-weight: 500; + background-color: #eceefe; + color: #444df2; + border: 1px solid #444df2; + } +} diff --git a/src/app/shared/components/login/start-header/start-header.component.html b/src/app/shared/components/login/start-header/start-header.component.html new file mode 100644 index 0000000..c962e31 --- /dev/null +++ b/src/app/shared/components/login/start-header/start-header.component.html @@ -0,0 +1,55 @@ +
+
+
+
+ +
+ DABubble +
+
+
+ +
+
+ {{ "start-header.new" | translate }} +
+ {{ + "start-header.create" | translate + }} +
+
+
+ +
diff --git a/src/app/shared/components/login/start-header/start-header.component.scss b/src/app/shared/components/login/start-header/start-header.component.scss new file mode 100644 index 0000000..9740725 --- /dev/null +++ b/src/app/shared/components/login/start-header/start-header.component.scss @@ -0,0 +1,308 @@ +@import "../../../../../styles.scss"; + +.headerContainer { + display: flex; + width: 97vw; + justify-content: space-between; + height: 228px; +} + +.header { + display: flex; + background-color: #eceefe; +} + +.registerContainer { + position: absolute; + top: 90px; + right: 71px; + + > div { + display: flex; + flex-direction: column; + gap: 20px; + > span { + font-weight: 400; + font-size: 18px; + } + } +} + +.createAccountContainer { + display: flex; + justify-content: end; +} + +.createAccoun { + text-align: end; + font-family: Figtree, sans-serif, Nunito; + color: #797ef3; + cursor: pointer; + padding-right: 8px; + padding: 0px; + padding: 4px 12px 4px 12px; + border-radius: 100px; + border: 1px solid #eceefe; + font-weight: 400; + font-size: 18px; + margin-right: -13px; + &:hover { + font-weight: 500; + background-color: #eceefe; + color: #444df2; + border: 1px solid #444df2; + } +} + +.switchLanguage { + position: absolute; + right: 26px; + top: 18px; +} +// animation start ------------------------------------------------------------> + +.background { + z-index: 2; + position: absolute; + top: 0; + left: 0; + background: linear-gradient(1.46deg, #313ae6 1.22%, #797ef3 98.76%); + width: 100%; + height: 100%; + transition: 1s; + overflow-x: hidden !important; + overflow-y: hidden !important; +} + +.background.d-none { + display: none; +} + +.opacity { + opacity: 0; +} + +.logo { + position: absolute; + top: 50%; + left: 60%; + transform: translate(-50%, -50%); + display: flex; + align-items: center; + animation: logoAnimation-slide 0.5s ease-in forwards 1s; + background-size: contain; + gap: 11px; + z-index: 999; +} + +@keyframes logoAnimation-slide { + 0% { + top: 50%; + left: 60%; + transform: translate(-50%, -50%); + } + 100% { + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + } +} + +//animation to end Position ------------------------------------------------------------> + +.logoEndPosition { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + animation: animationToEndPosiotion 0.5s ease-in forwards 1s; + background-size: contain; + z-index: 999; +} + +.imgEndPosiotion { + animation: imgSize 0.5s ease-in forwards 1s; +} + +@keyframes imgSize { + 0% { + width: 187px; + height: 184px; + } + 90% { + width: 167px; + height: 154px; + } + 100% { + width: 70px; + height: 70px; + } +} + +@keyframes animationToEndPosiotion { + 0% { + top: 50%; + left: 50%; + width: 240px; + transform: translate(-50%, -50%); + } + 100% { + top: 125px; + left: 195px; + width: 240px; + gap: 11px; + height: 70px; + } +} + +.logo-text { + top: 50%; + left: 50%; + overflow: hidden; + white-space: nowrap; + transition: clip-path 0.5s ease-in-out; + animation: textAnimation 0.5s ease-in forwards 1.1s; + z-index: 900; + clip-path: inset(0 100% 0 0); +} + +@keyframes textAnimation { + 0% { + clip-path: inset(0 100% 0 0); + } + 100% { + clip-path: inset(0 0 0 0); + } +} + +@keyframes spanFontSizeChange { + 0% { + font-size: 64px; + } + 50% { + font-size: 50px; + } + 100% { + font-size: 32px; + color: black; + } +} + +.logo-text-span { + animation: spanFontSizeChange 0.7s ease-in forwards 3.25s; + font-size: 64px; + font-weight: 800; + color: white; +} + +// Final Class Contains ------------------------------------------------------------> + +.final-span-position { + font-size: 32px; + color: black; + font-weight: 800; + animation: none; +} + +.final-img-position { + width: 70px; + height: 70px; +} + +.final-div-position { + position: absolute; + top: 125px; + transform: translate(-50%, -50%); + display: flex; + align-items: center; + background-size: contain; + z-index: 999; + gap: 11px; + left: 193.5px; +} + +@media (max-width: 570px) { + .headerContainer { + height: 95px; + } + .final-div-position { + left: 50%; + top: 50px; + } + .registerContainer { + display: none; + > div { + align-items: center; + } + } + .createAccoun { + margin-right: 0; + } + .logoEndPosition { + animation: none; + animation: animationToEndPosiotionMobile 0.5s ease-in forwards 1s; + } + + @keyframes animationToEndPosiotionMobile { + 0% { + top: 50%; + left: 50%; + width: 70px; + } + 100% { + top: 50px; + left: 50%; + width: 237.55px; + gap: 11px; + } + } + .mobileImg { + height: 90px; + } + .logo-text-span { + font-size: 34px; + font-weight: 800; + color: white; + animation: none; + animation: spanFontSizeChangeMobile 0.7s ease-in forwards 3.25s; + } + @keyframes spanFontSizeChangeMobile { + 0% { + font-size: 34px; + } + 50% { + font-size: 32px; + } + 100% { + font-size: 32px; + color: black; + } + } + + .imgEndPosiotion { + animation: none; + animation: imgSizeMobile 0.5s ease-in forwards 1s; + } + + @keyframes imgSizeMobile { + 0% { + width: 90px; + height: 90px; + } + 90% { + width: 70px; + height: 70px; + } + 100% { + width: 70px; + height: 70px; + } + } +} + +@media screen and (max-width: 570px) { + .switchLanguage { + right: 10px; + top: 8px; + } +} diff --git a/src/app/shared/components/login/start-header/start-header.component.spec.ts b/src/app/shared/components/login/start-header/start-header.component.spec.ts new file mode 100644 index 0000000..e2eab10 --- /dev/null +++ b/src/app/shared/components/login/start-header/start-header.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { StartHeaderComponent } from './start-header.component'; + +describe('StartHeaderComponent', () => { + let component: StartHeaderComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [StartHeaderComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(StartHeaderComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/shared/components/login/start-header/start-header.component.ts b/src/app/shared/components/login/start-header/start-header.component.ts new file mode 100644 index 0000000..d234175 --- /dev/null +++ b/src/app/shared/components/login/start-header/start-header.component.ts @@ -0,0 +1,88 @@ +import { Component, HostListener, Input } from '@angular/core'; +import { CommonModule, NgStyle } from '@angular/common'; +import { RouterLink } from '@angular/router'; +import { loginService } from '../../../../service/login.service'; +import { TranslateModule } from '@ngx-translate/core'; +import { LanguageService } from '../../../../service/language.service'; +import { SmallBtnComponent } from '../../small-btn/small-btn.component'; +import { SharedService } from '../../../../service/shared.service'; + +@Component({ + selector: 'app-start-header', + standalone: true, + imports: [ + CommonModule, + RouterLink, + NgStyle, + TranslateModule, + SmallBtnComponent, + ], + templateUrl: './start-header.component.html', + styleUrl: './start-header.component.scss', +}) +export class StartHeaderComponent { + @Input() introCompleteStatus: boolean = false; + @Input() display: string = ''; + animationStart: boolean = false; + animationLogo: boolean = false; + d_none: boolean = false; + animationBackground: boolean = false; + animationToEndPosiotion: boolean = false; + animationsBlock: boolean = false; + viewWidth: number = 0; + + constructor( + public loginService: loginService, + public LanguageService: LanguageService + ) {} + + /** + * Initializes the component and decides whether to start animations based on the login service state. + */ + ngOnInit(): void { + if (!this.loginService.getAnimationState()) { + this.triggerAnimations(); + } else { + this.d_none = true; + } + } + + /** + * Triggers a sequence of animations with nested timeouts to manage their execution order and timing. + */ + triggerAnimations(): void { + setTimeout(() => { + this.animationStart = true; + setTimeout(() => { + this.animationLogo = true; + setTimeout(() => { + setTimeout(() => { + this.animationBackground = true; + }, 1000); + this.animationToEndPosiotion = true; + this.loginService.setAnimationState(true); + setTimeout(() => { + this.d_none = true; + this.loginService.setFinalClass(true); + this.animationsBlock = true; + }, 2000); + }, 2000); + }, 300); + }, 1000); + } + + /** + * Listens for window resize events. + */ + @HostListener('window:resize') + onResize() { + this.updateViewWidth(); + } + + /** + * Updates the view width based on the current window width. + */ + private updateViewWidth() { + this.viewWidth = window.innerWidth; + } +} diff --git a/src/app/shared/components/overlay/overlay.component.html b/src/app/shared/components/overlay/overlay.component.html new file mode 100644 index 0000000..3e204e9 --- /dev/null +++ b/src/app/shared/components/overlay/overlay.component.html @@ -0,0 +1,17 @@ +
+
+ @if (['png', 'jpg', 'jpeg', 'gif'].includes(getFileType(overlayData))) { + Overlay Image + } @if (['mp4'].includes(getFileType(overlayData))) { + + } + + +
+
diff --git a/src/app/shared/components/overlay/overlay.component.scss b/src/app/shared/components/overlay/overlay.component.scss new file mode 100644 index 0000000..a5d07a1 --- /dev/null +++ b/src/app/shared/components/overlay/overlay.component.scss @@ -0,0 +1,37 @@ +/* overlay.component.css */ +.overlay { + position: fixed; + top: 0; + left: 0; + width: 100vw; + height: 100vh; + backdrop-filter: blur(5px); + display: flex; + justify-content: center; + align-items: center; + z-index: 999; +} + +.overlayContent { + display: flex; + align-items: center; + justify-content: center; + width: 75%; + height: auto; + img { + width: 100%; + height: auto; + border-radius: 12px; + } + video { + width: 100%; + height: auto; + } +} + +app-small-btn { + position: absolute; + top: 24px; + right: 24px; + z-index: 5; +} diff --git a/src/app/shared/components/overlay/overlay.component.spec.ts b/src/app/shared/components/overlay/overlay.component.spec.ts new file mode 100644 index 0000000..796c7ff --- /dev/null +++ b/src/app/shared/components/overlay/overlay.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { OverlayComponent } from './overlay.component'; + +describe('OverlayComponent', () => { + let component: OverlayComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [OverlayComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(OverlayComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/shared/components/overlay/overlay.component.ts b/src/app/shared/components/overlay/overlay.component.ts new file mode 100644 index 0000000..3fe19d9 --- /dev/null +++ b/src/app/shared/components/overlay/overlay.component.ts @@ -0,0 +1,67 @@ +import { + Component, + HostListener, + OnInit +} from '@angular/core'; +import { OverlayService } from '../../../service/overlay.service'; +import { CommonModule } from '@angular/common'; +import { SmallBtnComponent } from '../small-btn/small-btn.component'; + +@Component({ + selector: 'app-overlay', + standalone: true, + imports: [CommonModule, SmallBtnComponent], + templateUrl: './overlay.component.html', + styleUrl: './overlay.component.scss', +}) +export class OverlayComponent implements OnInit { + overlayData: any; + + constructor(private overlayService: OverlayService) {} + + + /** + * Initializes the component and subscribes to overlay data changes. + */ + ngOnInit(): void { + this.overlayService.overlayData$.subscribe((data) => { + this.overlayData = data; + }); + } + + + /** + * Extracts the file type from the file name. + * @param file The file name. + * @returns The file type. + */ + getFileType(file: string): string { + const extension = file.split('.').pop()?.toLowerCase(); + const getTag = extension!.split('?')[0]; + return getTag || ''; + } + + + /** + * Closes the overlay. + */ + onCloseOverlay() { + this.overlayData = ''; + } + + + /** + * Checks if the contact edit overlay is open and closes it if the click is outside the overlay content. + * @param event The mouse event. + */ + @HostListener('document:click', ['$event']) + checkOpenContactEdit(event: MouseEvent) { + const targetElement = event.target as HTMLElement; + if ( + !targetElement.closest('.overlayContent') && + !targetElement.closest('.attachments') + ) { + this.onCloseOverlay(); + } + } +} diff --git a/src/app/shared/components/privacy-policy/privacy-policy.component.html b/src/app/shared/components/privacy-policy/privacy-policy.component.html new file mode 100644 index 0000000..4d05c98 --- /dev/null +++ b/src/app/shared/components/privacy-policy/privacy-policy.component.html @@ -0,0 +1,229 @@ +
+ +
+
+

{{ "privacy-policy.headline" | translate }}

+ + +
+

+ {{ "privacy-policy.preambleHeadline" | translate }} +

+

+ {{ "privacy-policy.preambleDescription" | translate }} +

+ +

{{ "privacy-policy.ContentHeadline" | translate }}

+ +

{{ "privacy-policy.Content1" | translate }}

+ +
+
+

Andre Kempf

+

Großschneidersweg 2a

+

76149 Karlsruhe

+
+
+

Björn ten Eicken

+

Baisieperstraße 31

+

42859 Remscheid

+
+
+

Aleksander Demyanovych

+

Heidweilerstr. 23

+

54313 Zemmer

+
+
+
+

+ {{ "imprint.tel" | translate }}: + 0172-4180328 +

+

+ {{ "imprint.mail" | translate }}: + mail@andre-kempf.com +

+ +

{{ "privacy-policy.Content2" | translate }}

+

+ {{ "privacy-policy.Content2Description" | translate }} +

+

{{ "privacy-policy.Content2Section0" | translate }}

+
    +
  • {{ "privacy-policy.Content2Section0List" | translate }}
  • +
+

{{ "privacy-policy.Content2Section1" | translate }}

+
    +
  • {{ "privacy-policy.Content2Section1List" | translate }}
  • +
+

{{ "privacy-policy.Content2Section2" | translate }}

+
    +
  • {{ "privacy-policy.Content2Section2List" | translate }}
  • +
+

{{ "privacy-policy.Content3" | translate }}

+

+ {{ "privacy-policy.Content3Header0" | translate }}
+ {{ "privacy-policy.Content3Description0" | translate }} +

+
    +
  • + {{ "privacy-policy.Content3Header1" | translate }}
    + {{ "privacy-policy.Content3Description1" | translate }} +
  • +
+

+ {{ "privacy-policy.Content3Header2" | translate }}
+ {{ "privacy-policy.Content3Description2" | translate }} +

+ +

{{ "privacy-policy.Content4" | translate }}

+

+ {{ "privacy-policy.Content4Description0" | translate }} +

+

+ {{ "privacy-policy.Content4Description1" | translate }} +

+

+ {{ "privacy-policy.Content4Description2" | translate }} +

+ +

{{ "privacy-policy.Content5" | translate }}

+

+ {{ "privacy-policy.Content5Description" | translate }} +

+ +

{{ "privacy-policy.Content6" | translate }}

+

+ {{ "privacy-policy.Content6Description0" | translate }} +

+ {{ "privacy-policy.Content6Description1" | translate }} +
    +
  • + {{ "privacy-policy.Content6Section0" | translate }}
    + {{ "privacy-policy.Content6Section0List" | translate }} +
  • +
  • + {{ "privacy-policy.Content6Section1" | translate }} +
    + {{ "privacy-policy.Content6Section1List" | translate }} +
  • +
  • + {{ "privacy-policy.Content6Section2" | translate }}
    + {{ "privacy-policy.Content6Section2List" | translate }} +
  • +
  • + {{ "privacy-policy.Content6Section3" | translate }}
    + {{ "privacy-policy.Content6Section3List" | translate }} +
  • +
  • + {{ "privacy-policy.Content6Section4" | translate }}
    + {{ "privacy-policy.Content6Section4List" | translate }} +
  • +
  • + {{ "privacy-policy.Content6Section5" | translate }}
    + {{ "privacy-policy.Content6Section5List" | translate }} +
  • +
+ +

{{ "privacy-policy.Content7" | translate }}

+

+ {{ "privacy-policy.Content7Description0" | translate }} +

+

+ {{ "privacy-policy.Content7Description1" | translate }} +

+ +

{{ "privacy-policy.Content8" | translate }}

+

+ {{ "privacy-policy.Content8Description0" | translate }} +

+
    +
  • + {{ "privacy-policy.Content8Section0" | translate }}
    + {{ "privacy-policy.Content8Section0List" | translate }} +
  • +
  • + {{ "privacy-policy.Content8Section1" | translate }}
    + {{ "privacy-policy.Content8Section1List" | translate }} +
  • +
  • + {{ "privacy-policy.Content8Section2" | translate }}
    + {{ "privacy-policy.Content8Section2List" | translate }} +
  • +
+
+

+ {{ "privacy-policy.sourceText" | translate }} +

+
+
+
diff --git a/src/app/shared/components/privacy-policy/privacy-policy.component.scss b/src/app/shared/components/privacy-policy/privacy-policy.component.scss new file mode 100644 index 0000000..53a856b --- /dev/null +++ b/src/app/shared/components/privacy-policy/privacy-policy.component.scss @@ -0,0 +1,139 @@ +section { + word-wrap: break-word; + padding-left: 16px; + padding-right: 16px; + background-color: #eceefe; +} +.container { + background-color: #ffff; + border-radius: 24px; + padding: 80px; + margin-left: 75px; + margin-right: 75px; +} +.headerContainer { + display: flex; + width: 99vw !important; +} +.header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 32px; + img { + width: 32px; + height: 32px; + cursor: pointer; + margin-left: 48px; + &:hover { + width: 36px; + height: 36px; + background-color: var(--light-gray); + border-radius: 18px; + } + } +} + +h1 { + font-size: 61px; + font-weight: 700; + color: #444df2; + width: 100%; +} + +h2 { + font-size: 32px; + font-weight: 700; + padding: 24px 0 12px 0; + color: #444df2; +} + +h3 { + font-size: 20px; + font-weight: 700; + padding: 24px 0; + color: #444df2; +} + +p { + font-size: 16px; + font-weight: 400; + padding-bottom: 10px; +} + +ul { + padding: 12px; + li { + padding: 5px; + } +} + +a { + color: var(--light-blue); + text-decoration: none; + &:hover { + text-decoration: underline; + } +} +.team { + display: flex; + justify-content: start; + gap: 98px; +} +.placholder { + height: 24px; +} + +/*------------- RESPONSIVE -------------*/ +@media screen and (max-width: 1046px) { + h1 { + font-size: 44px; + } + .team { + gap: 48px; + } +} +@media screen and (max-width: 800px) { + .container { + padding: 24px; + margin-left: 0px; + margin-right: 16px; + } +} +@media screen and (max-width: 936px) { + .container { + padding: 24px; + margin-left: 0px; + margin-right: 16px; + } +} +@media screen and (max-width: 910px) { + section { + padding-right: 0; + } +} +@media screen and (max-width: 675px) { + .team { + gap: 12px; + flex-direction: column; + } +} +@media screen and (max-width: 600px) { + .header { + align-items: end; + > h1 { + font-size: 40px; + width: 88%; + } + } +} +@media screen and (max-width: 400px) { + .header { + > h1 { + font-size: 35px; + } + } + h2 { + font-size: 31px; + } +} diff --git a/src/app/shared/components/privacy-policy/privacy-policy.component.spec.ts b/src/app/shared/components/privacy-policy/privacy-policy.component.spec.ts new file mode 100644 index 0000000..51a0589 --- /dev/null +++ b/src/app/shared/components/privacy-policy/privacy-policy.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { PrivacyPolicyComponent } from './privacy-policy.component'; + +describe('PrivacyPolicyComponent', () => { + let component: PrivacyPolicyComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [PrivacyPolicyComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(PrivacyPolicyComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/shared/components/privacy-policy/privacy-policy.component.ts b/src/app/shared/components/privacy-policy/privacy-policy.component.ts new file mode 100644 index 0000000..90c3c53 --- /dev/null +++ b/src/app/shared/components/privacy-policy/privacy-policy.component.ts @@ -0,0 +1,25 @@ +import { Component } from '@angular/core'; +import { Location } from '@angular/common'; +import { TranslateModule } from '@ngx-translate/core'; +import { HeaderComponent } from "../login/header/header.component"; +import { SmallBtnComponent } from "../small-btn/small-btn.component"; +import { RouterLink } from '@angular/router'; + +@Component({ + selector: 'app-privacy-policy', + standalone: true, + templateUrl: './privacy-policy.component.html', + styleUrl: './privacy-policy.component.scss', + imports: [TranslateModule, HeaderComponent, SmallBtnComponent, RouterLink] +}) +export class PrivacyPolicyComponent { + constructor(private location: Location) {} + + + /** + * Navigates back to the previous location in the browser history. + */ + backClicked() { + this.location.back(); + } +} diff --git a/src/app/shared/components/small-btn/small-btn.component.html b/src/app/shared/components/small-btn/small-btn.component.html new file mode 100644 index 0000000..9d59f6c --- /dev/null +++ b/src/app/shared/components/small-btn/small-btn.component.html @@ -0,0 +1,19 @@ +
+ +
diff --git a/src/app/shared/components/small-btn/small-btn.component.scss b/src/app/shared/components/small-btn/small-btn.component.scss new file mode 100644 index 0000000..0d3d6e9 --- /dev/null +++ b/src/app/shared/components/small-btn/small-btn.component.scss @@ -0,0 +1,17 @@ +.smallBtn { + display: flex; + justify-content: center; + align-items: center; + border-radius: 100%; + width: 0; + height: 0; + cursor: pointer; + transition: 0.125s ease-in-out; + &:hover { + background-color: var(--btnBgHoverColor); + img { + scale: 1.1; + filter: var(--filter); + } + } +} diff --git a/src/app/shared/components/small-btn/small-btn.component.spec.ts b/src/app/shared/components/small-btn/small-btn.component.spec.ts new file mode 100644 index 0000000..4409f6e --- /dev/null +++ b/src/app/shared/components/small-btn/small-btn.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SmallBtnComponent } from './small-btn.component'; + +describe('SmallBtnComponent', () => { + let component: SmallBtnComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [SmallBtnComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(SmallBtnComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/shared/components/small-btn/small-btn.component.ts b/src/app/shared/components/small-btn/small-btn.component.ts new file mode 100644 index 0000000..51e14ba --- /dev/null +++ b/src/app/shared/components/small-btn/small-btn.component.ts @@ -0,0 +1,19 @@ +import { CommonModule } from '@angular/common'; +import { Component, Input } from '@angular/core'; + +@Component({ + selector: 'app-small-btn', + standalone: true, + imports: [CommonModule], + templateUrl: './small-btn.component.html', + styleUrl: './small-btn.component.scss', +}) +export class SmallBtnComponent { + @Input() imgSrc: string = ''; + @Input() imgSize: string = '14px'; + @Input() imgFilter: string = + 'brightness(0) saturate(100%) invert(33%) sepia(23%) saturate(5211%) hue-rotate(224deg) brightness(96%) contrast(97%)'; + @Input() btnSize: string = '28px'; + @Input() btnBgColor: string = ''; + @Input() btnBgHoverColor: string = '#edeefe'; +} diff --git a/src/app/shared/components/user/user.component.html b/src/app/shared/components/user/user.component.html new file mode 100644 index 0000000..cf90ddb --- /dev/null +++ b/src/app/shared/components/user/user.component.html @@ -0,0 +1,28 @@ +
+
+
+

Profile

+ +
+ + + +
+

Max Müller

+
+ +

Aktiv

+
+ +
+ +
+

{{ 'user.email' | translate }}

+ maxMüller@ffe.de +
+
+
+ + +
+
\ No newline at end of file diff --git a/src/app/shared/components/user/user.component.scss b/src/app/shared/components/user/user.component.scss new file mode 100644 index 0000000..8b97e69 --- /dev/null +++ b/src/app/shared/components/user/user.component.scss @@ -0,0 +1,88 @@ +@import '../../../../styles.scss'; + +.mainBox{ + position: absolute; + top: 0; + left: 0; + width: 100vw; + height: 100vh; + background-color: rgba(0, 0, 0, 0.3); + @include displayFlex(); + z-index: 5; + .whiteBox{ + width: 400px; + height: auto; + background-color: whitesmoke; + border-radius: 15px; + @include displayFlex(); + flex-direction: column; + padding-top: 32px; + .boxHeader{ + width: 360px; + @include displayFlex($j: space-between); + >p{ + font-size: 20px; + font-weight: 600; + margin: 0; + } + >img{ + cursor: pointer; + } + + } + .profileImg{ + width: 200px; + object-fit: cover; + border-radius: 50%; + margin: 56px; + } + >button{ + @include displayFlex($g: 12px); + background-color: #444df2; + border: none; + border-radius: 25px; + padding: 12px; + padding-left: 22px; + padding-right: 22px; + font-size: larger; + font-weight: 500; + color: white; + margin: 32px; + cursor: pointer; + } + } +} + +.detailsBox{ + width: 360px; + h1{ + font-size: 32px; + font-weight: 700; + margin-bottom: 20px; + } + .statusBox{ + @include displayFlex($j:flex-start, $g: 12px); + margin-bottom: 40px; + >p{ + margin: 0; + font-size: medium; + font-weight: 500; + } + } + +} + +.fontColorGreen{ + color: #92C83E; +} + +.emailBox{ + @include displayFlex($j: flex-start, $a: flex-start, $g: 20px); + .emailH2{ + >a{ + color: #4EA1FF; + font-size: 16px; + text-decoration: none; + } + } +} \ No newline at end of file diff --git a/src/app/shared/components/user/user.component.spec.ts b/src/app/shared/components/user/user.component.spec.ts new file mode 100644 index 0000000..04025f1 --- /dev/null +++ b/src/app/shared/components/user/user.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { UserComponent } from './user.component'; + +describe('UserComponent', () => { + let component: UserComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [UserComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(UserComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/shared/components/user/user.component.ts b/src/app/shared/components/user/user.component.ts new file mode 100644 index 0000000..edc8b2a --- /dev/null +++ b/src/app/shared/components/user/user.component.ts @@ -0,0 +1,22 @@ +import { CommonModule } from '@angular/common'; +import { Component } from '@angular/core'; +import { TranslateModule } from '@ngx-translate/core'; + +@Component({ + selector: 'app-user', + standalone: true, + imports: [CommonModule, TranslateModule], + templateUrl: './user.component.html', + styleUrl: './user.component.scss' +}) +export class UserComponent { + isOnline = true; + openProfil = false; + + /** + * Toggles the display of the side menu for user profile. + */ + showSideMenu() { + this.openProfil = !this.openProfil; + } +} diff --git a/src/assets/.gitkeep b/src/assets/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/fonts/figtree-v5-latin-500.woff2 b/src/assets/fonts/figtree-v5-latin-500.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..43944b1394fccfbb62f58bd9f3695302bdda7f9f GIT binary patch literal 11580 zcmV-CEyL1xPew8T0RR9104+QK5C8xG0AYXt04&)60RR9100000000000000000000 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 literal 0 HcmV?d00001 diff --git a/src/assets/fonts/figtree-v5-latin-600.woff2 b/src/assets/fonts/figtree-v5-latin-600.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..5ad11a8142377cefe843ecb04e29dd86596328b1 GIT binary patch literal 11644 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 literal 0 HcmV?d00001 diff --git a/src/assets/fonts/figtree-v5-latin-700.woff2 b/src/assets/fonts/figtree-v5-latin-700.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..6039759aaf8ef23fa22d6f3b903ebf100bd9e30f GIT binary patch literal 11600 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 literal 0 HcmV?d00001 diff --git a/src/assets/fonts/nunito-sans-v15-latin-200.woff2 b/src/assets/fonts/nunito-sans-v15-latin-200.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..d6e06b6e72516ec45658367837fb85a2f6363b3a GIT binary patch literal 13336 zcmV+zH0R5APew8T0RR9105li?5C8xG0D`Ch05h`y0RR9100000000000000000000 z0000QfkYd}WE_kV24Fu^R6$gM1^|UJ5eN!_gD~cO3xrMp0X7081Bn;}AO(kR2aGQa z2OA7=CG6Ns0UHMZ4*DBnB*IQiR@8{3oOA@)|9?(UV+;Y@!K+p+Bf^NNZYQf|%0!E@ zwYSZAw(X@w>#`-yS^j=pa(;t2r8Oa-6ul7b|- zRyC=1T~6)E?qA04hyj<}8KLk9jeU|!5>fm8zdd{D0|7V)ph`U%U}1=DqR=vEr1SH% zt^afH4C#P{ihwX?p<*FsgI&ANt{3IH8PAP!yNd5uSBbtq#J&5e2;x(&DEe@0USF%Qy(W#MZT9RUvQq@MB9+OA8lSt z5Sw6SB*DD_?*HBFXA-*m0gTu~n zGX6Y%QmIrTl}IHLi9`Ym{781*4FLH6-0%H$?lgs6pi`g}C)x@UX)4G3T&@c&Fr+x<7%M^F)~2s-0QPz*hT zQ>)xM6phQ-`Li6%4wt~;NFN9YOt^a{j!GaeFkHZ533(9|GVh!-9a;mV0(6vQ$}#4u z$-RosrE52p%an?`achX@ug3dlyN(}N020@}?VRYisels>BvZ-WpU(czegU}eA>pa(!;U<%L)#-KF>{A~nb zEKFd8gLuG?zNQ#LP*}i*3F$$wZaokZ@)JTr;R2=$ae=r|LIMQ9RH7lVG9lTjAT>H5 zUAiFMdSO~ah{^}BfFMMYi1pM8dT)RZTx1|ty~U+~;4P}J1i^>USPcRspc=0Mfe{zK z)mMYnk0=C^Pi+(g07H^fdWRgj(Y$DxR#_BgXFpCZ1UXC&NkE~{Z|y}n1Zu}&KzSxj z(Y8-}10$wEA)YkCb3y`|EBt+ZPKkPoJ^>5~2^e$O7OFH5XxyW^Vh|Q#LycbKa9yT% zHD-(n*97AOw>}G$MI8axt&S9K@d0I^BOq9S9%QkhI={ir7i{ZB?U{H={8D)*w0-Vv&wF^Adb_Kg2g)1yYXp?n+uQaw!oXn5>N_rK&K@_dKAxxdN8Po$ zbUhH3s;sPnvPvl-$SD5mg``Z8TMmt8wbhd*%peLgG350Q`yH11=xcy{1Bl_NNWBAJ zTk|~KZZzwqVgC~DH(MMi?Pg;vV|Idtk+q1tQ8R zfC&d@oF4QFT^FdbSFr$~`GN6Z#W5ABq8mjoZjS^2BGN`1N|k&>6Kx90b| z3eaUW;ZG!KOt5+Fyh5P&j67>5I z{S5xxmCb%F6 zcl3^jm=r!zH?a%k55FzDkieJS&?kS3Gq-IZChZJV|CK?s;Gh6f_oz*B4K@}76|BWX zMb{ebyCt1EjCt$gg{KTnTpPudgJr%WY`%e`-)y`qtvk3xQlhp)nW%da=~=3z!1BG)IZ574B}7&kuS~$8+#8 z8DAO0MGusZnm~|x#L%q`_7R)xWTcmFJXSO9w?=H!4rNFOQ*kH5u;QR%iXj3JeLw-T zr^?7L%n4Ivnxv%2~kDdCDwYf0@%H|KDMDN_kN^IO%M6i1##XM)g-Ku@{V0r}UD6=}7U2>cb4m(w%^qjyBkbuUG zX*8xag+aqwK9yXcbVwzRFKyeMb#hU>3@!|%arYy12%_u=-2pWrs0sEu2dnO(fj9xj zY!J&eLU?y$Rnl+*_?_UK(O*PA|IW9CK&^}o%?5)2tAsgH&gi>l)tjnECq>KbFa>l9 zM8X|dqgIw^9u;u3dQqLfdfB``SW6Yml5jod#YEUH4yr7ZP41oroG}$)l?Y!Y=IsSa z;#nKeSlTXrv7oA-OuUk^T1`a!;SdL#pCH((77Mg0%wFu^j-0#!)-G`!>Pzj}#i^Lf zHBO25?uP!v6DjN}<_W$Ec5KOmS{MM*Xc-L-uD@DOwl0X-BGXk=i{vv>stjGY6*+&b zPIyHo+FR=%O;vSF={xQ21S|1{D~hiURs)zdVi?q9^z})V4Jora{>t7ho6*Qbubw?{ zlrIFxvSA{Llxr<^bY%k?MVw!usNs6yqNsLM?pU1G`xS#TTkYXyEgicX!&d!i!1KkY ztsEml0wM@byyW`;R|O$t(b25QuV$rOv?@<4JKvHR+X}O$BY_D-sP5++9E3o5|Go=$ zE)vc{ixC}KS-b7F(S5=|SHiC1)fyf(n{aOLE-lsc#9Uv(?E4j*6-XETYsO^Mnis5C z&7u{uWEt0hTlxCQUKbv>0ku2hF0OMFm43RE*DxBgX542l*3A9xnf;QIMXwH^e9)xa z>q2)4w8;4x%>jT|PF9MhoVaGel;GOyfvG(drD2?3YYScDZo9%jD~hKqLpWXA^d@Xk zrPQuqit}z%W=;u+;`}OB8$&n&8Kr0~{ObU{Vv1GK@6GCHorgfk|gurY)@goOkd<_Mi2B!v+c{*WFvfX)GKbPNLkeGC%a6?E01D>!T8 z0rUb%BLQ1>968Z#rdt71ScA+VCm?1D+caQ-Bizzvq+Xifqy$S2oDpePHo3&OPa)i5 z4xP~x>@brBV?Zs;2efB`ygk`wQAF@N3Q`(ZL--GTWzz; zF~^;B+F9pdSxRJs`;Zb!0RYtWbJ%aoFP)1ZH5ibC^B$fEU6{ zXpu&^>pa3MMDcS_%}tRUe9R;tOQ52V3o+2`u_Mc@6*y;L(w)lzAk{+{ek2V76hdvX z0(wXEWjP8{4=h(VOhbtzK_H`=-&NaSgNqOWITaimec|!R<^UWdx&i59%(VpKU&@$f zR^R9C_wOXYJv1%gr}|w#z_5Qy9LobggY5ot03sz)=tgo$?od}`*=z-p6AQv(gVd$6 z?k&BbB$AeZv3}4;eog&%g&HA<4GKYkj~x=Q;Shjn z!vJgq)zDpoVVnS0P7Qrg|I2nn2wG#ojoldb8-6&5i*z2#`*sa9RG^W@nkdwC)J~Wo zid+;3TrY<-z&NPGmE;iY;kx*!9S$8nm_bks5eN{%&uHyM<10NWvfI0@ zKo~g|vUuAYVt~?C24G`&?m2=a7VM|J6PyJ$V*fYXf3a{FjMyW-{XYWgTa0`G^bkP4 z>j+>N0)ntHfL<8DB6$CMTqxoLT>WWiMMI*vMoc~c+iA*4=$k`C# zB9L%|00IO7(uC7MU^u!^0tAAi4+R8}uIM{}0@Q$B2ngtfECYZQf-qp9GgrR4jiZ9x z)wI8p-R=GmK@uFo@`Xb`($BPrmeLlq4edeu(P2a*vEJOm!ob34{D0_-=El#G@`Kdv zivUq0*oQvRLRxZ0a@zM(|4EC0oq!5eBLV*3KV}{?{hS5hzwfMY#_a)L{n_oJV-lZ8 zKbiLN-QRh54G_Q*;DD!qJnjGh0y6D0*<}BD z?*C9f`QW3SZbG1qV)?xp3o7!J7|X{!TmKjBk#`43!9xqQy#* zOid$8j$C>26`J4|m8#UJ)udUARvk`y?36Fo+u^B~o_XboJCShLuP*!QuzRuKfzMW1 z9Vy@4wmX)r^qVV|TV{n_m@pC>0}BVmkRE*o#Dq+V@R_q=$%-9o@7VGp=fRU7N7X_E z3KAw*sBlpd#fg_7Q>rxSViYJI!i4&AaPokGIE^*l>(8D^epJxPRW~DHwaA;SJzV5WpylI%~~<8|tb~ zL?^c!wOm7Wcfo3^ZNhDk;wo~u5?d%WWDUKfHQcbdOk?bV02o3 zA)Kz8I*u&8g^Z97dbzkY+;{s08P62-1TpM|E*Qt4p+$NGAFYCICozzhHM&+_#2s^D zmxW!Bw(W?=j*Z12KQWyAM*{h1Le%ExI+7K3se;o*xJ(|Sp}!K_{7@J-T#e!)bW@w# zzYGSJQ57ZMQk8>345T$@3eR6qrbii>wku>!iH|MD=3ax|s%Wq}WT@6zV_|IF@1@DK zo}ZSx|9Xn;;{XdOuE#_pH6r%CTjlSt`!I{ASJoNmNT}R@q8M}wpD>n}8EzzsnLcO! zW7$?$ROHhwSzXg|XCg$neDeoKww`spMJ1TfXU#nt{w9(d$d@363_^{*MO7hUF^?+=&WY9npx=_L!%1GbV>&i(%I~m4JuLlWY<^^ zzn|_7(0Z+{xoZu#%gA1~$0_zOFglMWy3EXR?#Wii!Q2=d4H!l3+ATgUq9ngOXeqwX z@I-B_F%ZbL&6u`ZacTnTi^N*WYE`JE^I=*xyP@cW*&b8BHC58@p_@v={mGfjM`(3} zx~#3>^pn1i)>z;3V_I-gEUdFsB_XOXyCOARvsP(ol@%LlB#T(&BamN-!nDqEUydYQxNy;W^pxgsx%UwzOWd z>bKz@&%Edj=I0}tdy47HvrzV0QPD?4;y&!t)-=|W%V<{&P4)MBIn!01jUpvXDR zkOFCnsghX{-tEQqUO)j-Qk~A4nD~#2Ka+oGoJ9kW4EzFoRU-S0isw4ac_Q(n3$2k! zpFSEnsHdGo__gAeyDN8iH^N~5Q@06S{SqWz#s!ijYXSD&K*qStis&rTrhGd-`USdf z(JYIEpMiX`(oYq9Rr;OQVfv6QicXh%;S6>BsY;@X+d?I_g(L+yDXv`aSrd0^WC8bR zVU{c*6-n$|PDVw0BejDIq8EpZ)4NWCn_UwN_8Z<&>u|Z1rl9OoabV(v!e5g7c$mf) z0FOl8e;$0=b?xUScTZ*on{U@J-3xECO<*7S$=3zNa*&6X%eVd2%Hxd%=lhk(27j4& z)Ahg6h&kKY^D|%jKmB2vxKkH|NfFb`$LaDeC>)J(tKGsqoz5ctw%e#!ex%ih(tFAD zNqwl?4we2yK`*<~(@oEM|up$lSX zDK^&2F)owhAE;Ff?Qn)3F~C5d-HAPG)3bqWArgPZn{YPYJveB9vXqPo6}3e~hVA+^ zCL=S^U=21wBQ`)^s%pYO_G}%% z8lsAKy?|?>NmUKgyQVd_D>2CYtLKs$2VS=8N~U41REoBVrJV6<%HgSNx$F3Ybb$&0h zEWWiuigo(lkI5R<%r#o7KaD!gk+3KR-8msM|7#2|X*^9Xt1%tha2-{+P{+MEjQXGv zKc$4qGK`wlRfG)PPloqAzHBO=1Jv!mFlzs2%b#BOj3Svl)|H>=k#U$qYmYyJ)6U_# z8=QV#nPAmr6zjZIJ;fzfH$)N8KFg3AMI6+wgeZ0=a>_~;_O2IN9ZKy~rnfa+6?GM< zX?A{lew}sUumrqXTpgyxSQOjB875wvY@O6h9P|10!XD>E-p$6Uci8pY@||aW+241c z2_5hn{?>!JXP*28xms>8E7o?EYd;I$tZvLCKKa2}qqy^)o$n=J`jAmgt#m81hWc_x9gzbKz)i zYH~6+dGrEEPv45HVRj*1_!HC&mvVH5{=_n5s{A>)1df$qrl=^-DR^1~IlCk~7+I^j=YznW8#L#8c0S5Te< zD=3yhu_u9T3I@5GJWcsXR_mb1n-~rRvCSUk-C5A!h`oMKTU-6^VS6Y*;;pSxf5ZVM z18ez_D1T!(+)#bkT3$eB@02>up`kr=I_jqIt|RB>V{Zvr<$z9rI@7LOkK$;7%LOHGu(qN|H=L>7_Spm!8ysjX!huSKB__6oryrM`v5^k)M#(m=>(wM1R< zgSMkmJBzCq*;0;J&p=!I>)6dCZTE=WXKv#ueJUQqcJiMh*W!4STPq1Cd0@#zA!0-d zCqO%8)3!a^?#3>TEgu~i92_0H=y3P8q8?BPo^-alwUT`+5A~q>mnV7eHqgJ_fV{Pu zD1KZK{&Jw~ivdto)R*_aBl#+Tx?V4*XdZ@%*-$yx0r~wm8;^?r^cFW!AuV>K28bEc z(rDFjFy7o#d>#=QG-{EV&+!r+cC}tB@Kjxt zw4WjRLZ;JgT5Kq*(zltdny`Z3W~*Ecx6RhEgC>F0o9u6*v?TkZJQpo3{=NVbt7EX* z{%mQz#NkE(PBEvg1^M0Bv_p1&VS&Z0Piu&Nms2{B(&#zfroNVzrarGHp;V@V5{fC? zARTmGHSNvTnRo%#1dRN+C8l-|g|2d6x{dvnPJJor;p?B_#8)+v$ z*{*t}Sd`!CnEDdHNJMhUrmbmt0$}u zJPDYOXxdo&#lMeVhGShp&t~q&%~q2kqmlMltkUjGoxx;R^l|=r>}oik2nmAUc@w=& zO^F^apy#dI3qsSFra+s~>eNmY_SH)<5m8N^a3P!+*Db36wyp+UgS2Y~dk&!!+ev;Z z3Jg4W16xLFX0g8z+^#GE@+T?F@)zlWxw9W@%>IFtd36=v;_tva{syDhCd5$GJRvL0 zp0>GE44Ek;`0SZc=aHCe)U(WWu1g6dQryJ@c?N?c7Ld zq(NdJjRRnp@(Zt-PlM-76BbWBc#ougV-HFWI9*YyitPB0cMW#*O-Y9GzbbWk>X6zr zpEOZz3;iJr3w+~e>5Fz5#KX2R8fg^ctY^h)>h~MO+}qqtDf4mOd@=hyiMZY%<*|;v z=cnq5{}OXAC)I)xO0BMF+#uF^m%()g0%yBE_x<`fgJFGBb4el^e!Vu%*BJN}`^6wg zMI~B+u0{q`|80NAeTzw%7oYM}>2)&Xypsw3qc|NQH9`{Py3fUfA28N^0BEl;tDn&l=iV%C>JZ1iQLkd@y`L>`r7osOf0`@#^LbCCqL^o?>Vq-l7AP6=SOq~njTt~ zqgK@-vt1{q)sr@fHN26n=ne zL^*ptq98c9m+9IjbR`b{o%2D?bahebMFBUj{B=&h+w@~VtNwq2x= zMzTV1;N~#1=`Z%L{Yd}K_AebS3%E=HJ%tybS~-_JL@k`UKr-$2HFkK_A>l9ZjT@1e zz3BD~q17i9M6*FB%Vw28Px1D7RJrc)hI6BlAlq8;hn=v;xI(#~tMb#v0(}eJ%El(K zN|#p1v!qVml2PhWshiL9%49;xFC}jlur+y~k$_I8R#F%19s!s6df=|x-|zfpfVl5KXlT+Q}urp2z!S{&(UIOR5*Q_gTG?bI(b z?FK+&Tg$)9(kd|SKblJ!kBik?HS0)4b6VL@ju+He!}*mFO@oG0ADhP~h3u5oDoIkn z&$?ht__UWtY)KMPnL_kaCPvxNq@3jWpC=il3o)rqSAbj=4 z>YrdL&M~@E89sKGMlkxU&pwVgf-X2>&N0dDbNs zg6sl;9fBO-rn#`b#+s0I))du-+?9_kX&2+|%vz9EyA*jw-K&M;2BAO?hRQx${`P0U zVm6sUDs%AD2P)oS?2xZ0U%>|EDd&pDsh9VLi3IoivzhTz6kS$87oKuX?!JfmeObZp z8sAHC@2N7VghWl;OGZz{7XMGont`^$F(c}$X4 z!0VGpMSi~6ONd1tpAhWtn-|#|agIRF%`1N1@?P$8&lyj6;tFfg^or4exa z##zJxe=&b$erR6?Ma-9`y!JrWFa5Y_gs4u%85aCN`9ZrKP4WEVrkkwC@G*G|mbhsIq%#Ni zztdAvk8eU%jtR^(dBqCi$1@*)Ybz|5m_fSg;1BPs>-l0Jmy91beoqy9r;?6CAX%O0 zF2!H}g#wWWs70Q6i{SHPsbk8XLG`J&bp46J;Yn3;@Ip@dY*j?CE?`!v73O302eVWn zhd&XpD~GbAR%w>+r4;93g3{`;#SoRn)73)*j!fjhfYY!c3mbw)lK=Ah_GCL=-wwlU>!B6NrLIQq3j(oI zbv=o5t?OECa+ZDwsITq$R{x4Xj^f;?$YkUjoi6!?OnQUD<&t)sTU?=5-sYWZ)aQ%s-W8g@qj;&vD0;xm-YU2(FHxm5m6*68ZntT9*JPJ(PZ_A z7A;Z9wQ;hOf9jKiH!UMg^=g$_L!z{;k1BWIip`IlW<+m2_};LDf@6OY!(d|B`WzI7 za_ir}iFKQWdYgrH6VkKf1do22SK0&ayNLegK~c|dC_0nKMIqhHN?w%DkMi&iKEI=t zjkVm4Ni>6D-sRgB=kDOIUO~WsI&+NTM_Md#8&nQI z{1|z>7j+Vp;h1mMGar|<&b)l5_Xx$f>u0U|L(D*N>ConD<+9hF2okPl?RAvcG1T>D)e>%qD491O^2*sK-(jCzBe97&X;XWo z-yyMzk(9~ANm(V3Qr8%bh*WAI61|!^rZ~|wib6gRcWdf3A4vmHvORNHF?6`M`5;@c z9oRX|5prfneZ^P_=a)dMo|Bh9r&_z#Hns`sc~10BvI|ePuLiIg{8y#2SDag($e`1FtBW31X%0B)Z3jS*62pgfwk|Lj= zyP&d3H>cqVR%x-9HeOKCGq+Fq+$Gk;EQWK9ui-x@W6>&%(g#@A&Svcd?dDVVp~H&I z;VquoYgq!7Ep;D>SW>)qS@Csr>g;F*_NmOY>6ylgV!*gi9q+99k5z7edp-J=Pz;wB z*OuisFZi}7#VN3t+})g4A#j#gp7|WiV@omK)f{#^-FeYdCun}@KU>c!N6x7>qHP`9 z_s{4#w|COIdt=)i{?vt{3tjU(q**4@n;Yh3YOgW)v(lU98LEEjT*Iq;ll9w=lFsXV zov4pj@tf*iM$rv|hW|^8Gop^XiXI(ahkcmj9n0^3Ww$ZH+-vCECTW%7nmUe04==t) z&RNZnpMyMRji|@}v$ss(ufcwi(tnC7?5BeZ3nm{0d;eVZ27Dqmir$%8mIrPQz-}14 zGy?J6&lvD$oZ~l>Q@hZAHZy(DaQ>ev6T;0y1#SCJ(YjjjZS3JOAfOc+|iN z-@Jk-Upb`gn{_Jra(Ns#b^fC&wJwNYHm|?sFre zqpIa_PFXaKTwrlDYUBSg?0i#TC6I{jng@UGdYX1S9A8*n$j&zr}J-W zO#xm#Jzow^8(_+b{5H7`f?Zap<_QNJ%4Z*~>D3>?MP9@uUc%M-ssUW%HQYFIL;uOC zwT3y&5svbwntP1x6AbKkJS_eF{H^O%IuA{49sXVGXD^`YwL2Ml4^ATh==vkTNKl^G z>Y&o{aA&pp^_9*hbVB;2GcZB9w<8pQ(k@brl+}`Wx}o(x*P1L%+;_E2?p;6|s9W<) z4z-?&1^(Kw_F(Uxn^DMyCO0u*ITP-=7TP$ffq%bN`qm_pxM>= zK9blPk~1Es&!U_p2Pr^<>N`W~1bV@fY#UZ}jF>x8*jgN8Y;q^ajY!{)G=|713d6); zaDg1@1F2SUks1O|hy**CLed_PFgbVLt+1O8#OsbF<=re2l$k_`qfLquZkvIa9yzj7 zMV$=P)Qn75%1?&dkTWEV#b&oUo`74P)Ji8bNOi5H@CRNi`~^+Wb4z`-bYkOnRO7NP zM`T;=6Jar1Cd3H{AfVR&PwT~Z^3<*JADbXv1AMxFQw0ED-6kLYZ*Uuq*?t0=FhIcJ zaB}6OQFjKp{yNSWza#H?Ebo?F=fGtF1zkw!k#U292hA*g6o61(tZSb#-h$QhT!EQ? zSNr>W33OszC|Ge6^*)lb^oh{G2LCRtpa4Nm;cy0?-Lvo*h;o^1vfM)0^-yfug0R7N z{OFiVajzi-X9+`4U}c`HKBVRpUaj>3vo3VGDXSJbD(8w#1q~;#J4cCPR!7S!zV9^X=yj0j_7&9gybrL0B z4YQ8a0<lysv8srNe3lkmIKLBk3mET;?2QQaYCA$(Hh^uK?Y0yo=P*{yKpYtV2pWezbO~{( z@4!$pH7AHE6%@9N3WX%Itc4=;^W}q3G0=w+VY&B|N0ujzSZ9}5n+WYZLh95-#@&`H zt}yX;$W&r4M!D2?rKGJH6oW1J03SSn0Sj~=UkLLC@HlPlnnehxrbDCiIDn7P0n;GE zUk#l#I@{A!+LaHK!Uw3)i#tOxXw@XburwphzS7uo*{8pm5)oLb$*VHL4V?As-5TnjC=f{3*?+M-XF z8L4$h%UM|Fn7{Eb83>FWda-A#Z9?dvI+hM0&)>!MHLm0R$as1;ill1BL zdmMBm-)nz3fE6eHG$+pRee&6EG;=aD6&{HoJdh4UFe)_94K$U?8 z8ElB5h8b>zkwzJ9jIqWUZ-R*?nXFokDNGS+vfCcGD+|+@NCB5A&Ue?%}bL6Fl{YKo~QVg5CRiJGMrY!0XcvGLgJCw9VRfut5Uwfau z)6cpyY{E^S8|a-JdunU?dWW$lh}ekim5kj_04z8? zkV#(IsUHFCzq6?5Gs4Age13uY39vFMV=g)*NG^6$K34%~IYNcE@_S1W&bjhk0z{+e ivrZ{O`yVRDZT^*5ev71dzw6Hzf*JXL@#N?Q0001|Mx9px literal 0 HcmV?d00001 diff --git a/src/assets/fonts/nunito-sans-v15-latin-200italic.woff2 b/src/assets/fonts/nunito-sans-v15-latin-200italic.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..83020a43fc28516823cb3ae56d53c2ab4848b908 GIT binary patch literal 13888 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 OUWy+BzD?c^nhgMPlk+?P literal 0 HcmV?d00001 diff --git a/src/assets/fonts/nunito-sans-v15-latin-300.woff2 b/src/assets/fonts/nunito-sans-v15-latin-300.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..ab4c92ba286245bf0ab519947a5506eca823f916 GIT binary patch literal 13724 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 Gidh5~c3a2* literal 0 HcmV?d00001 diff --git a/src/assets/fonts/nunito-sans-v15-latin-300italic.woff2 b/src/assets/fonts/nunito-sans-v15-latin-300italic.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..8f97fef30d8cb73485c9131c127a6be9c15e5c56 GIT binary patch literal 14492 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 literal 0 HcmV?d00001 diff --git a/src/assets/fonts/nunito-sans-v15-latin-500.woff2 b/src/assets/fonts/nunito-sans-v15-latin-500.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..8de7afb3def00bb8d14c75594172a0a038cba51f GIT binary patch literal 13932 zcmV-yHj~MBPew8T0RR9105)s@5C8xG0D`ap05%E$0RR9100000000000000000000 z0000QfkYd~G8~K&24Fu^R6$gM1^|UJ5eN!_g9zsr3xrMp0X7081Bn;}AO(j`2aGQa z2OCsz73@}Q&>e6@vHEqlBN4*J0Z4%v9g&jrboT$}HQfY7i@2}VA)Zdi?GrLy*XFGKP z9Z(41L1G25a0B$!zLp_WU=IB6nhI^v&7qtJF7u$A4$4QA9PA$~c?p0;H=pN4r;4bh z4W$776F~fbX>CJ>*Y!)7MTjqoxx@kqC;;&Hrkd?OeeDrY#11Y{=S0jME{2}LsZ=T* zQsvUs$A62(27Chq32Ct_FwYnuE`WeJ62J>sfb=XtDqM_}LkJ9#j=?$Qri#eWgp!&3qO;w;J}27V z^T1{H7LhQBhy)2Ch={v)+piAd>68I3f-=I=|6^P*oxl-b9v~Rl0nES%Oe(?Os&Hx} zLWqLY(8Njt^$>~-a*Tl`!i+K+;Zbbv-jhBsTErg-6pO@(!^BHMQWPS^dLq3IM@AZn zj8cYGZsPnhaD+3txV^m4y91{2SAaY0Q)({smk#aM1N!UQ4(J6v9_V!g!Eo1p@7D{i zho~8L*LNR)9(0(*t98iHM-w}HrQ0fEV?RtKLdpdr=~PsttJbzzf_5UmqmM4uid zMxvx5wN}Jq!VboF9(VRTCMu`WCP1=d2lWy50X+|b(YvC*cLWe}G`c}NHfoLvV@JeV z{8U&{qOt^%tDS}oJ+2v9nHzBZ{Dg@!8ehm)cIUi9V$!etw_{w3GC`h{0DPbsv|1aQ~InFLJUm|Kc2 zcjOV_0V`Y%C+8TeUf9&nK7;zY=b+y2PU+}c>O$rDbVu9Y&NjEU4cA*|&Bfu{S63icNXB$262;k`H@&j(<(I`o2Kw8-+fv{C2*{T}m^;M!2?I~w zCc?!AG8HHUO92QpHEpyJk8j&v!T?uq-#mdiyM`aX>MVI{u!?pAD9e?r`|ig;g@GZC zQ5?bU^X}o;%OFLk)*r)e)}*lgMQr{Fxwo68>3BlV15~s(;I1-2)!`90(>8z#>s0{d zV_{x~9C_qq&6|^;0Z>sR0C=d+Y&HN26Hdq^nIS1j6cMPTQ?1H~5!P5M@bYG~s8OTo zi}dO1mjGClCz}R<=s9*N7oo?^Nr(YJrCO53#s=$@Iu@wPjJmmQR2%k1mfY{OD`E{Ng2opHo1nJUc3I({?WE} zuXLy>Rf5Q1YI+GV(&jUg8B7zOUIyqbA|I=4O(BqF#kI02x&Y9jj=87?RwaPEkB%vmYR@oY}(!iNC`g;Is4OL;n9{6L9i#gWI*e{+-%GAhL^K6Y1&(QG^iP+l$&N zOz@G2q>~wn0b7sDvq1DD^6aMNB2p#*X8(9`%es00HH2hW5S*Z6de2$CDfusYWEgaMj;xLc!J} zlAC}NF`cB+erzed3MVG=;-`}lttWdxUK_#RdjogqTZC*ql%L3l$k-Hkx{dRof;*_s z#<{;j%%ev0h5H=XKmm;gKGMboR~#xp4@<7mFDxH26pJrW^LyXnJ<|d{0V-^aXg=x(gH;4XFWQ&rk`tT&v{kT?wOb_ch`v^<> z5fKq>Lpoq<*a_B(5Z_hucxoMTr$!RgvMjqU)nx@Q_Afv1aU9yEL#`<3F1 zE#T0HqP#uAM)!C34vU+CVYt`hzIs5uCo~HuxC}_uQ+>}i8b%2$+fGxZGVb!ggk^ME z32=z)eI(YjQDLieLTK?Ja}KN$${mg?P%87__uvs#G8n5I_gY%)WA5=>8T%xzrBapy z>FUIyo3%rBP@a|9Bj)aOq8KSgh`me4T(>ip-S3v=-{dXHk+6#JbAUTIA=CQdPFe{u zjB*9+15?)Ik4vNyg2$Wc9KIvh&Lnr&O54H#p5Y_~S?P$ZR4KIVF21!KQEen0#$ShP*>zLDV&PjVqzm- zsW3%GK)BysxH!&*TmgUvz3Q%tlWG>e+oBlR8;eb?55BZU4ILR%X_xKE>U1&m)Fb6x zw)CWTaD3|30(-q6zTRsaptPN&yN7`*j9{OikiAw|Fl-}z{*k3zTUrWMsy}S0(sNfn zv{48i6T^Bvupc#xi*O>Wm3d##Dym;D2gr{_Kc-o4u)8j$ICGB_2IXO8N6f`G z^2?O$HyZ5+()wM%t_q)s+%_>Z;NGNh#cM7aBW&J;bf(hP82#X;rDLO0NkxT9&ngl} zkiyB~Djes9TTau8+E&$dzVSgXjNe5TAjm7AFJ|wc*@iLWyo(uaI17nY^+Uw)_Tqi?%TI;w}_dt%}3i07NxA zrxW+wb0l65hvutiotyxQ73c2AeW=#oD^8Fldy7)pE&Ni>X0ZmS*32eK2X?v+*+y{J zQ=9A35*)cJq*>$h53z?Jtw%I~57L_mhLZ(+a8PPgG!@P7k$jG#f5P)C|X+u*50nEOWsnYh3ZjdKF&T=dZtxA><$7N@BQn zShc9$7Im6P;`S;qmja-k{z*5Q$>?B`m zsUbsK7LeiC9x33+N<%;qz#MSZ4(ch*klox=I6aLp)?i?|KbnQ#5(4uHJntOnXlkQS z+zo)0;5yb`kYEuag?;S)U~d6ZXYDzGfmY7o(r&qNC)9T_@x#NnUJrqqw@EUVT~mPm zew}i^MFPAL^Bp+nq;@W558G=qur{^XV$){=k!{!6%;?>Z*<40}P9c1|e4nE^yAh;axQG9!h=x@4~xZS}foca4I+* zoB_@RXW7+)^T7Gw8gK)+1+d71e8`W2s0vl18dQtID1zEi5-szPL-O8&{XpVJ5|2wf z#XikG!#>N#TF6I!3Q`qSQw`Npm?G3pNm{1p5bRqdA8>!feVqFgm(yI%a5>8*&q6@a z$)=M-$4DoSPClIiI)!vf=#aPLo$})y z4ZZFa1cxV3QO6xwbfoM^(UH6(nJB`GSeja6xHM&M&81&^48Xxl8+!J^R(R~oFH83B ziG}}D=MtEHU0dh2n0Q^PeGimvWEdGhdXX-q-P|QN4D8ttc_6Gdq9PVVO_W4IG(--D z;-(%wYXF@w`eumZtrv!1I*11BT6lujy54B!k>1UvpMi~bGn_H0kh=6!;TnPUT8idW zb2KTTAqERE>EeZp$G{ww>JtsJ1`fX5DzUZ<(yNzYpKyaXgHWBXfX$L@_oY-sqcNpM zVRBM}nF!MH-6UGhof5|aE7QQav>40Hun=&t6Ln;fw8(0Rdrd)G?C;{%$FHELJPk!) z4>itoz_5LV9r*xFnjGH!#DO@#98yY3duQYG#)jkha%RYucq5IXho&-!C3a15mJP$( ztdpiBpxzuT-d>3@(0u}tF8)lV?wtDXh-{oh?o>E>8uIX9%;CV8B7mtv1-eZb>Ih`v zjLO~kFFHTrnAC<5+ZQvICJIuL#i#tf*?bEuv`DNt@e;Il;sPxNYYBSCw?jsdg8{2F zT#1;g#ZT^`>hO~pgkqFHKsdKR?aAXeOSy{aJ+E`tDpP<1d(a6UgW4JDi{fNyLN6!* zdQH?;rqIhrVa=e3&7jD>#VP}6% zZ9+M~jW_ilMsqVi?jxJ8mB1kq2^g3uK$KDHC<@ZwJ6))vrz4K%6r9VOg8YvB zQL>dBBxlK83X!6vrqTduJH^>q=WJb92WFB4incocAYX3>!8J~P*ayiV*=;OXiu%O= zWjQz%==8V%{y)3cQfsdH3*f)6t+&q3z~>K`VY?+tzY6^-=gUWb^!zReZ~!>RYaoxh z5&(J7rCz=FGzHxM={{?}dyaYQpNH-{=e(mn+3l2Fj@x6eAHMnSpa+PO1vM=_YxUW% zW6yyji8F7${P+tLBwU0@QDR(j!exJ)jXm+2YavOBOj)w!C{m(SE3LKFRd+q~)LS0| z4Kmme!(H&wMZau!z-#Zl@xd#PV@HKCZuza;lQ{FtPaAED1AjeoI4*23)@|#owca5j zh9@VGQBbMJk`vVd;l!N_SDxH_;UP@05TT;^=%uj)iJEGpiDp{LkSa~OLPmM= zC2OOjcG~N#gReRnps#-V8>*XOymSdeI<;XiMZ^s^U2)BIR}t!U?}2OqsN+CZgSk@y z7JUR5eg$nOfWrDV5H2s%tuf)GMyMoJn2Klb<4RXbUeFv63*ns;aYT4pyYkv8P#YrO zqxs5I&WD*e9A#3f#QHpoT!tWul#IG;umTI4FdeVUHajhh%E*m8oNh&}1;V!6CC7`{ZAD7StoUkEHOJ#mQF)m0bTrgB= z;c-1&g$LB^j0F5YHmnAcA#6 zUXgr)94-`81(wE#EO5ag@^BjkTwpO4B(jn_JeF}036&a_$zf!=3{?{Lud2H5-$q|O zut6^eV|j!J*ACGzO&IBZ9-|31mA-cJ<12)#<11E)gHGp5UQ|fp}I%GbLmHp)+VH~M$zi&*Cl=TAMy((DK&0PJE z@a@KbpE4Em9_$4GDT#;DYK5MRiIR)=uLXk`gvrFg&9)!un7hylC;S75M}ugxAqTut ztufBg;!&%cyQt^j>!j|Ng-4*7JILWd93nrrvzhWbQ<}jz0a<9lC=4lPf#x$%5Fbpp z1u*B=7}v6JI$O=vci;fxzO=U} z)~8d1`)g@(!;MXe*jK;^HVHX~v4qZ&>35nN0RJ`+WrV zlY!3Ul{?DOvytP5xoR~-;lu>QQX}~WqIRN&^R-j~K_&3~T2sU3t}nwG)Iuj+*~8G4 z(2biP$;L(WnPRv=n3@_U`92*j%Y74;us_A6iE#9c0WVX%8~2wVW0PNJX$E1~5@y&i zLed`2TcX-e)2%+eXzstb;Om|t3oma%dJ^;C1K;Pv3_Jt>K9(^s5FAJ)X32wvb)j?< z>O-?)_Yh<72D0CDdHV$)Xw-2B7AKXYSzrgLZBj$#;3(sWiNjzGg{27|gHXRxPLOEP zoIS?0@bvoE1+Tx@lz7E^`T!!NX~z+`uQZeknUG95Rfd;>k;7Ri&0!3T&hz~C_jJB` z4qJA(@giQJ1qE1f`l(jbzxIm}NL(LOj&BRlg(GZmPgU4+5OHM$E1t}s*;cwM_WHFX?y}#YwH(dAMYAqRW240dNrWD?OHW z;a??_os1Mrp>&y{>L(gXXkX->&V(Nj9JgoC`h5AQX((#ge_4vsG zBcVe$%F;BZIxEA3k6*GUj|;P*(;D1{g2QeNawCpSDEj_ONL1$lGv zb+5Oe?2DKu3cTWCgtcuN7YJP$!+`i+E2mLM36vhyBuO`jl^UwNvR*N3!ox}yD}g+u zHJv!7MeUYym)=?9L9_q|slOma8j^fk*DScoZBi}kP?yph+Vv1D_+|Pq`o1+A)V@6r zC{rE~hTNNA>3s|mp}kEW{c$Sj-C7$jZP9>Az8RZg)143Wi%CW@P#CNhPW2Hi{g&q) z44iM<1=F9C;Ae1>chm}XjgY!_^|0J6N4N=J%=RAo(lbl< zf$!5C`7n&yWTRi<-?LoxDEdEo`V;LsJ30q+zTQqrijY*X{Rk#s#IFU@txQ|VkvrtB z?zU1d?FMDpesWCPU^8UI4U#@VYFv(9Sac9xsf^?Z$7G{(Hq?hv?;sz~Di1Qmb=8EF z!g3pAp`Oi=vsICtYvX_}5Ho~_V`RRXmU=QydqJKq<$*qoU5cv0adncY(f0aZWcdH> zKO8y|D=c9HS7uRBgzP!KJLA1ZV>m>a*6j3dIMcc~2C@%Ir=ol!;XOy%s=wR+kW$E) zdNl^LYs7w)1q=ihB;$cYDArJi!-tY;w;TxOXs5I4LamCVE)X(bz3ROWLp(7!m9iB36n zq(4T`wrV|FhoXI)6B(&Y?mJXbd`PLq;D@oLCX4du*#$jW0NV!fiOjb}fH zd_=-aA3aPU9(qKICw*i;jG{V?2Gya5!8%OamTJ%Asg!48OLZHvh_{PkyOv;R`xlIl zjV)N;uT3znQEWRG@quyr*S`H8|L)#i|L*!lyu&HlyH&es1tW;os|x#exY^}5S#hT1PAuGfL_WblzcLri-a>9i;d?#kI|DYM{~ zW$%LadV{jAP3YKzWgqBRc%xjouY zAEqK+<{`mO8=eoFjan^Q=~?J#;(fSfjS0zke0x~tv)_JW?6M>cF4KM;AcBhea*C0aY43?CR@zX?cWQw=$Nw5-0k zYzh?qHr3`r7yWt{a;b}axhwp~ROT5U_N)(x#1VQ19?|b~~LglDws+y{7@S zT@{oKou5l^Wsw&0hKeo_XnN8`dCL9I@R+J z&XCa|^hOASh8TNCrMlPURHr($c0mp4)R)I$0?FnM1%vLmjnrO<6QzbzbtJ$rhPY1N z>vYMwd4UiVF+9jbLeq6U8F!-)w@5GK5?mkNdW^YEt!^=!)y++6lOl#5*Eqx} zdI?=Urr~J@e&=!hv|lDR8CIu6T&B5+HiASID>`A+YC?lH8ybLNG+=W${J;z2?$%Xw zJ5gOvyWR{(55-?S%0i7k+XV-VBA7?>$kTL8kBzP1dWgDrvzw`)<3!9dyqeL_(Ae_O z@-*{>(UN{P`^+}Wx(Psg2TGA%DS<9N_bt_GK`fo=SL2Yun9#{P5u3a-p*2D==xTaT z?X*ME)FAff!p@M(?W}`gSDoAC3W22QkSQC9sw=b(4kHK&Lgn1*`*hB)RESpy5<>M| z^$nrBuLQ7lR5q_RRM$7>KM&hvsAsHmt8yS~#?TQ4r!7 z-j*@@N+Ci19fhTqt=(8TqiQ-E4ANGi?r}QR-L4}Fx`m#G)(7+#+jals++XJ4TTJ~KfBSW& zxi`{WE1@)tRi6)jVwgzwiTam%hTkqz4pB;6E#dsnD-BY<$XHENQ~w>IAEErNBP!ac z#97L4z9AdZ$pj*(h6~l9d|>Y zqKftwrCsSH?I_28l767HuP~Q$r4z+LCOMxE`RPE1sjUuI{}!{vHitIvu_0=9)H^GqS{YLlajfPCsYfd0^5G(M2}j$Fge} zD#~-x+`^M&g1ov!P2tmvJC|gS!#Nb_5A_>b#q6BVz;ipfMmp0Z5HMlaxe8#x^hTdx zACpLqu~`=-l8bS zPZPb^$uJ!mgnPHTLB9D1Fy}FCnZ}|s$->Ol6wAjKeu8ZMt%0T%!zFCC&Z%>>yXtvgu-FQ-%BTo4w~;L)3;0HJJy+^cLzeItnHZCh zW)oFt>NoLYdHo64d(M`Mgx<>{f%zq@#*jbaAdB?B4WmDh?o|Es0jiAQRDqIe{ZWe@JD1#9$3DN{)WT{~ZHOFV6kxrsR1~!-M?@ zxXihO9Sv4qy+^KMLb%{&Ndd8V)0O*-Qp`$-$6@XNi&^eAP!G{}F__QN=*O9?%v8DbQ_jTuL3ym)cS(XX$IN0Nrphl}rvNuiE79v|OEL z0r^LYXZMuM_8l>n$4nM~t}6LF#SOd(4;&#={zh*uJoz!UcNP`*ewwVJYI=R5=eWk=8+Bafjrt|P@mx57}2k!Ja2v*+d4{={-c^z*k%fT*%o)$3iOu3 z+=7zX2Hz57h=qZH-HOjHU?pd{LTH)4VQ+lA0TXLz=JI@sBcF`D6Ky z*lad``J-ia(0Jh!w~uM@Pq*v7eK=cO7+4ciHDS6OR6wZ z0QKf=%tC+uGvz(7#~0tnkL~~4vD2{|bolP0yV0G0$M^F=_A^*q2Nnn3u8Zx~b@%G_ zH8$uc`UfT|6a6oR6Hle8g-e5GjjqDPfgTO%rLJHiXjAqkph|^FzCSxRf^h%ivoa}P zmNHvNO{S=K?FO_l^;9(cT;D+TfqgYyo@K%pXg^i++i@+WT%(i`(kLHDI3^JzsM1sb zCyce3r|>BGWCYUxF!$)!Oq3(!T0AU;2%)ke9^))ju{`b2iNfKMfmsIEEMNJ!9J6I_ zvbG+#aZshVse-&L;)NUHiz7K+vfQSPnm8hM;rkiq;-7^V;F+I-naNufbrNx%Rx7Tp zlT>C5SjCIQ!2FJ(jht0t5brSLkTn*ilx8aGmLbQUr*k=|dgOE#S*>s1?u6>8aR4a9*?)U6Yb;i1aI`p4Th*(k}w)2(WunGb`sa@7&=&@ zw>qsBt5;w0`rwXLt`b=T+#?JG1-&q=@jw9TYHt(+YEULv#U(-c*+1CatxvyfLLjx; zs)MhScD>G9OjIO{R6m7)ws#rD3P!X4Ald$asjgh1&#f18Mvd7`MYRPrbqpwZ!WS*~kcGf;3G(vp3yC1^$V9?M0;m3kH(sB2i6*y8al(^%AjxrWtMxQ=! zI{&mqB(S3ezj0Pv$+bRyWUqT`X7SQ9Au=rCU4SjGxg7jZ*Mv?zxF$ejx~W z_}X2Iz7y>qeZc?t15i7;E5s`gT&I;^BpY}Ip}RH7dH3BqDd!7JX4)@+O1QQ6?4>Vv zDo_bKZfXkkc;wEH88evz?egUYp4g5$EW_hTY-qg}?DHErDc}`(YB{<9u;1xh7wKE~ zWUn*g43rtc!lPP&wsaJYpnSu2=;&UUL2A=cFA+mlVa6P!KAps@-HjZZ;) zatIGV5A6o!(XGV1lBIv`%*3_YZ%AnDe15WcBm*~07~FyJGrC-%oqr~REl0I{EoSeC zrjR@jSZL4*bfw+J?t6h+$JZT<_pS^3)`5Ur*sEE}D#G%b=s7tN-25w;@3?=K2#r)i z*9WzQxghXehrGSmRB;C82mCy2@z?oTrG=T2i=^z3GRv{;wZ05OEQ%!@lmYex^)O!< z-5h8>w4z~;mfsxd^v{;(8wZ|uVL;fDdE%du=L2sOj`vRUfl4G&_mFeYazrZmUeWxa z;R4{F)2T<`9WH$#l(ek;hajUxg1<5IYqh478Tj@YAZv5s%xfik$AU)x6_h6VEg86B zyTcC8N}?kf$)DES6S4SW(gv8%T%hRNqZMcadp5r)NL1qJAA(*EQZX4d-^(yOmz)9_U`MBLubu1SU~aZxGs|mKrLk zqNS~5vB+tx)Qc^LrES&Jj2bGel1;0|IBKY{Dw0*|i*v>O7@~#>s@jGwkCi?_<@LRY z8Y-+xRG#8{v-sY!ZVy|sOPWE~kHM}vaK(q(s#vj_CYo8}+O&AMWRsNA`v$~nnrt3& zf5xgdsJgl~)&I+!*0#toZ7c5$g4Hz9>{|8Ns$vVVnkJhwB+rKfAk#cXz-jfgg{lX( zRO}nKbS{+nE{*xh5w9YY`p$qXbIM)SMg>c}epGfPnUw)P2L;0VETwjLzsRJ^~R$M{=%>I!^LA|prXtX)p z-e~dVi?WQEp3s6$JT;(R>NG|+ws_ChEk!*0;(cDgR#2@@%SJs{fmgW3U1gg8b%|=y zJvuDhSk<49KqgFc5=9Yt&reWS$#F3D$|mGl-DyJQ#=O~YG&m+!PhI*H-=5%J$w3uc)JSE-ALeexU-`5A9&%$L`p2ws+ZRQchp(DIF^1hPJZ0 zCzwQ!KwJ8^igx$F=Ij1pIPN3hqvcPv0`U29(dTt|LQj4Gj4?pqNIC7KM4&4|#$UzR z!Wn|=bF{NL+r#H;n=sbn#58>0V!XefnvyXBOS_&6|7=Mbymc?2dgN789#g|m>71g~ zkzcnl-c4-|Vmt$(vlee5OK5|MY&(H<${+t2d_5skEOqFqxlHV99I*xG{{;i)|HR4gr;C1cL;aajQN73(je9t zM434;c5G8c{i-2EU?9XnFa+_mFeHM1HYkgbfX3h=O5h7_;LRQ56XzVo?%r)LCE6&} z;*XpQfFpUm1~&LXTvxpVJr?Wo9?Y=OEtZ9>9L1?>a0~VMhEoyWKe&w+)(m(lg*>Z| zg-#N1NgIIyMVit>SCp|eTM((PD<2@`mkfuD*JLxXUW;v$#MBYuDu_=p@oYl;QTPOk z48+yUcmtV_B3f596oNDOfRzy7dH(k@S&VcwRYyb&hZ3HP_I#nZy>8HyxmW9NV1x>22VpF9tO#71vfad88Rn0m!&MY#K6L?nDLg}%K)6RS@qV+vA3KJVv_D- zdb3~YG+k1cQG~(K4SpWR25)bMz6S16Dg4NrbrrB7>0Zo~YR z^d6W6S!TXs?t4UXM@$%cNsik?LMZGT>}PuW5VpczhU@XPCK0!&SE%@kU)xvw`jFjv z*%?@RYO`i3sX#0eYg@)8Yn%G59~x1CS|CwISbrH@nY56!2=dRllhd-dcWpf@_o;K6 z?QJi(AP|bg z&GB>W)@_~LHODTyh4>~^nDER&gh=psCuamd% zSxbHN`@-ofNwO5F9vWbf!AZkFX_<#~88T%VBHK{IjWEm_BkhsnyIe+jrpQ-dlrm$C zR;Wm^5?>uv8Vo5=?sSw`VWoPmO4b zB})INiF6Xe#xmvXwNGOfR9a~xUZQi(+wXvb4%uR> zlTHyRxlovFqG_g@Zd|d9Q3S{nph&S2rOK46 zP^n6_8nx=Iuu{DSA&tVCG;7f+qD{LFQJuPU>(Q%EzX4`yVunYad91?o7`1Oz8dTrg zG}tt6AlW81tIfH#M8iOTQ_L>tOf_`6P*bK&b)~oYR>0>-yQoMaRnBi|>g`G-8|yp! z1n2YV&TY%u)E;e92=@K?*(H94FsWqIs=I$EW@KEM4qJNq4eP?|WZNL;z`nL&ygi@X z!|UzIy=1bjFu8noDIf-1F(72%0D)Zu0)ZR^LI(B_2;B3u$f%a0WSO)~B2vm`!@jxy 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 S+VxprHOcbwoc}+j=5GW~X5DW9 literal 0 HcmV?d00001 diff --git a/src/assets/fonts/nunito-sans-v15-latin-600italic.woff2 b/src/assets/fonts/nunito-sans-v15-latin-600italic.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..eebb0a2b6ce1adc7068aea1aa9c7ed5b389d2582 GIT binary patch literal 14820 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
58u>#-J3v_{mZ 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 literal 0 HcmV?d00001 diff --git a/src/assets/fonts/nunito-sans-v15-latin-700italic.woff2 b/src/assets/fonts/nunito-sans-v15-latin-700italic.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..6b0835cd1ee9185b29d715197e2dfb1e58cbf583 GIT binary patch literal 14648 zcmV-8ImgC#Pew8T0RR910691S5C8xG0ESQi065hE0RR9100000000000000000000 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 literal 0 HcmV?d00001 diff --git a/src/assets/fonts/nunito-sans-v15-latin-800.woff2 b/src/assets/fonts/nunito-sans-v15-latin-800.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..2d6a75524f350aa2ad34755fecf19e467fae153c GIT binary patch literal 13888 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 Oit=L2({ZQbrT_qEndgH5 literal 0 HcmV?d00001 diff --git a/src/assets/fonts/nunito-sans-v15-latin-800italic.woff2 b/src/assets/fonts/nunito-sans-v15-latin-800italic.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..282aa0a20e1417b487b4f30adf7acda56b3e31a7 GIT binary patch literal 14712 zcmV-;Ifuq~Pew8T0RR9106BO75C8xG0EXlM067)_0RR9100000000000000000000 z0000QfkYe03>=IS24Fu^R6$gM0sw_F5eN!_iCpX(3xrMp0X7081Bn;}AO(nA2aGQa z2OGR}73|mqpgSlyg=wNtG$M98D5Y$Ca70SZ{Mr8}BpqWomLCAA_I`*7g3Cn8O~FH% z=*m*xvjbK46e>!QT06sRK@*8X_LMr?)VSihe9R;Jz3FQ<2OGq7#sPjd1S1a^->s*_a@8)|RTOh993tIn1f(oUNCKoaQX5H! z^acqnfgm7sDNRKLET>}S4(-^k*^jHfZ!1??(X(7Fo>0jGH#7UHm2G^Ts!(`B0zo^3 z!lD#LV>$kx{^0j(pBrdYh>0|XuO{I@a{r+md`oj_a@bs&J`t)Z0Fr2D zx9H~ce3;qH3Jdi9b86D-ZN^$OD3JqXY&q<98R!2|{Jm9?Zh+2JzLxE-5;hf>)g}nA zlmq_^q;TT42KWyOSOEX2VByn%7MPv=FVkA8cb_hu1-gXU!wYZn>r+8`HpAE?(9EA5 zZL9Tn&iFYYjMFY|aaJSU7BkXfy^o2E4X+4tVzLNA2qL18ECK%O?-_T`L@O;m5DC0@ zCTS;VzG!BNCl;|c-D6 z(k2H<3V;qt1rE~u5`qI#KuXlr)yW#!S4SwMFH!CE7lHu800WCPIQ3MU2$qM^V*r*# z6ks6G`4s2dP<@^RI0H|PP?u6$kvX@2josd_HoE)nfWuH^DMdmN5eYd7B0=28^SMzygAZau~3kCxCtlP>-8j#Ej3xOptzzv^IeB(V%YvDH2fhDFFc^ zw*F{s0-HZkA1J=sj{+&cI7*T`;@hdz20EoqE>M_+5H19{A`()9LebhCy3n#iJNa5f zgr}6`TDgrRCpxAW7?r)oh^Z;Wvobs$3Q&FTvX8$Qt-v93fL2hzl;K^9=a&rv)lO~j zD=~n;hN`9n!<9}bm;w_n#m|Ni7fLHYWKtKv<>k*pkV)|bX%|JXAfqUhX{xv`0x*r- z@wYXL7@@0XQV-v*2(RHO+=rXpP%t`+8&)sHe6{q$XLe2=JAAOGZIMAzE&6hah|git zO?r(|#uQ_00m^!q55WD!+x70t-aV`LVvpd%@9f$x?DURq|8{N5)&VQkx({BwxtqTK zpTw=+=nY-J`H*L3O#r1$ORv_Ta@yKl$gk!3RyN;h=K{O68$J1?OEg!1qL$cF2MFV|6X z^;H)ukSj}uba@y!DUSyIwn>$F;wa3-fd2N|)%you0mwfQ(jng1E*3s}M0ij!D(dkG z5?C=Yr^^eqSeJEt*R7)uUh#gzxx75zFzptw(RtOEn1EZe;t>vh}7fcvmE0~}}2GTIPe zA+9XgbL~nmz!ibF^ZCH=)Mns}7c7Mw>^XpaTO{S4-dGlmJ%Gdhl01H_-3YuNOQq*6 z|8Wc!L+vW;2HTE+(=Eleg9j`+S8X{`Y3sE#Z&)sI$0|4-J}~wm1#}ys1Q0_uwGJGQ z-#>^FIC8muWH@l(K%klpe1iCD%$!*WlrsDC;dZ}q;a0zppv^y10|I#F>Tpj7@114G zNH-FZDw@-|x>AQC&o&1@u=jfOb_%$K8ZB|n;_?~Wt~!Nif`vu40^Aszl0#Xx>6wgA zp0~jk`xih2Z|7O+jYSPzx6D7itGiH@NjVFsgK}39qb_VWGEJSALP|7(al?DY%wa*I z8tO{h@s?I3fT;;^zD+PxMhjBO<_Pw-CtG*4#GhNrd&Tg#*LYAzIJKC)WSDr5Zql9K z{)e@nkGRXYYX7hTR|#Dj3O1Uq?q&ri0i5+?od~@kvWQf1g*aAXek3K!878sst-$%X z#&2!0dfo`>p-CSR@X?8ECH-0~1J&vvz=WnFjH@pU9JqIs$ z4uB1Fr25#Mk!>Y!#ntEPu`uDKv&vk_=RDe`PIP=Fn!1IXC&y6+!|5;~!3w}n@E%lP z#4!f4;U)*BTEw0rcW6A| z2BHkid*%Ue^kN|m!)Z4TqiXv~`9O_U(ohGFVMJWP#2U4mA=p*)IEm79w_A)0a)s9A zbthdMN{zVB*D8B;T=Mv(L?&x&tvH(1yS)TcX!Xo-(cmM0lUct>=x|zVVk>hz(Q{+z zD+P^wTE#l(BD%%qo{e;w$v)6Tx;rwt;$3TyJKoJ|ZI&xZJpgif^@Z@dx}wd|W=J|q z>NWz3hcU1qpcj;DiRsv!6)}1*x_0!AOLf-R(Wi+t52Ynd0Z!YzkS4eO^EgJk4IJ*rlSVDV z>n4taF(q_Av`3R%WfixEo!Q$rIF)^wp(`$!7(Ztig@+^hkd~F(eJEQsP%BqwBT)4M zg_E#6K>frDh%*5bKDA7J>*S+%|K^TC=wP_R%9u={XT2iuz8szezj&{?u98}1J<*S$ z&N4s?I1PY?NtjRU{_U7s>@82hkmQ^9DW%NRC^`%x=N`?pd(o;g{0z;}c@~kiK}Jh) zX32U>O3u!}%_FzTUf||%KHW>V_#oU}m5V6!GxPTBkdHMdr%d)SFU@wGl+!n>Yt4Rj zy{Ii1X_1cs2xXNP1}hfVaMLXIa*srPnZ#`C=GO0Cp%>!*qERJhm=`*FiurUy;I1$~ZG`w5Z!SyR(OBEE>J3 z&gO=@%5D_y@Z7G%S3P~#`89p`%E9}NIWv>tg$XT#LOlBTD0f4rSA?SBLuF-Tn3I9n z9d(GiBqqpGZwZxbOK^Djfz6}kHxjOBq0J5yzNwH9l3ex@Dz19^3BQtoK2)|Bj(CVmi28kd>oJQ;BpG%ZOtj(P}&=JMPAW*^^Mw z6hf}gLc)qehUp+bidV}=Lx^o*Qt)7+#Q?1|i7o}D>Xm}I>kH5VimxkW&w(=+0s=O` zAhuxVLsQC<1)PQV6U5xcN~$|+hTRf0oVX%lcXpx0*t<}yv4&>%7`w=%W(t&N9@LQ; z@+5N_q9u#q_b@qehKNx>+e$HO=OVSUVJ;WqPF?oB0Y&_fU;2yJ6q zcE(y^w}>keh=x6nmXDEmtl4FN{-)jUFkb-AGH%Lo2kr5?*=?IHVEGQa%+;k6UB4tk za}g&)mTWn4<;ho|NV|as8)B$YMq6x|&9>NTo9%Wx=D4DG{_W1e^2I9<@r;Ucw5W6P zJ>;-hKJ8wBUUu*5W}-Jcc(1?{jVYaxf!42agIjy2+k3_np6w^_i+>wC0RR91008h| zlJmiiFIK*~^*!Qe@sAh&;vfF|SrI}AA%qY@NUd>&8D^LP05k*u000000L(|iS5LkJ zKkZJVyP9IynL(q_>F*)YtAE39M$bmk-mGUe$CBP_jr6VanydQ;{Xt*f#{r-1$aEy= zFV)y_UmzCo{;_p-0#Nj+0f9hbpzy*{CZ)KgIHlO7Sc-|NO3UL2PWgCy{@QO1df4?* z-q-@`;E5N0HZ?cG?0?qtW8nWsZFMP3d^DFg!00O)N_uLd8Y+AH!teIRR>%f|=!z&Z zAs%swLwsVx{PZOfQZj(pRc?j(4og(ty%7i&6sK_Fd1~EtZsQb*J{4D6XYC0#RjSjG z+|h&LO0oO}l{_<2h>yAZ`dG4HI>9i|1ZIi}L&m|Kv^QaB+ku)I82;`Yf*e8}S-^{n z$(N6#FpYv0841gXNvD!21Yg73B|BUMM4Z#Xv2G0ycbE-uD3q95={c4n(#tZ&%;I@C z?fx4{aSy#3_yObm4>0B*RwuZCUq`x^0-_=nnotoHH5wz+&aXpqp=O?}Nh4hTbAB`e zNs$kV&6w+Kf~ICbjSM(EI~Qh7{N2W3ELG8(&M5z5q$7l~Lm^1MzWCU zGrBr2Kcn+~!Phmy=*C zNWISt(P1yt+;kiU9)+x$`qp9}0Pz(V0$m zr+Y&LNpJ|w2Zw&8-)T9mqSdq=?M3_3ku*JRLszw0td{llfre-v{4GsiH@*LD1w@Hp zZ}CQ((~8+?X}{I?j)lN-K!HvJ@c#tA&Kz}apLxc>w0+Toggp84*k>yA5Nuh+IXWV8LY+UBG8KG@|3 zgv$hvfRv0WGYU#7R%mKYT)1-M!IO>;Uw#6dcEA~59ZN~DXffg>NR=jChJ1yJ^jEA@ zt$Ga_HEYpspg{&3=A=hX`D}xoo_OJ@mma&Ff;+~z9Cqmm04`r84EJRd}b0-TVmu;cs9t1QRZ}=&T;+or9pFPh&vz0>}kG zbOxHf18DOfpaPVJ07$riqa-5L$Cip)7w67sb z;kA@P=nR!RNi2-5l(`0ouvg)(LO=!tsogQ9(5Db2poMG;aDosE$Ot3BVj`}65)I#D z33f@2Nv@-h=um;*`I8HEH&_{yVKN2JLt8~4l8hmWdd~R93sKSx$2zK+5ql?5Ax2HA zCaRQx2~aF(Ct4gpT^6Pk`^k_(@3m7wjBoi@O%!oqnm$xcB-)2*Q3;`WQ*_@L) z1x(Zc1yd}g((CRs(CqJA*`{g~`n%1L+q&oBlpXER?mHrw=pLivV0Pd|_X|+H&{!!0^QI zuxSb1Jiu)WX!&zki+w4|C5X;$O5~w7Zb3JsGZ3~jC_vxtLzCUk_V1H)6_K>6?<)p2 z?DLJ4+lIm%sDNEca^1|+?I~-+Y+3WEs>ZdrO0I@AP^reHGz7RANeReei4;=%2-aYC zswSc?3lFYtxuLm`|6^(6TTlg>yFuF32OtFq5>5;WtM~k7d8`30#$LwLIE8M^Z zvO&p_?ba`>+X{4mKPJfW(LS(xi6&@{rfOp;{s$Xz9d6`<8M3$v)@nf=QnaoQRbeGg z8JC6f+NJ=1Oskp=68*mshy?Dr40zlGnSAV7P1ft9JHbK8!~|({=f#`O{-ayC#m`b_kMds+6NY1 zX)$rXFAcq?EeM;^#bPYKA9H#@6K0s(+nelIp_c2%Hsj{+`*wE@5j)RETv%0soA$-&(KOM zg5W!+>b9yVRKdNUR@e@EEvNJ+@KCfv{&;C@aThuQul?@`QM&_NXdeOzn&mvUJHl76 zU`FUbhQ>q9A5mMF3#?rGLRPMuHd#GM>RPHD=()n3j^xJQ@h4*e+)}Oz2GY9T#PJ*? zgP{~hV5@SQ>_$7NEmx+}1O^1SIh(m)sNg=L^Y_yVNE3rRIj(zc^!rRSGu08TCRhEaRy`n zm3l4eVq(e@=cjtrUgyRhH>6JkTDZKC55)GDgSD+(JYRs#Lm+!daBJaNHxmpS_K7^w z&5UzQ^=xApOv-Ie>cbeZ72Iq>God=wEG|0Wo;w##yTyFYCBd{?S;*)tn07>E}{ zH|3@a8JNcx5c=e2WK@DAV-BepeC>2@ek8L>!!_caf1_rD6e@0bT-zK9zv0Dlw83%T zcZ;Ug-~g{hTYXH@VOO;AQRZrtz-v;B7K-84z%5OssncbRMBDa*p>k?4A&+-c~^!HP5DGWbgy!lBj5alXk)a*}kBkSu@& zrC5_^f+Q+l{$3JkNdgI&tKDiLcMGwLcV^pUMl;RhpAuz{Xg^5F{FY|ZVtDAGjW_7!mC9@#$;4tAeRaZLiaz|oa*ak5&V!Q~2py9i{Q{C{mkG-!z3xMQQ{4rxw4 zl;h(5xR{Yr7gl-|ek@JmAFdMZl$QUBT0af`n<|Y@Cd6Mds9^cjGtNj}g4>IkUkGk^ zcznSxR_NiFX_!0w1St@$`!oz-n6_fTvoBtEw0868B<@w2~jS@<4=3AqhOtfygPz zlM=-Sa5s?TxZk__@aa`>I-QoEo*NH3MmjO-u7kSoQH9;(ACMGCjC<)bQl5$MqDaG* zVj-_+U^hgY-nE%swcsJ@R@pgX{}yqZ3uOhz@viph>ew^FwfZwQRrs8K zwKNCpg&tB_4x%6-;vEdSN50)H84?9u9uTfAn?4M!U@)saa- zf1ZmTKKWL`FUDTE5IG#0Bo=qM}z0w&Lf|y*mshg}kJ=bOuaAsfS$^8`~=sThpDJ zjdkwjLaSl4zKSk$rERi7kA)KpbIJs9((Bxj=lqOH6px4g`=h7lz@`fMmZtVuL(}-! zWLXVI=Om>K@pNrt3!rzM{|Y@E#2?b4N3_Hf0rc=W_;}JpJR(R>sX)X4TcGr;E4HyY zp_pmu+-7W0RTsJ#P5O~dbySt7#aTM+X>6&hE3v`|Udp-c$Znh}B?%YBAkM|RgaoIE zuxpHon68DMBivlzm$BTRd8)4^;J>>o_SMf)MD?f-jz7d>w5q0lzEXV?Vvid7~g1>s}{M zRxDBIqH+P-ZIge1eD5cklc&)nyENc>wdr=ziq66nw`)wG3bJ={+(GgPENon}yL<~Q zURD=yMSbv)<%yk^Lx^Nx@*yi&`10XhvvQeNe&pzR@O=IGN9w7340TBZm0dvH*M5Gi z{uf-vFQBVlWBY2^liOjeFJNb*W6nEkkIrGZw=v+FrWKXAbK=QONZL*0^Svj;32iIL zLG|AFM?6_LUW8h5?H}W|!f|j05_|YUJ5Q-Kk5E#5Cx~4>n!UnD-5O7JLB7tLQ45f)zlcq(_cm2`iSne8VqQjcyRb zET%QT$ShHjkVdQ*>%(a~yB~5G7DN7jDdt-zSuFZhQv|Y@+*Y9<`z}4LZ=>l|6_h7# z;qN{XAOH`fj>y46c` zDAJ)RZMLfEO^#59*e$CjyeDjtzfI$IfWNI2ej{Oig1T5T_#wCfsUu2Z(p;%u-R1YH zqjJzA5zls?pMl2~k_5lwn*H_4g(BOP#yW%7vZSxfC3IpjUE|pv!_r~X5ii*^sjY3J zZl%_&tz*Px+sr@oDGWB9aaYLB9`aUo$@IM?;rjxCMZ&1RFAzom8S*dD7@Mpy=ZarhAizHFNpa8>`hu)-%0~o!$=*nrvu?%uZ_3KBAGwq z&Is+78AEW_I#kbc!wASc>lvlfgv}?Pc!jQYNLIrmJ>TnoW$F_WX?3}-WU(nwE7WMC za?lH}oN?WN9Hzz&rB=_|L-7bI|Yb zr#F2?kgr{>X|mabZ2{LJmWCvi)?pX52HZUrJ=`uzNTI|CIMb7Wk^;?ESna~r_Ocei zr?d*KW>n4pl%B7;cE{pvCgCpLzcn5bdxL76A#T%{BWXKx0CMV^^ZkF_kN!T#W+AVd zVoS&7gaUV9jk_OYR2s+Z@XdNv{IRVEc4)ou67Rkq2;ZO!cblK!)~ z)_-SKKk~fx%NgY^-f#f30UUUkeEUhfxJFQ+=@FA05*Vtn5dE2(23a+;6ryKOaD}gc zt-QLT88=tGI+KC`k7h;A5{^lr5W2l=i9O-B$c1hnN9dw-iWx;jN{6H*6Ien0BkL!o zoiDBGt_dtIQw>&5yIz^m4)}@74WV7k)B4U-h|1^u2cyI_^7HF91sHryR3)y}_)LR6 zc6WG*SvMSO;2n;RF0&&>#mkRAPNK^&^DSNa7%w!G?fB!2O4cFmDkrQ8-QXaEc0+1th!JyKXOfx-O} zB*#}|RFNgGXChprHcfjK;*y{N?97tJ@!NU+zA-j23ya!Bh!)hk$r)MV69iIfB`H!G zz;JCr4I<~jdwGXyocOE{6KUWOWPSk_x>MNB%a$YRWRSUXA9fpV-615H&60%i+j-u} zA870ggoW>`ig({ra~~+-@#o+*1;{g0n&B&!Lhg()!E;$EH;?62f}o_o%2dYoVjkuA zOb=4LO@{2v3Dl1SmgG4Gmt%Esl>su7ntj`xEGOsO1M-Ke1vdl@W<=EoJ}{T%sWN8f z2bvqPH}^4ek`|9Wq6K;GrtF*3nD9o2Kgc{v$SS3l9D#~i#*-8slzBo< z59T?JH-x~Ej$XxL$KCYLiOllH7UbGn99*%=!)5uDARrm2GEwi66{OskEy*lu@kgMN zT%mz3WvKy#+jjuB512M_R(*|iy|v_Cit4j%`~U=b@I6|@JF|L^>fAGxULf=}>7y4$ zK05FQ9^x;FLny~ zR7Hm-R6LCkufe;qxbL=Aw< z&-n3Q;c)@KbyDN-_)E{hvCG^j`&4C@=Jm#B${mX&(u8ZCb+MP5<%gmX;Jn-xAV-*>UZOD#o zg+FCwvARrJ!2C&P8R}$v%S?MJ1{Vf5|{l`84@!L^-6=T;s*;C(O zsxG1J9GKmrdiZOO=B-}5{&yCtw_^DXFw*MU54k4x*GoEfi)KKNwO-n>OE}Zacg^Ly zLGvRJ?|764emLB)&(Pmnwx^-lba;61vGV5OQ?=>G`YL5(ajV|wFnc37SB+B>scK5N zRZHqk#!`#oQZcHolY5gc%%`;B$meiX+FI9&wU&nVy@~k#?zYH|N5ajnLG~qq@9zpu zOJUr=aFcv;fsf0GlkHOJ1VBU17JUPnx`>6Xj^xZmW<+>k#dK-nhcgNeQ{cGzwOvWwfg8WnJh6eSN->;r*XqZ$7{F5@A z9GbdQ>TR}0rK;XyRizpgHf|6*#Yo8HMESHvz45_hq0dwZr%#wWMWKkW%WRH;P&jaN zy;L|Xg(GuW#?kTVwtsuo*FARD?Q^Jg9)s;Pee+3bTOWNSI*n2g9|zwXDc6X^_sB-D zmMBy8BRhMLodZ(U3G<H3(R?lm_^O>9n@Y_EU7nkQ0iFi&oS1fjM z`3|v&?{slRA=)lFeHU#?-+J(v{AU(N6G-(beY4i_9Y^V({b>ZQ^kOzU+ugd7ic&eL zM(?YU-^{}87{YG$e;y(p=C?$DWpbAy|0IiQ%c%3)sI8JeoOxgDE?Ns>)FGEAfb(#9 zI8VUkUhDF_?Z9$44$Nh@_l(DrEOv3Z7U&#j_8K&#l6JO$sh_*jk@Gysz<(4{J4NH}-1qjK~p`vALuT`*( z%C4uI$zr2}&!k1%E%<0rWzyzwBnK3>EL-6O7|6GDshvGg#ds?sl{kT>mQ&~B>s$Ll zBpmA=(z=+g!mmelY1y++Vpw~JuN->3Aay*8B10GKdlZpc*V(cVPr@vPFPy5O~Y5cPXW^W4H^;5qD$-H6nlJ$n$z zm8?h0_mAh%-p)G?m9thNk_xncgK;~+ac`>#ry#b9!8;tv#dFA(v*a`FOy=lq40zwk z>|4H}U|ivFo;a{|pU1Ur?)aSDbz*Moez&tIkCsNRqkDT%y~@>*_3N~LP(3+U+ihL@p8_|x6mK|-Y&n})JF#;kI2SA5 zf;a~dPy4=?FgqtWe}3{944=Gbm-SjTBFvF3+@&kg_|E%w1=xoJ2Ub(BFGn`tl1Kn? zebKF+ky{-dXWf6D1zGcLd;k8g`8A&Q@5{n>X9kg4@Z~8E<@v(^^FEN%Me-G1Xf&z#~c?&?FK}0Qdsa( z1xkP6)O67lVDqP6-qi3iu;ov_ylwtv(8Zs4dA$1NI_qe16p(4mlY|l`?j)1Fna3>Q zZDyGW3<8NpAkc_J2I#dpGV>B#Ar+|w_Wni`;lU^wI&b)D*asVt_ySPPF=xcSz|pW9 zIX54NVYfzY>Ci1{@igZ5({P)kuP8`OF5Hri4kAU{XLyNkY{RlKFz(1v7Vd7Fz;qfG zb1X?Pqi*jkUx`Rf6#@$MS;YevbY`S^Y`to1ordj&2v~eoiMH`)c)lMJdG!z2h9f2N zJ{qz9kH<=Apyi#SsSQO_0CSnTUV9=(TSPpD$m^BlBIip8aUa%eobQ83D~uR{M*%V} z@roxWizZz~30=Da@O6TBYt(Siih2Le9-nPJo>yCWe9tp& zp8I$D_*lpB#h&EUAHe?51q1@0JOYVi63K;Sc&p?mb=896A6ff(B~0!di#3O1mf-g@ zO~gV15k(|02!ui~d*7Ma%e7zPl5Op}Aev0u=*WZ;0wEoh)vgT|lFLE-K4v54_b1_) zZH=akiXU+_%yP`{r(xJ_QFG>?Nt3rNaMp*`#o+0xNL_Pi^%h5i+{^{f!nNq!O<5aK z&~uB926>H$)TfhAAd*uBuha$bWKpMY9@|hl_SHzF?hNw!@?Wk$4f?-mT2c3ZP_8`+ z`OI%n+iA9}o{Ss)c?Jms4}_?$CsAGC2W`Tb7%1aUZ>sE17~%s#-t;E$Kv9_HWPVU|h;wNk9$b6LK>onhK_ZNjEHwHUPoWU#>k0Ki(nLx({!1t#C*n3O40BFZnYQ9Hp4 za_|8a%*;d6O}@!d6k%uP!F`i&aug*rtLUsSN=~0)Cg0?k)XbI(_K8R>vi#Efn8`Oe ziW03!Zcq+@b@sk_`4~W2z|*XS(;Q3T8@V!R=3hu_{x%J!(fp(S)|@ZbB;R$#1Xi7DikhmXsp)ElnyIXJvuO6Z z_Bw}_^$(Dj-B<3UDomTI|B*2L5FbG)`Ghx(FJvZE~<-krEtXq zx~i_y_1Rwcm?Q6Kp^WO6`mO$~@pnq#Dm(x0ee&;bpPaRO*WM|$!+#q5H5ybLI>a#g z^)vzijei3a7lC|h8_;c&JiTe^!#C5czo-+dZO-Has;p8^t_eNWgqZh{;P}l8k zEoV77`oBT`u@!{hzkZu`NKfOrP`L}>wIT%XlfpyDoAw|-qb=!cSk#D?bObYso$5uN z>~e)qB2;f=)f=pDfN%T`57t}rSzZubVND5$YXBjuVGn3NyI`BH-VeZ^s-tsQZ%h#E zv%E|8ifp}FV2c2s<^7{8>=etJm>XpY^lrQBL2^UdU@fSyzEdCP)lGboIIEKcCf|>_ z)$(p9b^^O(PPQ7don)P0XEBA8C3vbXJBO?e=s11geX?~ueKxLA(O^@a19?0H3|> z!GC38^UQllz?d*VfPZR|*eXT(zZ;)8>|%rWaP;yU+I_zC7*Us7o4cX6o(QaVvVq># zea4EghW`A84q!)|BW{Rg`m47YdO^^q0rftCU~3%(;YCkuBDcL|WPWhZm;4x{d!8@) zVEp%j5I)sSe4k3l+p#;_AncQg)v$6A^enkzCY_2+tPDvHu*Ni+UK+~T)rUMBF&2d=dp-D(PepxpaJK3*BP<8+AvnED=jjSvLy zA^JOvg3PWGzXY}=oEJUt^Y8s>H-U-c+b#AA=Um$n^v9^{x){x<>v0IS`o;4Uw*V7( z33vjWC4+;`Da;++Xkm}2*2fN}4%lm)H-WIZz$JHrU_D1nb%}5M~Wf+-D5+x#H zK`Sac#2@UL#+xQUbSWNZZ!dA6Xe3o?os-~>91BJ7*;>`N8tcr>2su?;up43(nt{G^ zm?Cwp*80^N`2TTyqeDHTLH4UMJ$O>Fc;nI@(cJtvm*eCoCr4Y zy8cyaFwb-i(^(leKH&>(gsS%TTIG8``Qy+Ss3%qgzKMu3rbW@#oH6 zn{usc)wl>Z%aRS;e7mx0?ovccEK#W`wfZ%sb|9|4*lQv?X87x2;!QNjiyKcKJO!v$ zRTee)3f+hNYe@u8&s2k6; zBfJOH17CZLm*qvTd)vdAFq~3mqjH-}Wy?+ld#^dD-1F7VbL7OCiyr4)aFHuF?tVX; zRkSX-tlCx6Y_^4$_xkasivS-oOlTm-K00rpt7M|QaNv=*HfxAgQXi{nBj(6W`wOWe2^(iwtwWvHPUEfjFKl` zfkN->Ra7qGz+p$?!Xk@F_5vaAK_P8Pv5%Fr;UfVO?rG(JI^|lbP^pUjzWL4&R?=Fl zR-+9>*lMReA_7V(>ycJaTke=ic$maOazL0P+iVxk1f{O~)ysZ*tJ6nc z{q#4$K!Xf6#8Ayzv})6?L#Hm?di3hkZ@{1-!$yo6qf>+qx7>Hz9S_Qq@s-);bZ^sO zQ_etFtIV#oBi#*+1N}`YkGP||u_NHK<-1pUUTZB8i+Ixxl*$$Af|jP<&W5f<>5e|} z-mOB&)@`S^iPn`2a-9m~fLGh)c6T++SL`3^7SItO*W`LN@5GS(mBp=tly&-Ahxs&^ z0psIZ2JLmaTDyY${R3k$c1#?78X*`W7ho){d$I>pcWgiW+mVH9ZYSuZIu~A(vD=j4u8!M!m zd@rVDD^cpMtj@db=xozfFuS~$#9#EQMcz4`Ij_I9V^N3ldAL+lsF0LVQpdUbLgoAP z*44Dq3(DY&ySv*P(%n`Z4O`URf5Og|<~njUtg5+c=QPrzwi~335Z$1|Pp<-jd6(!I zDl$iicA@|%NYe%9erFOX1=dYyI2vs?rYj{`8XcUZ{Z~?yu8}5q-z~OS#d$2xFL;{XuUL)rg-OW;I?h3}!AQ!OfJs1(&rq^E~5 zgjCbgsi7NUz%=`6a|(AC_Qqcr6eZm*f*ZLJj+^4qBeCO=ZIBpV*+{1AOQrU@@vOPb zu{ZTNetzuCyLQ7rK#XiIRdi9^Ly(lez!8ff6c@G!Uj5h{)WBNj<5U{P$% z#3ZZn~nc128`*{?&JE0&^%ClC$;Wr?FfM@uRZ0gg9*5kv~3eo2P zQO#AGDqOTp%D;V1d&w@$Nc93hmWZD8(s-Fq|8sMVujO=sk`xFR>DYe$7IIq&@>SrO z_yPYx1$WUtAFJ*5+X^~hYUN({=2a~Iw5DgRx(LtjS#rlMpV2uzH z4Pu#Vxqt#3<(Q9!?|$fu0h7dPE9~_5hAokB+nAvPk#K*v;YCOw19}w>1jF6;GqecA zZ4?CVfdSn}01id6YKPPvj>;V>(H6-odm;sdT$YG51|^ctmNn-I+AUB~FWVwd`RuAP zlB*)AMIg=#D~#^%U+g!Jb3BbY0jiZ1f)F$uUWIqU}5GpnvfE;vGF0+lCGGTkBuvnpd~#l{JBa zx!#;*x+(s6k|i&8QFG3^py?(wePx`l<^5Wpw14%Ny8E`z`w(yDcCYrl5kB)y_Cinf zNcVSVC%UDh9c*vg>#whsEomOM=BTNf%A3Caalr+l|C#`3>nhdUqyws%8L;FkIffoq z8IScU!PD!H{FINNKFw25pX6pP=WLTco^$=k?7?^EQ1)gj+nX|%-rV#Iqg@sTBYI@i#!e2f}*?>E+N(`RN&L z(GXV-fP-TkLyumU^yUJk%-yl-n|&XtEHwLK1}!Ndgd4XmEHODyK#U223E;ZdlXA=X zlejN|RWpN5}hU05(NHAq{9wZ+bC?F|?x{t!s>4+s}bj92t8T zH1qKXAf~TxZWM@gK-{<@hQk{N8@|?TSg|s~2xE?cGRkQ3?S3Q zkfJA#T00G@x;W&PdjF08@A+N7F~JJ61rQDk?J39ItK zAYzyKWbgyt`Nr#iW4gY!>u~ zvO?%naldZmHwYl~4{X)Hw!%iPTK7F13JKKZo-1{?~o2PAS+m^YEa{5oJvp7ESBU78-Q^~kkOpH{eHoM*q|N5G}F6ge-%r5=-_<~MXh+%#7KFP z=UKPAGzZ(TQZ>uL0ovmBOkc|Y#3%y?fVc~=QCRZ&bd^FmQ(HBm10(PPJs(4z3@Bqd zlpUZ!-ckJcnB4nh$Dm8AxXnOAv9Ma?A?=BLxd6aS(h5mlTcGK!tb{l>G$Jr6 zFRD*Oi$vBAr321yR#=!QE?&MVU@{?GDvp_^0)ZS8N z1+5Gi-Z1#ez2`f-8>t01vfCqxwcmvRW+HvVbL%Xe52wFZ84Yw<|kokl7&PLPtS!T@{}Q zqZhI;$&rP)KhY9ty6sw`|J1r-28wdv3IH!NRt8=GwF%2-nkDrHom7bi4&#LpzA4oS0e>@@>J4ehJal!l`A;gK*5H*-~@ENI+xoEEzH? zv45|SG(x*G!9ya&D0M?`5c?lGhTdeWg;otsRDKhjUjE*M29a{kMUaJ|6@;kwL^lE{i{Ovu92u5$8U_xvF2mAOnLqpBrbdh>8eE6&Thh*be9SQxS{K*E@ zXoXBB7BPn{SQE9Dpne`}b87tU*`JjT!ck2#8%ef9BPWgSJ+j~06QG{x{LZ%2>4axt zX2m&R(FcBN^rLOCF#=U%jYeYeTNwb$R*l!{2$DAYI` zM_2DEdj%O8n4J|s{pSEHwjJiF68{hnj0SwZM57tZ~V8>)dqP z7I(e2-CLg>Q@X3?&{2QGs|>dsRw}48vraOEmRLnXMc}VGsntMidGe!{p->Pa+gU*d z4h#{?Auhs|(4a#{X}~WK&#$flFi(|{>O*~#>ccVH2rvh%jEW;giRPk3aTwSp9I}pl z01FdLlSPFz8r#O+i(nj*6RNrxoE;}36bvsaLSrH5s6JDMqdJiTs zWU%On6hGx{QlHDODA3>gp^sZ6z(?`!$#oaSb(=r!sNI0A``vA|-4^ojTZ>3s>dBTX zPrd?$iWDo=p;NaWz1AAE(H4gscEnM~oN~=|H{EvEJxqIQ#iVPfZmSl;G#Qd1sclKW zpVTe=qgpJk|HXa}wb~JyLknmHt)Wf6tvKxnIzlJWA5a97MbH-j3Q&Lo6rcbFC_n)U zP=Eq-CQ&_h-}$bpJkkKV(CC&4W>|Pq2qAXgq~5{{l$&@!nTPir2WdtO2N z;K&P_Gz`AKuwl)v?w2-cl+DZI!N!+2Z}8O4gkD7ff+NEdsl)pG>J#cy)u*gap~yk5 zlu&a5U2V3mx$SGZ6rgFL`jpprObEgubC7^`mMkP!-isB^U=c{sII74AyXA$sgW2VBl4QFtN6dW$sII zI%E4#BcqbgPU|emX%y&8UEFmaq3!CDNXmI~(orp>R{N;Ymj3Rn+>PTBF*XN63I;xs*?esT1di8g+Mm9dqyoELBKH>WNdDAK2}&@ zCGcQX40K*$mCXS6mV~yv{~RuRenJ2t8nM7mH_d$Du>R=a=sjq%6@@->R(Wfc1#1(IhcB$K8)Bx?L`4Gm?ZEf@ z8uT~7K!Xg{sA;Mlv@HX!x)9)4>^y`546sbS<%l;g?v#g<4tLC;lpp~G<=lK}myWM= zS}HE@maf}svbMs&K86ubV6t;mR*CCM6;`3qLnq|Cj3=^hPhmk&{;nvv=nG^S;E%I29NAs*;|h7s)KyC8rc2B}ti5O=-BaKg8)Y zI0LJy08>fgW!kLYv3ahA!8J~~_p@Y_tVfk7Wqj-IwH{ms(CI<}|6k*)?W^^_7vR4i zzuoRW>^=wZ?bGh9?lbOP?oxO1_Zi=v{rJVlXCS~aaIGJKyx@KSc7Dd)u_w%WaQc6` zFFNkIbAIy8D=%Dk!&$#O?2<#yJL0H+{p}woy+j0l)U*Nw3KGo9#?C?FRGmwVSn(31 zN|P=_mfJ44<3HD8BUf#DMrIC9F4>BdC{?DMTdjHx8Z~Lwp;MP`ectAF%NP5d@Pl9c z=vSY;iIumecWOW(+U^uNMn;LJpd#|8qi0}YWMZZf zB0{JzQNsNxQi?=Ll4XikL?uf;4J9=#13L>Vn?kwr%Ir>A=ImAfvf}6`G713GbaM`-Uo)D?EomOH{BRc%eifl{(w}* z*F{dP@yq*|gxni(hAylj*iL(DFZMb}Xj!;meA9Ik}s3~|ozl7=#?a^&?)i}TT51?>>0 zs_4n7LNLf=4`PZ~pEI?W--oh;Ap=0q`QnH{2mmndf~6UY#blXIBS|o(i>S_;-0U*D zl$C4>|8a37#L6v?18@gmqfFCoQNBs)$S#=0q*0&4sdqZDzS|eG=$y|-BZk|3-`q?UO)is#zA7|_k)xJ zl#ItQ`dpky5FrOij>V6`3o-gD&3^Oj+*?c=r5FIh0ox=UkifWZj1i%c@>s}%-f(Uw z!4^Lk%ulnQYM>x zaW97{!VK$hb@NsJY?~oQjPxacsPK|+%<*PFz5c{-db4-gC2SO9X#)3wEDPq3$G~mB zv3IoCCL36-6XoKzxG*9yd7yWRkmgHVI&0~V>5aB@3Qs=gb6ZG-H?&Qi{&;I-aW)!} z=GIPO)(l*eQ+;wS?2$VMpEF-p<1d$VKf>WaX`kZaMHqBBPvPCbxlRvyAZjK@Uj~YqFAE=umkz42jQRFBSg+-TT<{3F zFnlxggD6wz*dn5bM&t}sTn99twUAOq;HrChR#VD)JXl+F%4VVBE2c8Ix; zW-{6YnfS_jx}MLlNKzo}sj2jQHjqmIC*IQ)6s1S!8nt5+b;$lC8&+E}lRs`o3T-}` za^BkH)}U2;i~F%l$cHE9u=`|ngPQ^tGLQqO`3n5hfn-z=Z5G;uJMt7+q$47PJNcgQ z)!hoPbI5SoWrrg+g+Fv(QmD@eUw#<#j1D%;au~Bo2}EqI^7M)WG~T>4nF~Pi9=vBwOgU<ZPJ*21 zC6DIG%ks~o5Tad0-Xjw|HNX*Dmf>G)xK-~;J{+J99M489^p3dB=!1fujhE3_cE{%s znpet?F^Kl;`^_bsAH@mZUCz-Yy3!CK6^6dTi9%!|uD7HOcY%>zHflMIfzg&LPXb+b zy>{QN^;y%i*`No~)PtcO7D>4~9*I$~rt$akFbl7-!$1&04&z*FS^g&4`Q&<#1yoKH zFH42x^XmYJo)mO*q3c@8*|J;tR;Y|!{~V&8bBlW;{O z^kjx^78WX2jFnepGj9ILc|_+N}jM<~NeG^i7-tG%zQ z+<*Fmk!!>x0wh$Yz~Sbum%T)vy5^dM-R+wy0VqEB#a*pF%fyDH8=w^) zf8wzYnsTv;R3>gF$tyWr08Z2_hG^6zeAP2z4btb)$)SmUJuyD+jp{SJ0GrBjGC-L!<*`}>m8J0{f z9Eo0+)OQ+R?Gl5scufi&eaun|JIgRcnJwYxA~uVFd}M`xcNNjUMgFpXu4#LK)m|e( z(8J}AwellJVKXiIJ8NlHyCH^`HKTH9Ev`!{=-xgI!_*GKAgTpux)}u3%z5f%h{bho zkH&H*36vwvT?4CMia-vKWO_hpW6vy|(8~}sXZ07{CMmH5UNHFW#a7XZ5vzMlFd@R> ze9s8nsaczTqB0vilPsIU$6(}>~q?^Ef5waqrz&P!n%;$=`erNwpVM9>L^v~90D?$DGn zeFJNQ57CoCs&zAdd;j!OD`<=4Je9q9e`8k{7**tx7df9Fw=VZF+jU&&EK2xf^9S=< zO#mvgk9gfb=a(DPqOPml60HlOnL=9pPc#qIu|wp$gc*n37=npLnBWbbezZU1$}5&k z&hTA!PRFd^5;_L$TZ{}_uhpWSUytwucW(nZY0Cx_7U?M|XR+IgDP6d8z8qI?lFw<3 z|J#HTTeu*vZuQrqliT^ouy9c9?(sEa7J*cz&;^7%zxe&hHAFF9jFb^1}%+8O4wFOmvi41^vG>hKDHfxv@y{4^piZ{rnrQMZle!a~<|uJy!3 zta*M8kG9xM>cJtr1Q&P#UN1h9Gsj#wpSu+MZweh#Cn$y|=nKYy)i^g4PAN>561ap} z=s7kI;6Qk#=L>Vt)0JZWB$Nw!OYXy1K4sGfjwEATj-3O~*OG8Hq>LenH%NA4$v-p7 z(ig#<5>k^MoBJ?YeCA;41?h)f2v6KtG-m!Lp9%frPM)zt3C378^Tc?MYx3yR1^H6< z8Edz&zl|h~vEp64OkAW|^+53#r&>|JACcVe7)>_PIRU(-0G=}@R;M6Lp5)$k9kXz} z-^K#OfwyGEH-F1$*}pV@m6T78s(m!cIb5d850DnAYAss7*F7gTWdcgnM5WH3PRV-8 z5Ki0%m@fWlth7>D%()@0SC}j?Ba57995b3l1GG?9i=CZxd|4l}})nmij8IN`0lw ze8Mfk_SSV&pjaaIo^}=OZEh~wciPokKUq;*UG4RGDt#3|vGn^`;V5m4Hm({2ilyZ- z-WXvk0R@f=JtqqDXBwJIj+`y*R@ zRu(Ehz1?Y&T|l+8>-V|P-{w{<9XkxaEUCUMMINcodwuyl?zK}(qvfyR7Qha{5y&X3 z;Ep(5ajCNM0N3GQ+Ql7qWm{4)oqZSI$f1;~ROC_Sl||g4oE#)8 z3-N%I7{*ki^fCIlYAkcoJZ<)RDt+GSYM@xkb~FhjHAcO}r>Ax7`D1V#ub;tuH2a9` zsz2cHH~u6s7$jc5&~ab`Vu0VkVAS&mfc;+c{7e>p1DEj3_Sim9F#h=RvRy33jb&4b zI;TvW-Jk8dhuVE=Nu{6XY+=)sX@!mN{Iln~f%4-p;i`?j{2n^Bm){Gt5Mga>Ve(4u z*gZ2o8%9;BFtF!}2kofx_|hu7&QvohD&Q2wT2qd3M~bTnViNm298Q1IhN?&?FSlxp zH6udsl^`ob?qv^#k0+5AQYh`RoXy(A15OmlBhqV?n#&89ORT-Ytj3&PmMS-sf>TyB zCg@k?xlIaTv5yTNMt?umJ@q{ebU}6>+OsFPFl|*^l?tBDI(<2~Xa62RRV=>w04|cx z#|`BohTVv3~+IeM>fZ^wR~9xd1+k9L=V0`Rw{i ziK_-4_9a#GZhU;^Z=##+z2XgGwGS}Xw|&NIpH6!HyacAfw}Ln?oo!$V*7RY#!W<#~ z==G1IkWqp%XWcfK~a*8NbD8=eJeJx`xuEDzzjn zU7}V=0TYtlD^s`I9qQKJ%xsPu{ROkf{U(;bUn&tR`Petz%%0EOSnvmJLmxq#-6?3% zKPXF>pYb@7GPiWDaP`-11%b7`eTfiTr$pt`sN^2M*dWX2$P?8XpK9=OF45XAVO?cj z!Z#@(^`z<088gw^!gm`r-W0#ERJDGsF?*QtkWRnPpoPbPY z#GN|`h;lq+J^u(0ET7Gb{O0W=vcQrN9$ir^6iJM9A{na^Xh8ys3{8ss2Z$8ljT{TD z1L+V~k4)VLG*jWqOQ~8Nc2!%2QzOPYB-z7x>7&z1lx$9{qSZ;2&Pz^Kp59dlWQem< zu55SMlr5d~@Mt^?NXip8Q)aHu6t~zZ#W{EXPn6f-2&eOD5v)ypbdm%0CuH;HXXGGW z+EQ${%?Qd6Zj+Zzui1sg?&{RRU8g|C#e-+{%PltD%U1~VGoCbIj=6 z=&@CiPpCp@%DSaYICn6z=0f}zst2;ip;Cs0tqxX1Xntis2mfh_D^iU-nAW=WEoEdP z>Cf00dx}5yu397FNlZ0qYN8hMVj{Ykkf< z(a}|mNkt9D!NOn4zqpi=w7Zw|7cArSje&(oj83-kkk+WHqE?eD<)mM{`C zCSZfRB(EHZ{d&Vil`YTJo~b>qn7KLwhL`abA}ZUJR!kLA(4Sq0LX#61%IeRHagjRd>$|UDGY6QGAV5I4WwFlWW5NwL z%kde+znjsifYmoqi{Dm;O#Xq%&cXXdBX16+>FrGnNuErm&OaOdSs^Rc$W|yz``AF% zNmwWO$K+zk=910};Gy+37!8mitdcl;@=@W28)XD`MqgT5DI;ZcwC&36VB$V%p9RNK zdqg6S#-M8GmjFGabTC`JzqP}9WP84cVvf-yy)7KII56p?&ayZylNYn;r7n>!Etc@T zDuc}5D06Pcc+Gf%$%jGviU{~(FA&(u`K42e-**cYdE@U=(ev z>FnB2Q^ZIy-RZ==tz}az+=_|%wHx`}l(a5BzblQ>&7;yDr=~upQEwhG@Jt|^W3)-{ zh(@FiY&yBq7O!RUqI;rriF8S^MBq~zse&qjqXndU8XI}h zuvir$VHTENIaz>VaI}PcO48RHohD*m3z+A{+32^^i?duQiF2`0(uATKOM)yqY7mS6 z5SCstnTO$;vNL&Un~uVg(fg9gQx*bvJ?C=Cji|0rj*lbjJ2Dtmz9kCG^ISXPd3s@{ zBL(*W4u2CLZ@MB2C;85* z9UpOeYZB?ezex;=(m>=EB6lH>CyyUqB;q6>UnnHrYO&PrlYtw&qe3mA2u`l%|4HH( z%T4AYIiGZ2yZQ>5BB@Z@3kfgc5}p$X&lBQa;Ljj0#m7&gQAgtAFM*vrMH%Z)D#M;a z!dH)8#KcAH-j_rgiy$#53ImZ-P+srV@T*Gs$V2Uw&Biaf{*SBKN^2_aA?d$!EC*7 z_8(7TuZ8*I7T@psHN6uWbN?=ao{b+9jXbs`=f!<(E+0*7;}hVm;)kSPn2zoEpYSbDT_$ zoy%l8oLnB;#o#zHIBdI<1z?Xh#`6&;WZ;W3gyy1K3?RzWmuTA8MR|t_9TYR%*O~rqif-yIxgq zx_)pT4ER<2ov*$%_rO0Na3Z^QCf_^L#@9?~c7mzw7Tzm+XCK+^bK-np+Dhf#PUnJ$ zJKZy~j+U&w6<)=$-ma5bzTUZ#suOK_oHYfSOu0$1!=Im>%aZHTcsx+<1AF}eF9vw zA|>(O0U9F{WI~)>Tt$(LnQZtXm^|YmJ7@xdtCFG4%u8dMcxeRf-4`jr?c@#Ua^85D zgEM)B^5&H<>{jxBI$7Ki((aRnw{Doh-T{9<=j3AP*SOzsu+!Vr?5wRxaNIKZtA4-M zD-zXcbz+ZCs4ME|`@ir1U~<#Yli15>D|@VsPNLkv#ch4HJ@1pl?~??)Z2vdGlc|}q z96!^dYs83Y&Ac)crC;6q^Z4iKJ+gqGUG`q^YKl~r+r&KoSL~}NV+X`wGk6 zPWUjThVUDfMq+bFH0-a5VVZywAJSX361s3GknX(~lI;QVpj@DbMhfXkI?tv}w{Ut|t6M@19VjlLcZ0CqtwbCTY+U z^sd$J)VZOpAUFA%-XupF($bLzx!!o&VEkAMCy})YmrNF=%51jA>nIesL1wgEHJCot zA=1b?#2cGRaX-%z5@(k$EdDj?Ak6*@ei^#{t|4rge1|*su@UcprORW{aNIwdktGR5 zmG(?YS)EkB>VwIf2S0kfiNa!!NZkYxFGxthoNPvwB@|a!GsVR{*&LUoScT^?h}sD_WEW&g{CAzub=nr!5kyp z$HAv3mHgg6ePlq{q28sgR~vQ0+BRuHR(r~Tc(C7uOiFGiVV%MH;4aJ#@WG04@3?r} z+m5^=eRJvsY5K*RkEO^C?}T{5I}rpw`M(9~;%AZ9=R4=;`{&c-*Maa}=i^QgOwM)% zx6bUG;M9c?HmrzGcBMsc4{Y1785v*}^r=VhjGtl6(Djq~*G~l=-5ddl_{5GG1J_RF zUpon&tsa{1o?q9$4xg_f&d#pKU0~v7^mFT$B4{TB{{OwLML$^O?3k7Q`oH&y$p7zY zCH~GP2ZtxW-O%+|2B@2FJ{m@F=;XD$>j&J62j?iL_s_%8g2GIA>W~UG0TXr^M12Hn zVjP^GUjZ4)%;wYG%Brf?LTNUSUanLcR?H}AM6Q)ew<1venVAEWptKJaO>G5}Sdxmp zqz$NMNf3$blXU{Dc4`yVaR!hvFY2CY>3*=WcB)q7)&M82yIt<0@x#gOx~YRxKt$hl z`*`(jCDmkCZo%chJ$a-XEX{IXKr(qrN+e5`$dp+LnJAql8_>U^(0`+O4DKob@}1$~ zHdC$$=`XeHj>cTKI#+}p|GBjdw<{WZ6SSro!$^M^lH&`~UL5yBZf6_A#40g2p-%L0 z3W6L|1!^a2CAGoYLCxZRHm-JX{JPue#_oA#1JE%8P9!p_Y-D#J{*+&jv~ycVyK|H25a`k@_ zB7U2x8JU|KX&F2cfFvDiM&bSwM93Rla4J|GSAsD07P03y)lJojaJ~Q%*zI;c_RoBI z_Rw6%c_kg>Z0_yKHRmUebhj;6rU(Dg`jT*4d8AIpV5||8Mdqukt_1uVT9T4TY6#xr zSn-v0UUx zLXZbI#&D5JOqnFhApC=m**f@|0FWKK-7a_ao)J?-w&C1OZU6~H@b2EY0jeQs=zKRr zcu&QnG7kQ4fd1p#vQicN==}Z}t(xnNs$6v-+du80SL5@lp{qmKd+x9r^(Un__%zv4 zyWT{3?tV_P)WJtP77D%v7DrCn(=f(d7e}@?j5XJ3d^*1@pu8=Fu7kihYMKD(v|6o3 ztI~>Eoua3H0VOS@>VTPtRNGKZjkFrAN)c&rLp9cGHCmM-N~tJ1Rys4gmy%YaRcXbB z7MDpqFB8(aN0U~gRVkv((2zm`g5&FJ8)7|c(j$wQ6FX!$tX!{QMI>#d)}!@m|5tpn z&UjI$Y>?bR+DffQ@zRzJE6mqcYCYQTidS|iiYCZzWw>KVTdDPEy^4a+ zymGY0tp)X{BgE-ttLs&8o9z&^nCvBJQ@c|p3~gbykCVzTfGlEVp|VI>tSnKMD$A7R z%8CUmcPG+9drP+DIIBff2H*lqidygDag>78dnhnq{gp&UI1uy_+!bSQ{o>Jw%0v1{ zc|@NEp8AJAQ=ZWmNAW@#nt+E_@hTNcrSgA`Z<{bsKKeN6@sg4*le1&W7mXMHVDtl% zLH*JRhRI8A69A_F0rWpXo6!S}*Wqq?tCerJXBV+OGs|=PmO=fLE94_^pa*JqRjfub zkHCK~;5PUpc0q4{cNqNHTyLjLe~TBTjC-{YClry*LKYlx5<}DsxL2TFPR-C#wXKth zS;Br)3g-2Ak8QY!;xE{Grf$o?APl_{lz30MWXR3%-!nK9-ic#8G8z0_AMOfJ(ob<|tk_=XZ{Nh`=Pjb)8#95%2yJ#ZrdPpVv0ZjrdD%Qtr zah3?weDA!4x@L6)10BY!>_?)Azz97-9V;eGA^Or_eRuapK3mwJsK=Fhx@c%aoRsHQ zCh4-l-phY6@@0%accEBZ>GjPi6}=`L{*>gUEc9M2ika({&NKO%$ciy3UamNJ00nTY z|FBASO35q==sW2P&8yVIxyjU?=_nEqXbbxpMQcY@FF0PSMj_TWh;FLwGxRvia5cY~>Q$l_ei(WE zMV6WCmwU3lMAq5+H8bv2lNkb|2E;KEVfVG(hpK__@)I_H4TR41L=VbRsD{S!yqJhX zO|t)<$#<^zOcL(_no^TV$L=!buzoxkvV&zE*^=+^A_ zcYEH~WZ&EZ1q4@4cKedX;rE=u~wD+9R zu49AV7!E@W+=4oCjPI@i*;XdoLeABA%}xV>a1An)jOFR-t5<9X|9_WK>Jmi46)2Fy zd}tn;ngQzmSUV789WAWTK=?zJj$4}T4;&h(0B;o4g-OGF8)h_l9Okr7r&|^e^D>hi zmaFMMVU1K*!#eqfUZ5u!eKKMY4MdoOpnF&bqxx>OG^~N7dRPmQJ*-D5C>)GPcsPv+ z;8IN*x%nBjb8Aqm3P+;B+SxQ|)yN48_3z@*s)`QT#v@5xo`GII?d(ggM4?FP)~(gc zBmexXwe!h`PzB-kb?e!5@G~wnNz$T>jy6g8^GRyyhG-25i`IytC)&@s+DOESGfb6M zwY=SiS%TewS%vWS&d`L8C1Z49EXpm6g_}{dnKuxanvw9+TuEXjh?gKsA2n%3lmElp z6l05(Ay%R^okZ9D#_Vjgq~(Ci_UiCAZR@bQlagBM{gbU8ib|}+@J z$YDwTmMleTIHXDU+zWkuCPSty+5VIh8S$vO-}lHmevJ;QRo5Z)eo|Mn*6*YiMkZz! zpBt`IS5{&KYgVB#I|rw3EosG7SuOmmrCfP7YNNn_K~qe61fzRfV%b@p5S;i zjom&n+c<4?%`9qi26>4>mueh!Orc1k&ML^|d(#caop91Ad+c@5B|JeWmDy&RXRi6C zg=#ciJT~10iny3zWf*AutHf!N5Dv?9b3{RyC=+MA2_~9kvMHvTX1W<>nq{^*=9*`| zN>!@Ws8y$4gGNo7wP@9*U58FxW}Cy98n$}vgE!v#m{vZ!wY;GF$Mw&(G@|G}KNgQ+ z^X|*>CazeQ$iWAUo9<_g8C?(OyQeExEE@${K_#GV#*f8E*# z+0SwCSHI7n#Al^kTy%XA7(VLNQl3{1mnM0+xyD&*zaPmC!}|T`57C}0#8jp@i_+L;>+xr@Jg;wl`Z7US#-O5F;`O~(Vcg)6x*^& zKFo0C^?U0z$(Z1}k(UKKsK0u6zo)B~s(7}dW@6;2${EAt+$t)Uk9N!E2IVzh@$2I= z0`des*t7WSWdKKQ$PR@nnzi==>}C~}yhKY0+UYHBo&kx~Ia*DH_7n7*<0n9o);##l uFE64ciJc>YgHiI*a&t8AHf|kf`CAmr-_e?WyK5b&?J(89RU_&a0000(Uiwo2 literal 0 HcmV?d00001 diff --git a/src/assets/fonts/nunito-sans-v15-latin-900italic.woff2 b/src/assets/fonts/nunito-sans-v15-latin-900italic.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..257ca3facac20135db4674187c3268afd713e12f GIT binary patch literal 14884 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 P=7qoMe&SCc0KoqN?bxzv literal 0 HcmV?d00001 diff --git a/src/assets/fonts/nunito-sans-v15-latin-italic.woff2 b/src/assets/fonts/nunito-sans-v15-latin-italic.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..ffafc8b530d6b92cb353c66f874355542735a523 GIT binary patch literal 14700 zcmV-yIg`eBPew8T0RR9106A;`5C8xG0ER38067Q%0RR9100000000000000000000 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 literal 0 HcmV?d00001 diff --git a/src/assets/fonts/nunito-sans-v15-latin-regular.woff2 b/src/assets/fonts/nunito-sans-v15-latin-regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..52e3f8ed13698b19f36e3d781e0230418a496805 GIT binary patch literal 13860 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 literal 0 HcmV?d00001 diff --git a/src/assets/fonts/nunito-v26-latin-200.woff2 b/src/assets/fonts/nunito-v26-latin-200.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..5ef33cd2a099e0c6feb1ea0af9df6b72ebc6be26 GIT binary patch literal 15004 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 m+xphj;v;QviC0W<#7;|B2G*H8BxaysDCKlPLv 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 literal 0 HcmV?d00001 diff --git a/src/assets/fonts/nunito-v26-latin-300italic.woff2 b/src/assets/fonts/nunito-v26-latin-300italic.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..1c66c9c07c3fa46453bf5de8c5ec1537bfcab36e GIT binary patch literal 16948 zcmV(}K+wN;Pew8T0RR91075hX5C8xG0G%)Z071_H0RR9100000000000000000000 z0000Qfj%3@W*mwx24Fu^R6$fg0EIFU2nvC{1c8xu3xrGn0X7081Bny_AO(eB2aF{Q z2OB$tHEf$k4TJN5APHa2kdX*s;{c)uTOEn8mzz}c+5dk+f*Nx5=2A0kFcgN0gRrcg zMcFy7Eb2acJ@j68JPC0;GRD+ve}|5@zUimO2aFq!tO-0&Pka17b?`g)?FaqSBoc(0HANCdIY+ibG-nMI zN|LoW7R5q@Cs95f@<%#1 z&&B2eRwmeB)Xnun)xK#xqW|%~Xo+9`me+dbHV?H057f**`?s+d>f`=(Q){vzGc9Q` z&#PEyXo7nKG@yTf=*gU!GyO?Pdm!34$0c}`-$yKPR=IeIUq_U${FNcF%i$710R%vW zx*QqhJ3m^_Ay9yv604+6Q+8Vb|ASMvS%xrRJqm=w7_gg7)2xM`*Y5q^yZtPqP%q8k z4-gAL&CKZnH>u*_G?=%!`X~QqYTE8#I1J)Rk1L1@8Hzlo(BCSA&^h$3vGWJZogFNZ z8L$TuhvV}D$m1m{1?-ZP7a)~#;8EdDIi=3AsQlE~m0fl&%9#7kWf2ne);;onYd;hW z5O&UPYoSgFfJ^1epinHa`9mH}7=7?rA>%51E2fh?mQvI%BSgtu#N!g|A5zeH z@ogS|-qWUPB_oifq{tR9tajjl?L$jcEhj_T%hzFBmz%_o6L^x1x0Lj0e zfLoJpOaxCxEwuKdVhuww$<5b-e8y~gyuX+Cc%r-LI(dvPqSFH%z5TcIw%oc~v3M8V z9N)B?aHG%=GODTZ`n~=2y_)NBrKdg>P&!eKnRw9`dWyV1pOc;RY)^C?_(-B-|Ip8p ze{e>h$9}u#d$`*GO!(@~@8k||@0xGjHf;^iGO}jE3pQ(0Hf|#}XvXQ*r}ba83P3%w zf@L?9I%GDAA1HFclh14P92YLR$qEP-ff2)Pj`<1y>GysFY+NgacRkukX$pj^}FhHBfpy`Y}(a-VQf^P1V@#x}gl`qhKT zg?OB?eZ}Qr1_tyyzwc$fE)#y=gMfSol7wzGS%_YjYqXE!cm(288JyGQemp1n-FCZT zeT)4f@`l+tPHwO_p@5d`VaYqwPX4<{>SnX&pIt<#K2pB^SfVL5!S*PStFKw>Ku3E6 z=D_V__Z`kpBFq1@Ta~)WjM2;MCsi3NBKQ{xo#dt6FBZ81ZySA$*4e;q1|7RlxD+{F#m&?3 z%E1NBaMfZwd;S=6R0>0q7&0h9W8(lcKY1YM_5RkkuYF_)aK%EPnli9;ke}m(FtG6N zY7!U=9`_SC@Tea^f-#@ALm-Ayrq~k#R~SUx%)5GKMRHEN;ixcN{m6=I5mMq?O7N~8 z*||3gHfuHwWTa#2cv)Wr7-Vr@WwL3z0zvMNKl&2wTx_7^mJIbpkc@^=TBJW>tm?g{ zjiOO!eq3+!ORL)V=5e*WX!ZO`87|PWbdK66q=06a)NM*@H?bxR{!W zsBsll0jiXssi=3G6p*m7^SplL*A%%)7T&ZTv8M;yFs|6!Z-`l2>rT`d>+5|F-SCDmiDMuIIY>f7BqC%qZhaI{y3&?y=pv_GSw(u?rAV=O>wVTU%n&o=7jH}z z7&_*nDRFv#lyBUHPWb&n2xSoqg^<2S)o)oXH@>%?mf}U3K184!P`*l@XC!VBs@_D* zU6qb@wp|>>8Sju_vf5OKW7G1DTAY~?^14-|I#suzsyny3FPC@AJmGHE>}yFwSkL&< z0Kk(O$YKuq6}Z)?cc>Oov>X!+^0VSzlv<4bLkx<(oY&>E0md0KXW|5f8s*toq1CLs@k%Mq8i`Y1lP(dr2)m|3&G8;;o3l0sBMHVwW6#9%wE?xh?iKg>(iF)) zmzTZsC9_w7Ssl0*;Z62-FP{_+Q%ETFw!N=D_I)8$_6)FfJqUVE6eTTb_w{9!&nlTN znQAxlRiFkh*X>|VYSW?rJ-k1BD66djEE@3UsY;s`23&)X!7uzb*&Bzvc>tu=396L9 zU2Phey-7en7uNBXx(&X;l zE9b@++BGZH;CQI>FR{bRK35M#=iW!DnCZI9nJN=Me0wSV`=B6|&gR68MoR1sW-<2U z2*zFooN*EjlS6NMaMb(cP2!x_!UT~u(tV`e&RP#zsI7%24C#FcPd+FC-@8eh8;I@|xBc!M9P)Zb4ixGk9FonSDk7tpg#) z+Kh+z*g};8O{^1|Y&R+>tT%sRAEa7)LUR2>SDkg*(R{FB#=#J^4jV10M|;!pcc8s) z>q+f5yV=^{B-Kgt_h|<9Pe&1mI#+wB%bdkU71d=ZnU63G0(Y*q3O)pLG$Zo+lgN2jn z`wE*?U$gvv>M)$j!KmoxQma}}>sc(YYy8|~U<~T;mnYzT0=UhhAU`$ahlW76h^%Ft z6ub#^RA*JhVm$UZKu&T1zAWXqSQhYgU=FjB zFop=#2t*dPFtZD5EF~5Udr-nj2!!d1N^dl-Ps9`Wh9mjR6EG*e&T%&YO++5Tc_3Vn z2$6(@0)gd}z+mK@xdB5$MhMadIz$!pqYqIaItSt_=*%iF(yNo3)X#h#pSvz9KOOG# z4EAc~d)M|&)>s5S!$wBq(6)btxRA@FR-{;ou1b|DSHZ|+peAO+47bz@+ibVfUMHPW zk@O2L!pihi&gxxFHVyT8BxJ_@8M5MDhUhRMNA3fBX~2Hq0B{I63>*QDB9sCrfm6VF z;4*L>7{&XEU0`Zh5v&+i0_zGZg>{2fz%;N1*l<|w3xQFZMDMiT8NG9q^OOsei_{7L z0D#;Yi^Y=3WW@|gk|arzbZ+?0rJMd}YSOML+&3_&{R=+M7hba8yB*%f(+`%sM|Hsj zht&6s0Jfm%)CGb-qOh>fbH*eL)FEXQ8wp-zIdRU^!Ah+WI;*Q2`a%71fHgXO162NJ zG*1JHw3@m~$k*ztwUE7Fb7!N@)L;Ol5YHlbz)Z}-Y-HWJ5)cwu#20mC*+-YKJ7X3) zrtIx*>LRm+CPE8=gMiw?s#M?9s8_(vcm1Pq`lgJ+5tE?x#hxNVNGiIP)b zRG^*tNZByYpVHnos3PXiD#how18-L-v7G5|Ah!~;(0t{Q_Ddy5R zk`gft4ZVF`75$ArEayf^(^^2=8H($sh)WYjt7YkRXNZ+q{Sic0v7d1+Hl6 zhotfFXqS_*C(EQEqHHT0j$*L1EY`APuS_}wy}$SNAlO!5-bx)Vq2$ZgD8+Eh+jIu2q8iB zrog{=fRPJ{IL3JqDO4^bhf&l+2FC^B#u!tADfOtgXsP)TbS^H{NX(GpP~I?L!lZ_t zh%FY$gFsJ&5fw79mDRZRR|$dd{Hc{8OL*icP;R#r*y#>9XGoLTGdIB5D--Ddr|kxT zkzm@B`1OAtv=&GH3Ftl`KYIe0f`IC0ff0u^V|7>m^f4j;f6TantSOpkHvnnZD5*&P z)I!x5!30hw%d-3G28k#b7${JbVLDM!PzrmvXZx^^hX|5j6YigE`V0MycBEZs8SO=f z(9v`%ZKSujg~`M+o6Z~zL{o~kf?loep;>{b1Z(E6v^_0dqF_4eq2FgQZ~)MtCj?trg<<{Gh5k@aQd;=sQ=y$J|l4RFFsK%Qh70P-M10xI(xl6jEnk5y)XH>Ip}QV>>7%cDS~_}0CXEIf@adU+&qL%o-zIx5`SZ?ZtqRSOfWi#A8jwikK674jc)% z@#4;d4^JO?3l$_-h$#LVB#DGUUmjlB;ye`+=IJry7;2^j7VYS_AacpFtB1 zGhcOi#9ez3SVF-SS6y()Wfvi+=`1Z< zy5$_g%YmH#0Nq*yVUXAfD8K{G9f&_!H-pNsg$1>M3IvCoGTg09n4mpm-!FEuezsTz zLl-BQ`x((1QHRgG^Lb`xvJB?(4oM6L>&#&IXGB6L9zV=|*{P_qfTx0)bL zrlQ`z-o+r|eNDL2cC_|Z4Gc7t>l(VqvjCkCjJSGfWnM=A8&p$q4W)hT|JR1tlaZR9hv$GL*{SF{ zJ~lnKST#cKTI$$)~zUC7$dc)_gp1rY3sl47Ko!_y)cK=Ood=`Ip;TTySlN=HjnnT;N$>EImR&)mN`G@`?jqwo4L_%x zhb~>e;A&wG81dmaZJ}gXEvui+SQlRzh3@T6;rBas*nb33y4mx?Tk1xQWlY8J)KqmY=F3 zWh`ecbzw-8+EQqHB`HtFiT3-S72lX{wFd)(CA^JtBYuZ8xW!|a{va()bv>vFhuB62 zoBQ4q`NaU-6H*K}78XKF--jJBi=L*A7lO=v6GVvu-Bbs#x>ngax+o8NG^W$y$f61z zjagVmXmJLn_a0gK!an4?yH+4G6H3tzat(SGtFGj)x#ywl1`Q#jwc2LrqAAgcuYTQB z9AGVap=JNg8f7lh;yA$VFzWMm$y4XRM&vewW=zE0DQ=!J^Llz&GxEhN%#AMZKkpw@ zUG2(H1`{ZMk>jAXZaLh~?-nBP;!xaEOeI&Xe}rFzn_%xV0NMFOr^t*|Gx8F@_wyT| z*_cT*WNiCQN>YT3dH^+Ubf<|72__LO0n`Nje-p}Pq3Ajup(C)Q>4KL&7M5Up6w^`s z+M`Ng`B1jC0RWScDp*HbK6_!;TF6yc(UZHsJqj*7^V4XAI|N?xy6L0ZSQ7%gUZAw8 zVIOwYyqBD>wX&YSW=?|gHOG@X1L=F9Rh*jrpZ%k|U%tjjHWYOr;k5yq7R3ejKeaH4 zTy6eNZfT}s+8c@rFwgoqiTVSH!RHH&4QxIOU55Ga0ncUv1=Ul@$aB%D%O@?1q=`i_ z3ORl#RcS$Wqm>v?g#x8rYB)rh1LUF6=&^#UKv$Fv;PC96KF(}ygLHO48CZTDXtgG4 z7^oU1b7`AO!HNe)%UYvbe>KvU1-+?RQqoWNyv}4Z_ttTHxNzY@n6T5>Xni7sCOI9W zHjVqQ-$u9kZIl>?T^ZE7xuv%AljQjU0Sae-AbU9uS1l7x5&|jW-E3I-$QCe|LSfN_ z0$fVkB5!j3!(IGKO1 zb9KJug!|~L)ad-|`uKAE?$XS+RUM1Hb|=pSFO1fS$UnSv+n&F?yA0cE<12#;wRj+B zddhYY`F*iL7>|7#X;fhji~$%FNJcu1NqkN+9M%#^6%bz?NKz3ZWGRs_u~CAdz(DA2 zaINlxDky|_>fwYKbhfa;Ti*wHI4~6a{OF&I+&XzGM!igk6r(?k9xCnNj!034eU zP{{xo240lBS(4Mrc(&*oB4+h60H^qeeKURLXqCAW0n*;TZddVZ|xG6 zrl*MI1{@B3_ z=YQBJWMkiVwQ2ka=*%1Xu06v@=KHP9w#g4Ih&JTDtN0Uk;gT$v1)h8a>$^u?<*DJL zRaeiDOjDAZrbq#SF4>-eB!F&?dX6`0E1LUv&ydbm&?v$w7!fw>2q~U+Koj9Ti@!8G zV2ROfqLqJQW0Zye8<;xO*Sco|#;OGI8X?)=NeX@+wWIBl3L0A%5;_LSQK5eWZXm#A26D%*Y?8A9I*piRwZd8p-;brGe|D@u;bsZrj!?<{Q)KT`o(3 z!6;~u-6hpkqk}j36(S=3U0-r*h1D2`1o}%l=P-J7Hl0-?lpB=-$tJno2b9vjxw>WU z_quykOKj}}0w_~g!a)_Wp)5V$Gy7+4W~YT!LMK6} z7#dv>T|X|snl-_?;!*^boD(ly`3I8htB!>o#WE2|1ZdEI;dKLZYlC6ry>S0bo8ngj z%o2I_*=HS}e{A+Y_j*K&8Viom76G^T4XL76A|c*RE9S*yC~V$xI|0?> zvvQKFrc`&{Q#^3FY!*zF; zUMJ5iFJ#9TPIH;oR=N{fY7}O9E^F}$@^!6#`GcAW;1*Bd^15VO*X~$3Cog7cY0ENg z_4c?C*W?6CdHD47_JN)m3ni7W$)a1GF%Yi+N=NJp*r-KFD^hD!z)6v>k|s@8Jd&!h z>kx)v*#bBoeGH)hQ%fWsFpBA&Wk?_LdSt7Ln+B3{^{tV4GmY72Dcj}6>_pe}0@KE( z{>k0Fae3rM6Cd{l`W`}A=wa-ogpV@TZMN2uKn{gnC!J76&3^_E9s1jELN*5_Sft3|k3TaH~B zHe2!$o3F8$NZ&b0D^3yM=Mz@0P7hDB4g1|h2@i)g247h`ih=^s9b)B7@dw=_mF;cF zK_5dT2?Fv#aG6y(NBk6l&t{zr4Q=Q2JcQ8WlFB)Zn<#RdRZS1>*M*e8yE?Pc5wwf54FalB)U4n-F}hw!Dr~TETnG+BTdMloyQ<1r@e45u z1yxKMc=%pzX)1T7>WW*$={_(lC`Hna7Ll*P@RQ=q?^zx3tAs%;G_CgMe2+cLXf-+y z0A7H&5V5iGE40#coNW{8LbUlc=~~h6HeyAP5p&qAVqT^xu85&j_l9pD(rd@b2L>vb zvC8}ixi%)DB5P8hhgRTBmMX?dl@$d8A1SU6Z`~901B9`$VC*qOBx0}1T9_EfVj9XL zG?}z!C_^*oTK;)Ja+kZKuBN+&+@W1{{nLt*vKn=nyQivwz#n6!?3pgien^0yCXaM6 zJNx_oLy)s!wNpOp4+W4v`hPYLa^Dc)5A2S~T*I^m2!Wr6b#yZg1MdGI%7K>j;d%y! zV4T)TG*x{)4Bqjc(pU2`Y2T>o{ocdy*}82Jm><9AZwPwow`o31t zgOht6fR7Y*f*qUfIpq>pJ%N!K_r_9!R8<7%#>G>*nv{7OARt`R=B*)AGuEO{38Z9X z6nP}=Sba`}jzIo?IUc}I3m0jHiqCsOJ@$Hao|iZ)T>2`SX9$z%r;>a2Dzti@5q-Oy zbBI0to78-YFeOXEC|E1NSSW^!5s`w=&g2<`!NmZ9nH!^xQLO7>u&5*rr;TiM3hora z7-wky4>CPl-^hMcn`TbP@}mvpzYdT_ z#VtcYu3%w)eGZ%%N_Vto0cn7`I0@@Oy(|>N#<-QUSu6}4BT4wsGEcHjl`9v!b+-7y z`fR&gZPy7J^wvzPA<3cR*BdNm8)##iT(QE^lsHDE+ToGuqtfZqw=L%GyuEzMqA*1o zPh_O!2s4aMTgbG<9bjXEZRqPPI(QP0kSh}xX>H2Edb?F!ti}Rl2`natj&UmIFfk%} zf`jA^E%hXm#rSz( z8ck|umQkIfXWzA>(0kL0~@m1Ee;V&zm(0K@oQ zKmY2>xtay`Fbx_TY|SA_5YL4JTFDV%Z~P}#!RYN1r8})JZV#Q6?)Qohlz8qzOzaeSR_QhHCmfHCg~)}kDgA=t=49{L^D9F zs_A$|vEC1ot1_h!ab|RjTGTnCH5#m0R?|AAR?uKP0h>9w27KVwG`vZq2YIB3Be_2! zS-m;1IVjZFTJ8r*T$l*?8f{kJ!#@L@(!_gIj%5R zkW*_%(}P0{4f$4u+OD1B09N2PieBNAmP_33K;XQg2trVE^^I@C$S0;*KS2*bxiM1UqRiaN6j@-6>Iy0FTv|M^hmlP|$We)@Q z0^*F(A?7wAB^CLPfX1L1)F~_`ij5H|-2><&0*Ye8d(zq${zSI6d1H*? zJ&c@BsoN3q&)&N0F#OcF{@xBp+me_X$-Q2Ib z<&bl}uHSdpt5L)zwXdRI`=ZDKJdxifRQ>iRGJJJP_!B(gUsvz{NZ*|7`V~TMP`bx| z4qbR_ZQOsMe|V~yah`PY;>=$_`vLeIt=7FRsrPJ*{5^~wNvYcz`tQEF$1wbq(pTwq zKL%3#_eGMf@)Z&~d>xNILzU1k8hdxyQf_z%75#*O0j9i&@$aBkdKN6VnCa0@mm^bc zOU`V7t`kToQf(>8GOO~9*_DkRVwve%6eVI;IHm(|PDWjiA}_r{q_8QhZm$8tzI`8N z;OpZ(wX#r-#>&Je2%(obhMg#jh>nqTW8c%Qu~b%(BPXUmoWPF7f`Ld;c65P38=pQD z8jOSl{rqUdz-SA-o_i3fh*UQ zUD|}Y8y~O0EO-y25_FEIP`G=-)J^8wrGGfz*M18w%ba0TW!-i(`~V30>3W#)N%6gB`YT;qtTtR&A%1G z4{Pl%p+e=9%L@}yHO;l!RHf1;7v{$bBenVnL0q<6m=`CE(&{3>00lqw@83QRbX3UU zdBo|5FhX4-VbCKpMMB9Q_V84au>)CLmrZqE`RxY&kew*4)h zFw6*0x|G3G_yqz)$T>W2ZrN8)zZao|P?h7Af;I*3&JQC2KdK;>G3?qA((SDK8I01SA3-E@Jr^MOZ8^qI3 zG4KWE=t-MrhV7xubc8a*4voUi- zzGow1dI=ML19nV!M5=w$D7+LxL!O}z(d&5p^wdY*f-_(hR@;;)rZZ7!4@!VjVTwVO zp=2QcTjoz)?~8f#se)LoNCa5?|_T;kXkwuihj=6``2 zdxO8*XT5ISG6~LpNR+`4#W!T;_+vm#-op@*O6V!i(uUsMJ|hT3v9^g<*uTqUTdrQ)p*f zN2Bykuc!^#km~0N??lZ8!dim*4oOC$_$yq$2kv5x@O&raqhy*Q?@-_fj<5z&9`VuH zOoX?_u?_Gv$XNXR+w32t%;;2=B#*7xCLNX9S1xIYh>JHzMe3rX*hZDM*>f$Ykg5}>t0=iGm$Z;I6lc;yOZ0fT>la)|3)KEIBe zkVf4}q3xj3xMuo4q^_2*oHpxfoegkKnO!Wi$;IMqyF6Cvh>>M0WKx@50`?48M(a;& ztsS0#F(5b;o6mM_T3dhQ;IhQ}HaZN0N@D?(vEoIr1C>s-Gr%QEUU za4D19>s7!)A+0v`_W$xHUhTmlpRh8eYr>PBfRnS%&dyA?dL;8b3{THiEZr0TMG^!f zHXXnIeICaqN^X7Ps-_$^Rj!n;R*4|3wuE(i61NxEaOtZ(c`x?@Q}*AlcS_SM9%lUF zdq|oA4!HNe#83J8_PLP0SHV;Ne02yg<`>Gcgci-+G}f1-y7@LeJxy+sb; z2v6ak&`~_}9s;zt@Y%EX19Uu100Lx|V7?V^DFQ+OvsREy}zL9^$dI%i< zD(WYkCi3+Z%!@yQhi|W6zo8-WRey>|M?4R~2%Jb8QbxTsFt*VAXp!pN$aiscx*UcH z$W07zzv5>?U|2;TI2ZbcGJ$Gh8Y12){a@X(=nYK9`zgp0`MU9CDPe>F-(D|VJUQxB zoiqmI>>@=Gap8)PPjEjL3Zw7Qihz@(GHeb3et`kzS45XUn+PbT#baSIqJT*5}m83G&o?q@#%d&Dya?J^CWjalQ zNx2XYrJF;LW8&ynp;7qo*IfR&u=@1U+yyJLD_VAXOZIm37VgzBDGd!0DqWjXN1%!5pdILb&@-Zc`RloMY_JEz~aaWn)XTkTQ$X=HDrXoWaWfp6d-ZG``3h5OIXV9oZ z;k_)}1i>JVB2j@8hm(p!{vNU?kCRvYlu4DyjA2EQLfg(_RVsHYlP|Q)4k>9O$0s>T z#YwWfK;iOi>o{@6rVLt?)D)H#C6FH~RCdajviKtFtkC*WYJ6f&Y0NMb_V;V*@^iZZrI z^PQ4*qcIBS=YxON+s`Clcbbc1t?|@%m6z4Gcp^-J%O+{Ew%;CFEDlb!=3ASWZdYn> z@{;Y;FSwmsOhKIPS;A@tqlt(ShYYF7iK;ZUu7=ffDZ0w@2TC{>EpA^uooPR~nQ^aH z@?A9V8)+>#L5KIUlDhmew&9^2iOoFfMSj5}2)PuK)Ts*b-;(m=mq)O;tvLKjUKK=C z7*yftKDN@?gmnnye14=(7s=;qBP93?ZNz**oKUFL zQ%ASS$t^Nf)~+FO6dfbs3@OhH)MfP=u($ymTFrsd7s#WiJy6*Kn?iV1l?p4 zE9#$>b;Is^Y!R=N~|J;Rv_U z!=qXLT5QcebOZ-o#&&f3rO8UN#4)^#p#S%oXDqVrcuxcnkUkMmF;=0KNDh0j!+3}d zmuv`HOVBCvi-gA5lCT#m!Wysn%=|r#E=+Zp2*#kb^LL?KLJZj=B+H052?z%Re*V}P zF>vJwdX500(3el6(yb`}7%I)_Afk)l@6Uc#@?gs?uso!kBDEy*&Y61%HPah^g zpJ05!pR2)oFV}{4>K&yh-Zt-Mb@)eC&!R$1oZzn%RC{vfI3x7<}vBI^l63c zGw@B2LyZLweLbI`I(~=z0(E%&(6$3k*1Vs6yS99L=HQ!}quWNSu(_u#Ye1O>385Jjy>|K>eG=oMu9+Eg{N}KxEcx@2b=}3K zjp8+LK3jTr7Ztv83OtZ389zcrZlC(~JTI|p-oIS3?!uC$alQt@ZOA@x;EEIQV+z*y zf$P+2V+F1}j&f3+^jgM+4+1(A#}0G9o?-Lj@TbT2y$j?_d0Qxdm|ZvYO?0@9`M+bQ z1G!W06@&%o`Z~V`?`9zj#f*b%RC@UCB1Ll9XL-OlmN@hU@!NVFMDH8?+I9kkM+8F$ z*yJN=*MRN-HpVHf5Th7+m&3C*H>i`xs?B44mrD0YHl*r#Tqmzju*;40Flh_zvN zz0BV*Cis`=nRsuVPtB{XHS{-YeQG|=)@SBsnqzuh8T!?eH_pOzy;$}irwn2R@ZOBY zKmx|I4G6k8?A%D9>1e4okCSw?@ z2G(UH4l!tD;Q06rTm{I&<_*21bL41O+2%s+XnoA#&wA>9GV53!q}ES*zCI&Hdk|(&Hh8<7dD5(nH|R2$>EHE*}2o^ z@(bffn3SNPi)YAzlm*e_%?tZNT5b=A1Vvw6jG%GQ?K*8<($do$#z-BF(pt$sGi_SG zdg-^e>Tn%(picfl^+FO0qqWmcc(F_)qdmm?=Ci)J>dpaHL4J3SzyDm)ERb^oK8r`5 zA+L~e0{lBl-#|Kk;5CL&kq_`cAr$yI0xHwcgOkxw{3?%C5ZNfbf=-HL+TfBvuXl)~ zSU(FQ=;<98cGz00ea}$>-P(>q>*?1}HI{jfxE-rIs5<|N)&mGOegvP;d{Bv@MZs{} z*BgJ};Ti`5qUeH4p`o6KYg2J&0OMN{7YkkyNRp7~s{#2KDe}in9_{@lUw=(z#8D9z z2`5|Zh2-G@(ZP;Ui5|j#l%|@Pb44o`^$d`Y#!7$`z9rLo ze9u$qwT_{5>$nf_ZS(2!85KKgX7$9q8zIjE744m`4#ZT|&e&Cip~zh8^a9UM)au-B z!23JJZud12MyA=97T~Dk5~(rq8+ySK@51>aqOsTl9RA`Y-(_>|By+gQS2*me$^K!p z!B@^*om~wGe~{?(1V4Q(2z|Jxn;PO+6uo`n1!kOzZZU5M=x%LZm$>CyZm7jiq^whQ zaN5Fp(broYV0CRB{Ow5#NNl*ZV<@d-anI}>(AD7V0%upPpI;QdO=o#Oa~X4H`I*fa zakm41#pj65Dqka;ioO9k8&EC}reX%Bhfv*bt0uOEb%>kQy2_8dGsfM3R4PFbY?)|uiSP+|9)b*h#*5rKqn7qTM`{i?P60MU=>!MN%0%_+fK}ams8Av}@^=z25gFO7=qb!j&NTCd85CWbB z0p0M>9*a_-*=0Hk|BY?*eBv_uUg}PL^r)iQ&g7duw<*=zCy0xtK=%a;k{uazDaK4+e>)cVyL;vXiK2`6Be{EDD3Klj&>VSZkixO z-!V*>2-g05cYME}{$Ob%|Dx}2Ky8MjgQ#B&04Dzf&}v#bc{>-fi8L28U*QMmY{nKV zxP>n21p-i>^@J$!6DJI$Ib@D?MBF6x@RqK5(ylW{Jcksys$SY+`8NXDNt)eeNMdE5 z(p02Irq-o=JEF6@ST|yFuVxgrV8$MVWpnaLXLEgoNP0)XVm4G+@6x)yivJ`>|zE^kWWkTjqeF6K08A- zd=60znu?-;qtm6+_O?Z7B%(*$ceUGHH%yrf-%}e8PWQN28Ph1F?I}aYM8=*LtE>q* z$W>YOIl$PK=z0zlUbC7k=`K6wnxeLt+vL=?Ho0W^`oLX3_e>iJOP8D0-nVw9-0W)Z zx8M^A1k^|0?R%21OJVFk7D2oRe0Vv#1Ax!(XAz&CH7QqnT)-GGK)|0Mrf)0C|5GnE zxXk`M&dmH4yqn061J>*BewT~dG6jqLMC4Z%ltfY7B|kbhx4967qgh6wr`YeH+3>H1U+<*m4y?fG0;CsO>? zBKGv;3yQs;_))IjH}^Utn5siPVyX^prP!*ge`4dV=@{Mm)!89u>jW=W*=%3BK#9xc z4C(2WU$@gv9cWWtsUG~f5MYZ_pO2cxIlin#PK7a9Yh6Y1NuYW1!xw2lXQUZ&T`7Y5B=&@_|U z@50OkX1EZBbE<4rZJQZ9d8y&;10S`{yXX>Me*DQ@cEwfKM!Az0JxFiCuDhYmEi-M` zEW{U~M9K%|ZFlr>SCnWmVto=9fk;TDQBSKcodzqUNvD_LqfGr64A5VeY&lf!F={k0 z3QTfiKpxMMH`y7R4K~CeD-E?np|5<%n{uMAN)0o@NW+yW*G+}b4(c8gvEaB9v0Vikn_!&DCYfS% zzVXx3dt)5IjK8twB`5IBcl*)YxSFlf8cA;%!=*>crMAA0IG(Tf=llED)i*RYO`SG< zM)S;BEv;>{+dJl%#$c*n&G5$N@rx~HBvlz|8*4=w-fEMvwr94YzNuQ9r%L5!B{8-} zIk!dX9HvR9QOY&8s#-%srLLw*J3ztSj*DvcE$b^ZA_H9{677(?m8I9!hH>M-g5XTQ z091oLGb0uyG>yAVHbBz^<4|BGOe%qylj$@%c6!>OHvmEv00yuD5CH%H*aZM!022U! zJ5NbV6%e^cv6^6M*kn+XTXx2(2BkDX1M#9yC&8>9M+7{ZR7z4&+qjW26^9^WL<$Bu z;ZZm!C1<|~3#L;LnmXN_nAWu6nAiQFuyzXy4E861C{S&R)hY2tjkdg*JudkmtGn`;JuSRbiF+<*!OeV1y*fImR=z$z_*g^uES?u~W zn7oIxS&EJ`Brt7fK#I|e{rx-dgw5pHwgz|^j=4D`%x>}1vETlN)KeJjze|)MSdD)F L&cX3b1poj5%<6|% literal 0 HcmV?d00001 diff --git a/src/assets/fonts/nunito-v26-latin-500.woff2 b/src/assets/fonts/nunito-v26-latin-500.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..7331d3c17beb7f72dfb0c2f2ea585ca2d2996c3b GIT binary patch literal 16504 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 LnkC-N1ONa4N`t@~ literal 0 HcmV?d00001 diff --git a/src/assets/fonts/nunito-v26-latin-600.woff2 b/src/assets/fonts/nunito-v26-latin-600.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..7c4789250a884417d5c0672494168677c934a2d3 GIT binary patch literal 16540 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 TBhsY*UG-Sk%%VN*yFqsaa0aZ) literal 0 HcmV?d00001 diff --git a/src/assets/fonts/nunito-v26-latin-600italic.woff2 b/src/assets/fonts/nunito-v26-latin-600italic.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..ffa91b61ff8843d7c95f9688ff2866aaf82ad440 GIT binary patch literal 17444 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 Tppjp8>0*A1^_F#!Mq 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 Hx&Z(H6jVpc literal 0 HcmV?d00001 diff --git a/src/assets/fonts/nunito-v26-latin-regular.woff2 b/src/assets/fonts/nunito-v26-latin-regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..99439c135ebd42eb92bf9a61c57980c7b5af816f GIT binary patch literal 16292 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 literal 0 HcmV?d00001 diff --git a/src/assets/i18n/de.json b/src/assets/i18n/de.json new file mode 100644 index 0000000..943078a --- /dev/null +++ b/src/assets/i18n/de.json @@ -0,0 +1,291 @@ +{ + "login": { + "header": "Anmeldung", + "infoText": "Wir empfehlen dir, die E-Mail-Adresse zu nutzen, die du bei der Arbeit verwendest.", + "inputField": "beispielname@email.com", + "inputField2": "Passwort", + "midText": "Passwort vergessen?", + "midSeperator": "ODER", + "googleBtn": "Anmeldung mit Google", + "BtnLeft": "Anmelden", + "BtnRight": "Gäste-Login", + "topText": "Neu bei DABubble?", + "topText2": "Konto erstellen", + "errorText": "*Email ist erforderlich.", + "errorText2": "*Passwort ist erforderlich." + }, + + "createAccount": { + "header": "Konto erstellen", + "infoText": "Mit deinem Namen und deiner E-Mail-Adresse hast du dein neues DABubble-Konto.", + "inputField": "Name und Nachname", + "inputField2": "beispielname@email.com", + "inputField3": "Passwort", + "midText": "Ich stimme der", + "midText2": "Datenschutzerklärung", + "midText3": "zu.", + "Btn": "Weiter", + "errorText": "*Name ist erforderlich.", + "errorText2": "*Email ist erforderlich.", + "errorText3": "*Bitte geben Sie ein Passwort ein (mind. 6 Zeichen)." + }, + + "chooseAvatar": { + "header": "Wähle deinen Avatar", + "avatarInfo": "Aus der Liste wählen", + "ownAvatar": "eigenes Bild verwenden", + "avatarBtn": "Datei hochladen", + "Btn": "Weiter" + }, + + "passwordForget": { + "header": "Passwort zurücksetzen", + "infoText": "Bitte geben Sie Ihre E-Mail-Adresse ein.", + "inputfield": "beispielname@email.com", + "infoTextBottom": "Wir senden Ihnen eine E-Mail, Über die Sie Ihr Passwort ändern können.", + "Btn": "E-Mail senden", + "errorText": "*Email ist erforderlich." + }, + + "passwordReset": { + "header": "Passwort zurücksetzen", + "inputfield": "Neues Passwort", + "inputfield2": "Neues Passwort bestätigen", + "Btn": "Passwort ändern", + "errorText": "*Bitte geben Sie ein neus Passwort ein (mind.6 Zeichen).", + "errorText2": "*Die Passwörter stimmen nicht überein." + }, + + "channel-informations": { + "header": "Kanal Name", + "channelInfo": "Beschreibung", + "channelInfo2": "keine Beschreibung.", + "channelMadeBy": "Erstellt von", + "channelErrorText": "*Nur der Ersteller kann den Kanal bearbeiten", + "members": "Mitglieder", + "leave": "Kanal verlassen" + }, + + "channel-msg-box": { + "text": "Die maximale Anzahl an Dateien beträgt 1.", + "placeholder": "Geben Sie Ihre Nachricht ein" + }, + + "info": { + "channelCreate": "Der Kanal wurde von", + "channelCreate2": "am", + "channelCreate3": " erstellt. Das ist der Anfang des Kanals", + "notice": "Dieser Raum ist nur für dich da. Mache dir Notizen, liste deine To-dos auf oder bewahre Links und Dateien griffbereit auf. Du kannst hier auch gerne Dinge mit dir selbst besprechen.", + "talkTo": "Diese Unterhaltung findet nur zwischen", + "talkTo2": "und dir statt." + }, + + "show-channel-member": { + "header": "Kanal Mitglieder", + "addMember": "Mitglieder hinzufügen", + "result": "Keine Ergebnisse", + "add": "hinzufügen" + }, + + "open-send-prv-message": { + "profil": "Profil", + "aktiv": "Aktiv", + "offline": "Offline", + "adress": "E-Mail-Address", + "message": "Nachricht" + }, + + "main-chat": { + "message": "Neue Nachricht", + "placeholder": "An: #Kanal oder @jemanden" + }, + + "edit-msg": { + "save": "Speichern", + "cancel": "Abbrechen" + }, + + "options-menu": { + "delete": "Nachricht löschen", + "edit": "Nachricht bearbeiten" + }, + + "reaction-emojis": { + "react": "haben reagiert.", + "react2": "hat reagiert." + }, + + "single-chat": { + "edit": "(bearbeitet)", + "answer": "Antworten", + "answer2": "Antwort", + "answer3": "Letzte Antwort:", + "answer4": "Antwort..." + }, + + "secondary-chat": { + "thread": "Thema", + "answer": "Antworten" + }, + + "add-new-channel": { + "header": "Kanal erstellen", + "info": "Kanäls dienen ihrem Team zur Kommuniktaion. Am besten sollten sie themenbezogen sein #marketing zum Beispiel.", + "header2": "Kanal-Name", + "required": "(erforderlich)", + "placeholder": "(mind. 6 Buchstaben)", + "placeholder2": "Schreiben Sie hier, welche Themen im Kanal besprochen werden können.", + "description": "Beschreibung", + "optional": "(optional)", + "create": "Erstellen", + "addPeople": "Leute hinzufügen", + "addAll": "Alle Mitglieder hinzufügen von", + "devspace": "Devspace", + "add": "Fügen Sie bestimmte Personen hinzu", + "warning": "Dieser Kanal existiert bereits" + }, + + "sidebar-channels": { + "channel": "Kanäle", + "addChannel": "Kanal hinzufügen" + }, + + "sidebar-direct-messages": { + "messages": "Direktnachrichten", + "members": "Mitgliederliste" + }, + + "sidebar-direct-messages-user": { + "you": "Du" + }, + + "sidebar-toggle": { + "openWorkspace": "Menü öffnen" + }, + + "edit-user-details": { + "profile": "Dein Profil bearbeiten", + "fullName": "Vollständiger Name", + "placeholder": "Ihr Name (min. 3 Buchstaben)", + "placeholder2": "Ihre E-Mail-Adresse", + "email": "E-Mail-Addresse", + "cancel": "Abbrechen", + "save": "Speichern", + "errorMessage": "* Änderungen am Gast Profil sind nicht möglich." + }, + + "edit-user": { + "edit": "bearbeiten", + "email": "E-Mail-Addresse" + }, + + "search-bar": { + "placeholder": "Im Devspace suchen", + "errorMessage": "Keine Übereinstimmung gefunden" + }, + + "search-bar-header": { + "user": "Benutzer", + "channels": "Kanäle", + "thread": "Themen" + }, + + "footer": { + "privatePolice": "Datenschutz", + "imprint": "Impressum" + }, + + "start-header": { + "new": "Neu bei DABubble?", + "create": "Konto erstellen" + }, + + "login-header": { + "profil": "Profil", + "logout": "Ausloggen" + }, + + "user": { + "email": "E-Mail-Addresse", + "message": "Direktnachrichten" + }, + + "imprint": { + "headline": "Imprint", + "tmg": "Angaben gemäß §5 TMG", + "contact": "Kontakt", + "tel": "Telefon", + "mail": "E-Mail", + "disclaimer": "Haftungsausschluss", + "liabilityContentHeadline": "Haftung für Inhalte", + "liabilityContentDescription": "Die Inhalte unserer Seiten wurden mit größter Sorgfalt erstellt. Für die Richtigkeit, Vollständigkeit und Aktualität der Inhalte können wir jedoch keine Gewähr übernehmen. Als Diensteanbieter sind wir gemäß § 7 Abs.1 TMG für eigene Inhalte auf diesen Seiten nach den allgemeinen Gesetzen verantwortlich. Nach §§ 8 bis 10 TMG sind wir als Diensteanbieter jedoch nicht verpflichtet, übermittelte oder gespeicherte fremde Informationen zu überwachen oder nach Umständen zu forschen, die auf eine rechtswidrige Tätigkeit hinweisen. Verpflichtungen zur Entfernung oder Sperrung der Nutzung von Informationen nach den allgemeinen Gesetzen bleiben hiervon unberührt. Eine diesbezügliche Haftung ist jedoch erst ab dem Zeitpunkt der Kenntnis einer konkreten Rechtsverletzung möglich. Bei Bekanntwerden von entsprechenden Rechtsverletzungen werden wir diese Inhalte umgehend entfernen.", + "liabilityLinksHeadline": "Haftung für Links", + "liabilityLinksDescription": "Unser Angebot enthält Links zu externen Webseiten Dritter, auf deren Inhalte wir keinen Einfluss haben. Deshalb können wir für diese fremden Inhalte auch keine Gewähr übernehmen. Für die Inhalte der verlinkten Seiten ist stets der jeweilige Anbieter oder Betreiber der Seiten verantwortlich. Die verlinkten Seiten wurden zum Zeitpunkt der Verlinkung auf mögliche Rechtsverstöße überprüft. Rechtswidrige Inhalte waren zum Zeitpunkt der Verlinkung nicht erkennbar. Eine permanente inhaltliche Kontrolle der verlinkten Seiten ist jedoch ohne konkrete Anhaltspunkte einer Rechtsverletzung nicht zumutbar. Bei Bekanntwerden von Rechtsverletzungen werden wir derartige Links umgehend entfernen.", + "copyrightHeadline": "Urheberrecht", + "copyrightDescription": "Die durch die Seitenbetreiber erstellten Inhalte und Werke auf diesen Seiten unterliegen dem deutschen Urheberrecht. Die Vervielfältigung, Bearbeitung, Verbreitung und jede Art der Verwertung außerhalb der Grenzen des Urheberrechtes bedürfen der schriftlichen Zustimmung des jeweiligen Autors bzw. Erstellers. Downloads und Kopien dieser Seite sind nur für den privaten, nicht kommerziellen Gebrauch gestattet. Soweit die Inhalte auf dieser Seite nicht vom Betreiber erstellt wurden, werden die Urheberrechte Dritter beachtet. Insbesondere werden Inhalte Dritter als solche gekennzeichnet. Sollten Sie trotzdem auf eine Urheberrechtsverletzung aufmerksam werden, bitten wir um einen entsprechenden Hinweis. Bei Bekanntwerden von Rechtsverletzungen werden wir derartige Inhalte umgehend entfernen.", + "dataProtectionHeadline": "Datenschutz", + "dataProtectionDescription": "Die Nutzung unserer Webseite ist in der Regel ohne Angabe personenbezogener Daten möglich. Soweit auf unseren Seiten personenbezogene Daten (beispielsweise Name, Anschrift oder eMail-Adressen) erhoben werden, erfolgt dies, soweit möglich, stets auf freiwilliger Basis. Diese Daten werden ohne Ihre ausdrückliche Zustimmung nicht an Dritte weitergegeben. Wir weisen darauf hin, dass die Datenübertragung im Internet (z.B. bei der Kommunikation per E-Mail) Sicherheitslücken aufweisen kann. Ein lückenloser Schutz der Daten vor dem Zugriff durch Dritte ist nicht möglich. Der Nutzung von im Rahmen der Impressumspflicht veröffentlichten Kontaktdaten durch Dritte zur Übersendung von nicht ausdrücklich angeforderter Werbung und Informationsmaterialien wird hiermit ausdrücklich widersprochen. Die Betreiber der Seiten behalten sich ausdrücklich rechtliche Schritte im Falle der unverlangten Zusendung von Werbeinformationen, etwa durch Spam-Mails, vor.", + "sourceText0": "Impressum vom", + "sourceLink0": "Impressum Generator", + "sourceText1": "der", + "sourceLink1": "Kanzlei Hasselbach, Rechtsanwälte für Arbeitsrecht und Familienrecht" + }, + "privacy-policy": { + "headline": "Datenschutzerklärung", + "preambleHeadline": "Präambel", + "preambleDescription": "Mit der folgenden Datenschutzerklärung möchten wir Sie darüber aufklären, welche Arten Ihrer personenbezogenen Daten (nachfolgend auch kurz als 'Daten' bezeichnet) wir zu welchen Zwecken und in welchem Umfang verarbeiten. Die Datenschutzerklärung gilt für alle von uns durchgeführten Verarbeitungen personenbezogener Daten, sowohl im Rahmen der Erbringung unserer Leistungen als auch insbesondere auf unseren Webseiten, in mobilen Applikationen sowie innerhalb externer Onlinepräsenzen, wie z.B. unserer Social-Media-Profile (nachfolgend zusammenfassend bezeichnet als 'Onlineangebot').", + "ContentHeadline": "Inhaltsübersicht", + "Content0": "Präambel", + "Content1": "Verantwortliche", + "Content2": "Übersicht der Verarbeitungen", + "Content3": "Maßgebliche Rechtsgrundlagen", + "Content4": "Sicherheitsmaßnahmen", + "Content5": "Löschung von Daten", + "Content6": "Rechte der betroffenen Personen", + "Content7": "Änderung und Aktualisierung der Datenschutzerklärung", + "Content8": "Begriffsdefinitionen", + "tel": "Telefon", + "mail": "E-Mail", + "Content2Description": "Die nachfolgende Übersicht fasst die Arten der verarbeiteten Daten und die Zwecke ihrer Verarbeitung zusammen und verweist auf die betroffenen Personen.", + "Content2Section0": "Arten der verarbeiteten Daten", + "Content2Section0List": "Kontaktdaten, Inhaltsdaten, Nutzungsdaten, Metadaten, Kommunikationsdaten, Verfahrensdaten.", + "Content2Section1": "Kategorien betroffener Personen", + "Content2Section1List": "Kommunikationspartner", + "Content2Section2": "Zwecke der Verarbeitung", + "Content2Section2List": "Kontaktanfragen und Kommunikation, Verwaltung und Beantwortung von Anfragen, Feedback, Bereitstellung unseres Onlineangebotes und Nutzerfreundlichkeit.", + "Content3Header0": "Maßgebliche Rechtsgrundlagen nach der DSGVO:", + "Content3Description0": "Im Folgenden erhalten Sie eine Übersicht der Rechtsgrundlagen der DSGVO, auf deren Basis wir personenbezogene Daten verarbeiten. Bitte nehmen Sie zur Kenntnis, dass neben den Regelungen der DSGVO nationale Datenschutzvorgaben in Ihrem bzw. unserem Wohn- oder Sitzland gelten können. Sollten ferner im Einzelfall speziellere Rechtsgrundlagen maßgeblich sein, teilen wir Ihnen diese in der Datenschutzerklärung mit.", + "Content3Header1": "Berechtigte Interessen (Art. 6 Abs. 1 S. 1 lit. f) DSGVO:", + "Content3Description1": "Die Verarbeitung ist zur Wahrung der berechtigten Interessen des Verantwortlichen oder eines Dritten erforderlich, sofern nicht die Interessen oder Grundrechte und Grundfreiheiten der betroffenen Person, die den Schutz personenbezogener Daten erfordern, überwiegen.", + "Content3Header2": "Nationale Datenschutzregelungen in Deutschland:", + "Content3Description2": "Zusätzlich zu den Datenschutzregelungen der DSGVO gelten nationale Regelungen zum Datenschutz in Deutschland. Hierzu gehört insbesondere das Gesetz zum Schutz vor Missbrauch personenbezogener Daten bei der Datenverarbeitung (Bundesdatenschutzgesetz - BDSG). Das BDSG enthält insbesondere Spezialregelungen zum Recht auf Auskunft, zum Recht auf Löschung, zum Widerspruchsrecht, zur Verarbeitung besonderer Kategorien personenbezogener Daten, zur Verarbeitung für andere Zwecke und zur Übermittlung sowie automatisierten Entscheidungsfindung im Einzelfall einschließlich Profiling. Ferner können Landesdatenschutzgesetze der einzelnen Bundesländer zur Anwendung gelangen.", + "Content4Description0": "Wir treffen nach Maßgabe der gesetzlichen Vorgaben unter Berücksichtigung des Stands der Technik, der Implementierungskosten und der Art, des Umfangs, der Umstände und der Zwecke der Verarbeitung sowie der unterschiedlichen Eintrittswahrscheinlichkeiten und des Ausmaßes der Bedrohung der Rechte und Freiheiten natürlicher Personen geeignete technische und organisatorische Maßnahmen, um ein dem Risiko angemessenes Schutzniveau zu gewährleisten.", + "Content4Description1": "Zu den Maßnahmen gehören insbesondere die Sicherung der Vertraulichkeit, Integrität und Verfügbarkeit von Daten durch Kontrolle des physischen und elektronischen Zugangs zu den Daten als auch des sie betreffenden Zugriffs, der Eingabe, der Weitergabe, der Sicherung der Verfügbarkeit und ihrer Trennung. Des Weiteren haben wir Verfahren eingerichtet, die eine Wahrnehmung von Betroffenenrechten, die Löschung von Daten und Reaktionen auf die Gefährdung der Daten gewährleisten. Ferner berücksichtigen wir den Schutz personenbezogener Daten bereits bei der Entwicklung bzw. Auswahl von Hardware, Software sowie Verfahren entsprechend dem Prinzip des Datenschutzes, durch Technikgestaltung und durch datenschutzfreundliche Voreinstellungen.", + "Content4Description2": "TLS/SSL-Verschlüsselung (https): Um die Daten der Benutzer, die über unsere Online-Dienste übertragen werden, zu schützen, verwenden wir TLS/SSL-Verschlüsselung. Secure Sockets Layer (SSL) ist die Standardtechnologie zur Sicherung von Internetverbindungen durch Verschlüsselung der zwischen einer Website oder App und einem Browser (oder zwischen zwei Servern) übertragenen Daten. Transport Layer Security (TLS) ist eine aktualisierte und sicherere Version von SSL. Hyper Text Transfer Protocol Secure (HTTPS) wird in der URL angezeigt, wenn eine Website durch ein SSL/TLS-Zertifikat gesichert ist.", + "Content5Description": "Die von uns verarbeiteten Daten werden nach Maßgabe der gesetzlichen Vorgaben gelöscht, sobald deren zur Verarbeitung erlaubten Einwilligungen widerrufen werden oder sonstige Erlaubnisse entfallen (z.B. wenn der Zweck der Verarbeitung dieser Daten entfallen ist oder sie für den Zweck nicht erforderlich sind). Sofern die Daten nicht gelöscht werden, weil sie für andere und gesetzlich zulässige Zwecke erforderlich sind, wird deren Verarbeitung auf diese Zwecke beschränkt. D.h., die Daten werden gesperrt und nicht für andere Zwecke verarbeitet. Das gilt z.B. für Daten, die aus handels- oder steuerrechtlichen Gründen aufbewahrt werden müssen oder deren Speicherung zur Geltendmachung, Ausübung oder Verteidigung von Rechtsansprüchen oder zum Schutz der Rechte einer anderen natürlichen oder juristischen Person erforderlich ist. Unsere Datenschutzhinweise können ferner weitere Angaben zu der Aufbewahrung und Löschung von Daten beinhalten, die für die jeweiligen Verarbeitungen vorrangig gelten.", + "Content6Description0": "Rechte der betroffenen Personen aus der DSGVO: Ihnen stehen als Betroffene nach der DSGVO verschiedene Rechte zu, die sich insbesondere aus Art. 15 bis 21 DSGVO ergeben:", + "Content6Description1": "Widerspruchsrecht: Sie haben das Recht, aus Gründen, die sich aus Ihrer besonderen Situation ergeben, jederzeit gegen die Verarbeitung der Sie betreffenden personenbezogenen Daten, die aufgrund von Art. 6 Abs. 1 lit. e oder f DSGVO erfolgt, Widerspruch einzulegen; dies gilt auch für ein auf diese Bestimmungen gestütztes Profiling. Werden die Sie betreffenden personenbezogenen Daten verarbeitet, um Direktwerbung zu betreiben, haben Sie das Recht, jederzeit Widerspruch gegen die Verarbeitung der Sie betreffenden personenbezogenen Daten zum Zwecke derartiger Werbung einzulegen; dies gilt auch für das Profiling, soweit es mit solcher Direktwerbung in Verbindung steht.", + "Content6Section0": "Widerrufsrecht bei Einwilligungen:", + "Content6Section0List": "Sie haben das Recht,erteilte Einwilligungen jederzeit zu widerrufen.", + "Content6Section1": "Auskunftsrecht:", + "Content6Section1List": "Sie haben das Recht, eine Bestätigung darüber zu verlangen, ob betreffende Daten verarbeitet werden und auf Auskunft über diese Daten sowie auf weitere Informationen und Kopie der Daten entsprechend den gesetzlichen Vorgaben.", + "Content6Section2": "Recht auf Berichtigung:", + "Content6Section2List": "Sie haben entsprechend den gesetzlichen Vorgaben das Recht, die Vervollständigung der Sie betreffenden Daten oder die Berichtigung der Sie betreffenden unrichtigen Daten zu verlangen.", + "Content6Section3": "Recht auf Löschung und Einschränkung der Verarbeitung:", + "Content6Section3List": "Sie haben nach Maßgabe der gesetzlichen Vorgaben das Recht, zu verlangen, dass Sie betreffende Daten unverzüglich gelöscht werden, bzw. alternativ nach Maßgabe der gesetzlichen Vorgaben eine Einschränkung der Verarbeitung der Daten zu verlangen.", + "Content6Section4": "Recht auf Datenübertragbarkeit:", + "Content6Section4List": "Sie haben das Recht, Sie betreffende Daten, die Sie uns bereitgestellt haben, nach Maßgabe der gesetzlichen Vorgaben in einem strukturierten, gängigen und maschinenlesbaren Format zu erhalten oder deren Übermittlung an einen anderen Verantwortlichen zu fordern.", + "Content6Section5": "Beschwerde bei Aufsichtsbehörde:", + "Content6Section5List": "Sie haben unbeschadet eines anderweitigen verwaltungsrechtlichen oder gerichtlichen Rechtsbehelfs das Recht auf Beschwerde bei einer Aufsichtsbehörde, insbesondere in dem Mitgliedstaat ihres gewöhnlichen Aufenthaltsorts, ihres Arbeitsplatzes oder des Orts des mutmaßlichen Verstoßes, wenn Sie der Ansicht sind, dass die Verarbeitung der Sie betreffenden personenbezogenen Daten gegen die Vorgaben der DSGVO verstößt.", + "Content7Description0": "Wir bitten Sie, sich regelmäßig über den Inhalt unserer Datenschutzerklärung zu informieren. Wir passen die Datenschutzerklärung an, sobald die Änderungen der von uns durchgeführten Datenverarbeitungen dies erforderlich machen. Wir informieren Sie, sobald durch die Änderungen eine Mitwirkungshandlung Ihrerseits (z.B. Einwilligung) oder eine sonstige individuelle Benachrichtigung erforderlich wird.", + "Content7Description1": "Sofern wir in dieser Datenschutzerklärung Adressen und Kontaktinformationen von Unternehmen und Organisationen angeben, bitten wir zu beachten, dass die Adressen sich über die Zeit ändern können und bitten die Angaben vor Kontaktaufnahme zu prüfen.", + "Content8Description0": "In diesem Abschnitt erhalten Sie eine Übersicht über die in dieser Datenschutzerklärung verwendeten Begrifflichkeiten. Soweit die Begrifflichkeiten gesetzlich definiert sind, gelten deren gesetzliche Definitionen. Die nachfolgenden Erläuterungen sollen dagegen vor allem dem Verständnis dienen.", + "Content8Section0": "Personenbezogene Daten:", + "Content8Section0List": "'Personenbezogene Daten' sind alle Informationen, die sich auf eine identifizierte oder identifizierbare natürliche Person (im Folgenden 'betroffene Person') beziehen; als identifizierbar wird eine natürliche Person angesehen, die direkt oder indirekt, insbesondere mittels Zuordnung zu einer Kennung wie einem Namen, zu einer Kennnummer, zu Standortdaten, zu einer Online-Kennung (z. B. Cookie) oder zu einem oder mehreren besonderen Merkmalen identifiziert werden kann, die Ausdruck der physischen, physiologischen, genetischen, psychischen, wirtschaftlichen, kulturellen oder sozialen Identität dieser natürlichen Person sind.", + "Content8Section1": "Verantwortlicher:", + "Content8Section1List": "Als 'Verantwortlicher' wird die natürliche oder juristische Person, Behörde, Einrichtung oder andere Stelle, die allein oder gemeinsam mit anderen über die Zwecke und Mittel der Verarbeitung von personenbezogenen Daten entscheidet, bezeichnet.", + "Content8Section2": "Verarbeitung", + "Content8Section2List": "'Verarbeitung' ist jeder mit oder ohne Hilfe automatisierter Verfahren ausgeführte Vorgang oder jede solche Vorgangsreihe im Zusammenhang mit personenbezogenen Daten. Der Begriff reicht weit und umfasst praktisch jeden Umgang mit Daten, sei es das Erheben, das Auswerten, das Speichern, das Übermitteln oder das Löschen.", + "sourceText": "Erstellt mit kostenlosem Datenschutz-Generator.de von Dr. Thomas Schwenke" + } +} diff --git a/src/assets/i18n/en.json b/src/assets/i18n/en.json new file mode 100644 index 0000000..b4024ae --- /dev/null +++ b/src/assets/i18n/en.json @@ -0,0 +1,292 @@ +{ + "login": { + "header": "Login", + "infoText": "We recommend using the email address you use at work.", + "inputField": "example.name@email.com", + "inputField2": "Password", + "midText": "Forgot password?", + "midSeperator": "OR", + "googleBtn": "Sign in with Google", + "BtnLeft": "Login", + "BtnRight": "Guest Login", + "topText": "New to DABubble?", + "topText2": "Create account", + "errorText": "*Email is required.", + "errorText2": "*Password is required." + }, + + "createAccount": { + "header": "Create Account", + "infoText": "With your name and email address, you have your new DABubble account.", + "inputField": "First and Last Name", + "inputField2": "example.name@email.com", + "inputField3": "Password", + "midText": "I agree to the", + "midText2": "Privacy Policy", + "midText3": ".", + "Btn": "Continue", + "errorText": "*Name is required.", + "errorText2": "*Email is required.", + "errorText3": "*Please enter a password (at least 6 characters)." + }, + + "chooseAvatar": { + "header": "Choose your Avatar", + "avatarInfo": "Choose from the list", + "ownAvatar": "use own picture", + "avatarBtn": "Upload file", + "Btn": "Continue" + }, + + "passwordForget": { + "header": "Reset Password", + "infoText": "Please enter your email address.", + "inputfield": "example.name@email.com", + "infoTextBottom": "We will send you an email to change your password.", + "Btn": "Send Email", + "errorText": "*Email is required." + }, + + "passwordReset": { + "header": "Reset Password", + "inputfield": "New Password", + "inputfield2": "Confirm New Password", + "Btn": "Change Password", + "errorText": "*Please enter a new password (at least 6 characters).", + "errorText2": "*The passwords do not match." + }, + + "channel-informations": { + "header": "Channel Name", + "channelInfo": "Description", + "channelInfo2": "no description.", + "channelMadeBy": "Created by", + "channelErrorText": "*Only the creator can edit the channel", + "members": "Members", + "leave": "Leave Channel" + }, + + "channel-msg-box": { + "text": "The maximum number of files is 1.", + "placeholder": "Enter your message" + }, + + "info": { + "channelCreate": "The channel was created by", + "channelCreate2": "on", + "channelCreate3": ". This is the beginning of the channel", + "notice": "This space is just for you. Make notes, list your to-dos, or keep links and files handy. You can also talk things over with yourself here.", + "talkTo": "This conversation is just between", + "talkTo2": "and you." + }, + + "show-channel-member": { + "header": "Channel Members", + "addMember": "Add Members", + "result": "No results", + "add": "add" + }, + + "open-send-prv-message": { + "profil": "Profile", + "aktiv": "Active", + "offline": "Offline", + "adress": "Email Address", + "message": "Message" + }, + + "main-chat": { + "message": "New Message", + "placeholder": "To: #channel or @someone" + }, + + "edit-msg": { + "save": "Save", + "cancel": "Cancel" + }, + + "options-menu": { + "delete": "Delete message", + "edit": "Edit message" + }, + + "reaction-emojis": { + "react": "have reacted.", + "react2": "has reacted." + }, + + "single-chat": { + "edit": "(edited)", + "answer": "Replys", + "answer2": "Reply", + "answer3": "Last reply:", + "answer4": "Reply..." + }, + + "secondary-chat": { + "thread": "Thread", + "answer": "Reply" + }, + + "add-new-channel": { + "header": "Create Channel", + "info": "Channels serve your team for communication. They should be topic-related, e.g., #marketing.", + "header2": "Channel Name", + "required": "(required)", + "placeholder": "(at least 6 characters)", + "placeholder2": "Write here what topics can be discussed in the channel.", + "description": "Description", + "optional": "(optional)", + "create": "Create", + "addPeople": "Add people", + "addAll": "Add all members from", + "devspace": "Devspace", + "add": "Add specific people", + "warning": "This channel already exists" + }, + + "sidebar-channels": { + "channel": "Channels", + "addChannel": "Add Channel" + }, + + "sidebar-direct-messages": { + "messages": "Direct messages", + "members": "List of members" + }, + + "sidebar-direct-messages-user": { + "you": "You" + }, + + "sidebar-toggle": { + "openWorkspace": "Open Menu" + }, + + "edit-user-details": { + "profile": "Edit Your Profile", + "fullName": "Full Name", + "placeholder": "Your name (min. 3 letters)", + "placeholder2": "Your email address", + "email": "Email Address", + "cancel": "Cancel", + "save": "Save", + "errorMessage": "* Changes to the guest profile are not possible." + }, + + "edit-user": { + "edit": "edit", + "email": "Email Address" + }, + + "search-bar": { + "placeholder": "Search in Devspace", + "errorMessage": "No match found" + }, + + "search-bar-header": { + "user": "Users", + "channels": "Channels", + "thread": "Threads" + }, + + "footer": { + "privatePolice": "Privacy Policy", + "imprint": "Legal Notice" + }, + + "start-header": { + "new": "New to DABubble?", + "create": "Create Account" + }, + + "login-header": { + "profil": "Profile", + "logout": "Log out" + }, + + "user": { + "email": "Email Address", + "message": "Direct Messages" + }, + + "imprint": { + "headline": "Imprint", + "tmg": "Information according to §5 TMG", + "contact": "Contact", + "tel": "Telephone", + "mail": "Mail", + "disclaimer": "Disclaimer", + "liabilityContentHeadline": "Liability for content", + "liabilityContentDescription": "The contents of our pages were created with the greatest care. However, we cannot assume any liability for the accuracy, completeness and topicality of the content. As a service provider, we are responsible for our own content on these pages in accordance with § 7 para. 1 TMG (German Telemedia Act) and general laws. According to §§ 8 to 10 TMG, however, we as a service provider are not obliged to monitor transmitted or stored third-party information or to investigate circumstances that indicate illegal activity. Obligations to remove or block the use of information in accordance with general legislation remain unaffected by this. However, liability in this respect is only possible from the time of knowledge of a specific infringement. As soon as we become aware of such infringements, we will remove this content immediately.", + "liabilityLinksHeadline": "Liability for links", + "liabilityLinksDescription": "Our website contains links to external third-party websites over whose content we have no influence. Therefore, we cannot accept any liability for this third-party content. The respective provider or operator of the pages is always responsible for the content of the linked pages. The linked pages were checked for possible legal violations at the time of linking. Illegal content was not recognizable at the time of linking. However, permanent monitoring of the content of the linked pages is not reasonable without concrete evidence of an infringement. If we become aware of any legal infringements, we will remove such links immediately.", + "copyrightHeadline": "Copyright", + "copyrightDescription": "The content and works created by the site operators on these pages are subject to German copyright law. Duplication, processing, distribution and any form of commercialization of such material beyond the scope of the copyright law shall require the prior written consent of its respective author or creator. Downloads and copies of this site are only permitted for private, non-commercial use. Insofar as the content on this site was not created by the operator, the copyrights of third parties are respected. In particular, third-party content is identified as such. Should you nevertheless become aware of a copyright infringement, please inform us accordingly. If we become aware of any infringements, we will remove such content immediately.", + "dataProtectionHeadline": "Data protection", + "dataProtectionDescription": "The use of our website is generally possible without providing personal data. Insofar as personal data (e.g. name, address or e-mail addresses) is collected on our pages, this is always done on a voluntary basis as far as possible. This data will not be passed on to third parties without your express consent. We would like to point out that data transmission over the Internet (e.g. when communicating by e-mail) may be subject to security vulnerabilities. Complete protection of data against access by third parties is not possible, and we hereby expressly prohibit the use of contact data published in the context of the legal notice obligation by third parties for sending unsolicited advertising and information material. The operators of this website expressly reserve the right to take legal action in the event of the unsolicited sending of advertising information, such as spam e-mails.", + "sourceText0": "Imprint of the", + "sourceLink0": "imprint generator", + "sourceText1": "of the", + "sourceLink1": "law firm Hasselbach, lawyers for labor law and family law" + }, + + "privacy-policy": { + "headline": "Privacy policy", + "preambleHeadline": "Preamble", + "preambleDescription": "With the following privacy policy, we would like to inform you about which types of your personal data (hereinafter also referred to as 'data') we process, for what purposes and to what extent. The privacy policy applies to all processing of personal data carried out by us, both in the context of the provision of our services and in particular on our websites, in mobile applications and within external online presences, such as our social media profiles (hereinafter collectively referred to as 'online offer').", + "ContentHeadline": "Table of contents", + "Content0": "Preamble", + "Content1": "Person responsible", + "Content2": "Overview of processing", + "Content3": "Relevant legal bases", + "Content4": "Security measures", + "Content5": "Deletion of data", + "Content6": "Rights of the data subjects", + "Content7": "Amendment and updating of the privacy policy", + "Content8": "Definitions of terms", + "tel": "Telephone", + "mail": "Mail", + "Content2Description": "The following overview summarizes the types of data processed and the purposes of their processing and refers to the data subjects.", + "Content2Section0": "Types of data processed", + "Content2Section0List": "Contact data, content data, usage data, metadata, communication data, process data.", + "Content2Section1": "Categories of affected persons", + "Content2Section1List": "Communication partner", + "Content2Section2": "Purposes of the processing", + "Content2Section2List": "Contact requests and communication, managing and responding to requests, feedback, providing our online services and user-friendliness.", + "Content3Header0": "Relevant legal bases according to the GDPR:", + "Content3Description0": "Below you will find an overview of the legal bases of the GDPR on the basis of which we process personal data. Please note that in addition to the provisions of the GDPR, national data protection regulations may apply in your or our country of residence or domicile. Should more specific legal bases also apply in individual cases, we will inform you of these in the privacy policy.", + "Content3Header1": "Legitimate interests (Art. 6 para. 1 sentence 1 lit. f) GDPR:", + "Content3Description1": "Processing is necessary for the purposes of the legitimate interests pursued by the controller or by a third party, except where such interests are overridden by the interests or fundamental rights and freedoms of the data subject which require protection of personal data.", + "Content3Header2": "National data protection regulations in Germany:", + "Content3Description2": "In addition to the data protection regulations of the GDPR, national data protection regulations apply in Germany. These include, in particular, the Act on the Protection against Misuse of Personal Data in Data Processing (Federal Data Protection Act - BDSG). In particular, the BDSG contains special regulations on the right to information, the right to erasure, the right to object, the processing of special categories of personal data, processing for other purposes and transmission as well as automated decision-making in individual cases, including profiling. The data protection laws of the individual federal states may also apply.", + "Content4Description0": "We take appropriate technical and organizational measures in accordance with the legal requirements, taking into account the state of the art, the implementation costs and the nature, scope, circumstances and purposes of the processing as well as the different probabilities of occurrence and the extent of the threat to the rights and freedoms of natural persons, in order to ensure a level of protection appropriate to the risk.", + "Content4Description1": "The measures include, in particular, safeguarding the confidentiality, integrity and availability of data by controlling physical and electronic access to the data as well as the access, input, disclosure, safeguarding of availability and its separation. Furthermore, we have established procedures that ensure the exercise of data subject rights, the deletion of data and responses to data threats. Furthermore, we already take the protection of personal data into account during the development or selection of hardware, software and processes in accordance with the principle of data protection, through technology design and through data protection-friendly default settings.", + "Content4Description2": "TLS/SSL encryption (https): To protect user data transmitted via our online services, we use TLS/SSL encryption. Secure Sockets Layer (SSL) is the standard technology for securing Internet connections by encrypting the data transmitted between a website or app and a browser (or between two servers). Transport Layer Security (TLS) is an updated and more secure version of SSL. Hyper Text Transfer Protocol Secure (HTTPS) is displayed in the URL when a website is secured by an SSL/TLS certificate.", + "Content5Description": "The data processed by us will be deleted in accordance with the legal requirements as soon as the consent given for processing is revoked or other permissions no longer apply (e.g. if the purpose for processing this data no longer applies or it is not required for the purpose). If the data is not deleted because it is required for other and legally permissible purposes, its processing is restricted to these purposes. This means that the data is blocked and not processed for other purposes. This applies, for example, to data that must be retained for commercial or tax law reasons or whose storage is necessary for the assertion, exercise or defense of legal claims or to protect the rights of another natural or legal person. Our data protection notices may also contain further information on the retention and deletion of data, which take priority for the respective processing operations.", + "Content6Description0": "Rights of data subjects under the GDPR: As a data subject, you are entitled to various rights under the GDPR, which arise in particular from Art. 15 to 21 GDPR:", + "Content6Description1": "Right to object: You have the right to object, on grounds relating to your particular situation, at any time to processing of personal data concerning you which is based on point (e) or (f) of Article 6(1) GDPR, including profiling based on those provisions. If the personal data concerning you are processed for direct marketing purposes, you have the right to object at any time to the processing of personal data concerning you for such marketing, which includes profiling to the extent that it is related to such direct marketing.", + "Content6Section0": "Right to withdraw consent:", + "Content6Section0List": "You have the right to withdraw your consent at any time.", + "Content6Section1": "Right to information:", + "Content6Section1List": "You have the right to request confirmation as to whether the data in question is being processed and to request information about this data as well as further information and a copy of the data in accordance with the legal requirements.", + "Content6Section2": "Right to rectification:", + "Content6Section2List": "In accordance with the legal requirements, you have the right to request the completion of data concerning you or the correction of incorrect data concerning you.", + "Content6Section3": "Right to erasure and restriction of processing:", + "Content6Section3List": "In accordance with the legal requirements, you have the right to demand that data concerning you be deleted immediately or, alternatively, to demand that the processing of the data be restricted in accordance with the legal requirements.", + "Content6Section4": "Right to data portability:", + "Content6Section4List": "You have the right to receive the data concerning you, which you have provided to us, in a structured, commonly used and machine-readable format in accordance with the legal requirements or to request its transmission to another controller.", + "Content6Section5": "Complaint to the supervisory authority:", + "Content6Section6List": "Without prejudice to any other administrative or judicial remedy, you have the right to lodge a complaint with a supervisory authority, in particular in the Member State of your habitual residence, place of work or place of the alleged infringement if you consider that the processing of personal data relating to you infringes the provisions of the GDPR.", + "Content7Description0": "We ask you to inform yourself regularly about the content of our privacy policy. We will adapt the privacy policy as soon as changes to the data processing carried out by us make this necessary. We will inform you as soon as the changes require an act of cooperation on your part (e.g. consent) or other individual notification.", + "Content7Description1": "If we provide addresses and contact information of companies and organizations in this privacy policy, please note that the addresses may change over time and please check the information before contacting us.", + "Content8Description0": "This section provides you with an overview of the terms used in this privacy policy. Insofar as the terms are defined by law, their legal definitions apply. The following explanations, on the other hand, are primarily intended to aid understanding.", + "Content8Section0": "Personal data:", + "Content8Section0List": "'Personal data' means any information relating to an identified or identifiable natural person (hereinafter referred to as 'data subject'); an identifiable natural person is one who can be identified, directly or indirectly, in particular by reference to an identifier such as a name, an identification number, location data, an online identifier (e.g. a cookie) or to one or more factors specific to the physical, physiological, genetic, mental, economic, cultural or social identity of that natural person.", + "Content8Section1": "Responsible person:", + "Content8Section1List": "The 'controller' is the natural or legal person, public authority, agency or other body which, alone or jointly with others, determines the purposes and means of the processing of personal data.", + "Content8Section2": "Processing", + "Content8Section2List": "'Processing' means any operation or set of operations which is performed on personal data, whether or not by automated means. The term is broad and covers practically every handling of data, be it collection, analysis, storage, transmission or deletion.", + "sourceText": "Created with free Datenschutz-Generator.de by Dr. Thomas Schwenke" + } +} diff --git a/src/assets/img/add-reaction.svg b/src/assets/img/add-reaction.svg new file mode 100644 index 0000000..2bdb672 --- /dev/null +++ b/src/assets/img/add-reaction.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/assets/img/add.svg b/src/assets/img/add.svg new file mode 100644 index 0000000..3b0f99c --- /dev/null +++ b/src/assets/img/add.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/img/addIcon.svg b/src/assets/img/addIcon.svg new file mode 100644 index 0000000..0f84688 --- /dev/null +++ b/src/assets/img/addIcon.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/img/addPerson.svg b/src/assets/img/addPerson.svg new file mode 100644 index 0000000..d929391 --- /dev/null +++ b/src/assets/img/addPerson.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/img/answer.svg b/src/assets/img/answer.svg new file mode 100644 index 0000000..958f90b --- /dev/null +++ b/src/assets/img/answer.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/img/arrowLeft.png b/src/assets/img/arrowLeft.png new file mode 100644 index 0000000000000000000000000000000000000000..28b2a923b3fb58b22ae131b10b826219f68c676e GIT binary patch literal 173 zcmeAS@N?(olHy`uVBq!ia0vp^>_E)J!3HGPO_E)J!3HGPOa~60+7Bet#3xhBt!>l + + diff --git a/src/assets/img/attachments/doc.png b/src/assets/img/attachments/doc.png new file mode 100644 index 0000000000000000000000000000000000000000..4c2ef879232ef9ffd6c2f1618474e81fe13d2932 GIT binary patch literal 24936 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 BI+y?e literal 0 HcmV?d00001 diff --git a/src/assets/img/attachments/txt.png b/src/assets/img/attachments/txt.png new file mode 100644 index 0000000000000000000000000000000000000000..788429c4736a66a58121b296ca0d22f5c87d6654 GIT binary patch literal 24384 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 TiTYk$0Y17~_cSZjZ9@MC`_N|8 literal 0 HcmV?d00001 diff --git a/src/assets/img/charater1.svg b/src/assets/img/charater1.svg new file mode 100644 index 0000000..3b12de3 --- /dev/null +++ b/src/assets/img/charater1.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/src/assets/img/clap-hands.svg b/src/assets/img/clap-hands.svg new file mode 100644 index 0000000..8f647e8 --- /dev/null +++ b/src/assets/img/clap-hands.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/src/assets/img/closeIcon.svg b/src/assets/img/closeIcon.svg new file mode 100644 index 0000000..8ddba0c --- /dev/null +++ b/src/assets/img/closeIcon.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/img/documentIcon.svg b/src/assets/img/documentIcon.svg new file mode 100644 index 0000000..309a4f5 --- /dev/null +++ b/src/assets/img/documentIcon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/img/hashtag.svg b/src/assets/img/hashtag.svg new file mode 100644 index 0000000..933d9a6 --- /dev/null +++ b/src/assets/img/hashtag.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/img/home-icon.svg b/src/assets/img/home-icon.svg new file mode 100644 index 0000000..4413eb3 --- /dev/null +++ b/src/assets/img/home-icon.svg @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/img/imgIcon.svg b/src/assets/img/imgIcon.svg new file mode 100644 index 0000000..0e7c11d --- /dev/null +++ b/src/assets/img/imgIcon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/img/keyboardArrowDown.svg b/src/assets/img/keyboardArrowDown.svg new file mode 100644 index 0000000..16e6757 --- /dev/null +++ b/src/assets/img/keyboardArrowDown.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/img/language.svg b/src/assets/img/language.svg new file mode 100644 index 0000000..3af2272 --- /dev/null +++ b/src/assets/img/language.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/img/login/arrow-back.png b/src/assets/img/login/arrow-back.png new file mode 100644 index 0000000000000000000000000000000000000000..04f4939834feb57fda6b164a1153b78efbe8a534 GIT binary patch literal 188 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjoCO|{#S9GG!XV7ZFl!D-1!HlL zyA#8@b22Z19F}xPUq=Rpjs4tz5?O)#Ku;IPkP61PQ+D$*C~&yw`yEQ_d(zRjNJQkw zrGh%4xT1yC;u;K-<_q|4_MBLLc7xEYJ<1i#o<9pM=hUc|P8E%DaIg!UwkKZb- + + + + + + + diff --git a/src/assets/img/login/box-checked-hover.png b/src/assets/img/login/box-checked-hover.png new file mode 100644 index 0000000000000000000000000000000000000000..4b6e42680805d1b6ce4448113c6ff35dbb7f562b GIT binary patch literal 1914 zcmbu9e>~H99LK-2%|tHLNV;}P$&Z?%(Cu1MM6vv8er0~OVwL<@CQMP2T+X@@qGB*F7Hh*FCQH`|HseyT5MB)-vZJm|6tJZHY+-PKMv2DAhmGutWJ$vo!_c=JaxqBSKdwO{X z1s@?EJr)ug8AU!FO^G>^bp8S@`C`hYv}@@ZnOWJ_a|(-!OKz2x-M;gns=DT3ZC!l> zi{0Gvto4^R4v*g@=zj51D3bIKycryN`)>HXY;1gD5}ca;IJ3wF0ia)6_8IJ7T#6<@ zlwdF@46(=sQHoYPs3r`qzeQQg#sv`&zI^T0b1Ex#UoEI?TC&dERf-IZ=v370|BLJk*gsq%U?~)$7#>s;zyb@U%utjl39Oa_v}ztUm@71QoX60J? zarB)gGF)rs^p)eAk1uPEY5exG+OC9Tyo=aNEEL;^Me9GVs-uB=sXw7jb2wJyWg|G% zIa6usg1)wSORr8iRlkenF8c-pNgwnD>PS6&#zKYdMKRWluH~Ass*B{3;kd<}#Lr#A zFFCVK5Q9@6`s(ud;J9=6|eh`HiJT;jYOknEYj z2@}AA`3kJ0VjDqd4p#B7M|&#Q-#^D8Gtz~P1WuH7PB6!(F+jkai~^W-r9Tm zQh}dAX297vYn9F-yUQy(3kSSQ9A4x)a)k%o^-XckKG%oxMQNPzeSN-ph>_|$eT|jD zjrYqUa6OM6z80r=x8tMR`}20}v>;3yXQlc)g|ZnkctT&6h)=PJ^KVF{c+DNchUg^~ zmZs=9;)D>(#O zdbjl;T~{?5$FNr$U9)_|ECb05S!?gA%mnyj2P8#w3A>=`Sh`#&NrmL1d!y)^)ssSI`vtzH` zq$JVJ($4!S=h<9JzfT@}?k>~K)GCfK!n?BjtOrwn9gm*R#Vx~cIyDvPdw@A8u83W| zy0NDM74JT4@ur3(&M&4wn;Nie=CpBi(qpJ3_=%HR6G6KFi5jaxDO6|5`&OaFYXnGt z$hYW>x$W1sX>hVvI9fRV$326P(yXW-BLw3Z+uR_lYwt>K%9KOjVW`m)WvxTPB(`KY zz>K>*n?k}PQ=(3Fty8twIO|yTro`D;<3eF3ZNkVdSeXcWO-Q>4ei zN1S#X{UbJd)MgeV86V!b;*yWo|4(i8h*r)-j{%^I2{(_3#Cc8>e7(q!DB|>b+pI z-W3Af*WT)r{kqFb>~a_FXCgZ2ZnzqE`e-IGUv#x&YrVh1e(ya(f)1^1iw}75Hu*mO z#3PgK^~Wc&whoRnO%~MP%=R%k(04=ZZ?)xj#iqTzwSC}pWDj!UrW~-P`kf3bu0@X% zSkDQKpmjwHzUF}%_%JB46MN)?V%w^)HF=C#FKYK0#_zLXcX}4Mm2+@u>4iopx;Zi+ z(x1AnNv1K96UwPXx7TmJUShsbLyFTUaOk&DE*NmD3$lccFEQ^Sj7 zvkZ)F7HUYyKsB!NyySU-?IvkC+uo}#_Xb5?2V%b41jtTotF8mXB18fig literal 0 HcmV?d00001 diff --git a/src/assets/img/login/box-checked.png b/src/assets/img/login/box-checked.png new file mode 100644 index 0000000000000000000000000000000000000000..a3db82365bba8235b536851113152b3b228aa993 GIT binary patch literal 394 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjoCO|{#S9GG!XV7ZFl!D-1!HlL zyA#8@b22Z19F}xPUq=Rpjs4tz5?O(A@}4e^Ar*{or=0CQWFXLbU&UiLdsvj!f|lGy zuCS5`LJwM+Sp0Ul%vr#^K-g+Q>lA@bkAeoCGKR!DrW*%XKYCi;*m&=APdeL=0_IEN zxf81rHJx1d@4 zb5XO9+yU`SX378hb3$t+!X_=3`Z2dsVYSl=t3S7%{aw@;+ErB8bV6LO^6v&A@wvJ^ z3sl8Ir-vJ>Nx3KPj8s{7{f{b_@{eOii3LiRFJzQon%Mgzv^l^o%I)>6H@!1DZTHVU z=W}$ultxJ2cePKyjYaooE|_hQn5DID$7-MQ(4c14d^4?-V7086_sbTku2SHWah)J& l?$1BNVO4&N`T=%fGoFBwCG}prw*iBW!PC{xWt~$(697@3muvt4 literal 0 HcmV?d00001 diff --git a/src/assets/img/login/box-hover.png b/src/assets/img/login/box-hover.png new file mode 100644 index 0000000000000000000000000000000000000000..54805829b525434342629f7c1c1deb4f602ed638 GIT binary patch literal 543 zcmV+)0^t3LP)Ad<%n5Xmiri<1KJ&w-cM-f1ZEIIFlJLWQ2rvAJWxqn+ckmgiSOx7`-RA-B%@ zNb&l7)faVqEN>Kti5rT7Ps8HnMY<&K7&QbwXS;LFBUHWwSJ@>zJDT zEX>dG{~I1y=27v90gP%@oP|ZWy4C__qil5?Zp)tmqJb8du&1tQj%%iv8BFrkg?-Jq h+-%}%dz+>nkS{sky=(fm7+L@T002ovPDHLkV1gOV@B9D& literal 0 HcmV?d00001 diff --git a/src/assets/img/login/box.png b/src/assets/img/login/box.png new file mode 100644 index 0000000000000000000000000000000000000000..490ee18511ad710e18b474eb9f5946bbe222b423 GIT binary patch literal 1425 zcmex=Jq?U}9uuW@2GxWo2Ojs;&jfGq4D< z3Mm>ovIz$!vMUve7&T5@$f4}C@t|nX#SbdRNkvVZTw>x9l2WQ_>Kd9_CZ=ZQ7M51d zF0O9w9-dyoA)#U65s^{JDXD4c8JStdC8cHM6_r)ZEv;?s9i3g1CQq3GGAU*RJ2VdF$b$$4{OP zfBE|D`;VW$K>lK6V1@@7#A9gw0tNyj6AKG73p>bPj7;S~%q+;ls%Xe2Fc4veo0gec^+1JRhF_Q#_}CL|@=zP1c9?z2R&L1~!s^ zTQ&+F(dm+WeDu+OhV7cWiWghuEfsx}b$PDl<<^&1dn3L2Cw3i8-nUmqjLX6=e^qT( z@zLtMxcHnGpN`+yy=?BhmCI&djgG4SxLN<##`r(yzi$6ito}E?{?Buud9D8$eog+* z@bqQzgZszgZ>j&2QV;z*?>|F^t@?wFSNRX-|A^V8w);cwo}yhfRaHNp-9IRQ(`r@4 zt*{-lK4rJ<+H*IPMc}qG>yFQPPj*k#+4$HF;s@a)_WXr4SsPaO)?YbO#@utw<)hFM zo33S*U-zhNvd}76%#}4&I&5W7X?oD&CrhOQr>3`pe4xW;2JwOLq2C}MtoU^Lw)M8V z_c~Q3UA=p2{+}nO|Gf$S&rtn0_dkQh$^Q(M_y03A{@DMl{y#%W{olKGuht*pPxul3 zuPF6DLz(t}hQ0sxm;Yy&lk%To&-?!j2mXBg&j3@aSCjI?^tWsMVb{#~E$VN6uC5WY zTKGfvKLb~G^o4y!`hDU4{r>SXcPj4xj`pf&Idok(&bQ#&wCcR)P0|?&JM4Tf-*x*| z@gZIENAZ6Kf#>26pLay~nMQ;j+y8nVyZpg^rHalZIahz>U(56?pIo&FY&8wr`r`6R ztH~>Ui!b$RYMmEtJziU7aYtmsockfa);#R`c4yDNo7bN8Zw%l2W^1O(yuM$-{~3B` z)?e)cIeP8>$209;{r=DJ++O^T{(pum^ZzsGd(UUv$NTT1{fCQI+uySPcFNk%+P2D$ zTmRr*ZkHdX{~0(>XMW0j`*_BloL}qK0=av4-EpquJ#;=}fAX$*+%wd>&Av^FvYEc) z<9w(uI3K=mpW$a(5q@la&&MC{jQ<^q=y)XNYSU-oqyA0S-LE9w_wt&*TQ&UVJhTp3 pEw!;%y!FsyV6^3#MSv1sm;fZ&Ru_BU*1q>W%4}A)Yp%opn*gWtZLI(R literal 0 HcmV?d00001 diff --git a/src/assets/img/login/close-eye.svg b/src/assets/img/login/close-eye.svg new file mode 100644 index 0000000..d4a6ec4 --- /dev/null +++ b/src/assets/img/login/close-eye.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/img/login/email-send-btn.svg b/src/assets/img/login/email-send-btn.svg new file mode 100644 index 0000000..3df9c32 --- /dev/null +++ b/src/assets/img/login/email-send-btn.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/img/login/google.svg b/src/assets/img/login/google.svg new file mode 100644 index 0000000..6b8522d --- /dev/null +++ b/src/assets/img/login/google.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/assets/img/login/lock.png b/src/assets/img/login/lock.png new file mode 100644 index 0000000000000000000000000000000000000000..07ce7fbeceb78e5817cc1ec4500940b9fb91d32d GIT binary patch literal 400 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjoCO|{#S9GG!XV7ZFl!D-1!HlL zyA#8@b22Z19F}xPUq=Rpjs4tz5?O(As-7;6Ar*{wLrx1e83^26VSK>XdI1O51{UiJ z%5$!8Ent4kxg(K%nggSVBWDQ1JEO)#1t+G%j`w{$($eiKf15F^;aT?RN#(tjt5#{t z^&gsIbZn9VPkivk+nVgxOPTLD#grZQc|Q5Eh0f_sB|3G+6aO^L_D@eKF!ufIz@1+& zu4lJV`t-);!a1{_6w26Jm-Tg?{3o!s`mhX}LRDVmwFTGP5>;a7?_|v?IL9q|`wf$~ zfkd#-w5o2WcaHp)$5{SeoND+XT}AyyYUHPVfo85|wTm=@s# + + + + + + + + + + + + + + + + + + diff --git a/src/assets/img/login/logo.png b/src/assets/img/login/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..286c45a9bf8f284692d142b774643b91aa338777 GIT binary patch literal 3461 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/img/login/mail.png b/src/assets/img/login/mail.png new file mode 100644 index 0000000000000000000000000000000000000000..6a68e5d89ef1bd0c8032c932fd4ce52b66460047 GIT binary patch literal 419 zcmV;U0bKrxP)9puOf_Kji?ib!xmq~yRS zSvDH`&GUE!(af{4+C>yapH0)GmSw%sG)ibBS(bhChv)@X4-jYEx~^6GVfO=i-eP>^ zd0x^DpaL$Y4Tj%0DhBp)seXeXkYot&+WBGZANO zGDP2IK{sM_gDK1jM(G}zTaW)C=>3MKQ?`rl1`uEN1NWkhCN%Rh`~%45bcZrAX-fbA N002ovPDHLkV1mVet2qDw literal 0 HcmV?d00001 diff --git a/src/assets/img/login/open-eye.svg b/src/assets/img/login/open-eye.svg new file mode 100644 index 0000000..d136657 --- /dev/null +++ b/src/assets/img/login/open-eye.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/img/login/person-filled.png b/src/assets/img/login/person-filled.png new file mode 100644 index 0000000000000000000000000000000000000000..d96bde8707ac586104435624e15a3a7623863b24 GIT binary patch literal 447 zcmV;w0YLtVP)^tVl;I z(Iy~JAWvP*(Ud}*!ixnd+LIKYx=m(>I;1$&V8r`RwIlU#Gzmhhk*0LcL^ z0_hg-QF0=zjcj+?eKi4)$Ro#C#~`1A^2mvHS(S)2=ifq7tw`3n{GdO<#W{fH5h{J* z-|}n7PVyYsuzp7;-Bk%d9K*fALUIGkXsW8(&o@>J7WKF%+MV-hcDq|nr)7R#%llo002ovPDHLkV1fjtxHA9% literal 0 HcmV?d00001 diff --git a/src/assets/img/mail-icon.svg b/src/assets/img/mail-icon.svg new file mode 100644 index 0000000..7190a58 --- /dev/null +++ b/src/assets/img/mail-icon.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/assets/img/mail-iconBlack.svg b/src/assets/img/mail-iconBlack.svg new file mode 100644 index 0000000..d614709 --- /dev/null +++ b/src/assets/img/mail-iconBlack.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/img/messageIcon.svg b/src/assets/img/messageIcon.svg new file mode 100644 index 0000000..07f2128 --- /dev/null +++ b/src/assets/img/messageIcon.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/img/more-vertical.svg b/src/assets/img/more-vertical.svg new file mode 100644 index 0000000..17e9933 --- /dev/null +++ b/src/assets/img/more-vertical.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/img/mp3Icon.svg b/src/assets/img/mp3Icon.svg new file mode 100644 index 0000000..b10ad19 --- /dev/null +++ b/src/assets/img/mp3Icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/img/offlineRing.svg b/src/assets/img/offlineRing.svg new file mode 100644 index 0000000..a2a61ea --- /dev/null +++ b/src/assets/img/offlineRing.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/img/okay.svg b/src/assets/img/okay.svg new file mode 100644 index 0000000..ca62613 --- /dev/null +++ b/src/assets/img/okay.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/img/onlineRing.svg b/src/assets/img/onlineRing.svg new file mode 100644 index 0000000..ec72154 --- /dev/null +++ b/src/assets/img/onlineRing.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/img/pdfIcon.svg b/src/assets/img/pdfIcon.svg new file mode 100644 index 0000000..5217155 --- /dev/null +++ b/src/assets/img/pdfIcon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/img/pencil.svg b/src/assets/img/pencil.svg new file mode 100644 index 0000000..9561134 --- /dev/null +++ b/src/assets/img/pencil.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/img/personCircle.svg b/src/assets/img/personCircle.svg new file mode 100644 index 0000000..cda6c9f --- /dev/null +++ b/src/assets/img/personCircle.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/img/radioButtonChecked.svg b/src/assets/img/radioButtonChecked.svg new file mode 100644 index 0000000..559f65a --- /dev/null +++ b/src/assets/img/radioButtonChecked.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/assets/img/radioButtonUnchecked.svg b/src/assets/img/radioButtonUnchecked.svg new file mode 100644 index 0000000..e05a58e --- /dev/null +++ b/src/assets/img/radioButtonUnchecked.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/img/save.svg b/src/assets/img/save.svg new file mode 100644 index 0000000..65c1201 --- /dev/null +++ b/src/assets/img/save.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/img/search-icon.svg b/src/assets/img/search-icon.svg new file mode 100644 index 0000000..cf42f23 --- /dev/null +++ b/src/assets/img/search-icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/img/sendIcon.svg b/src/assets/img/sendIcon.svg new file mode 100644 index 0000000..33165bb --- /dev/null +++ b/src/assets/img/sendIcon.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/img/sidebar/account-circle.svg b/src/assets/img/sidebar/account-circle.svg new file mode 100644 index 0000000..5ce57bd --- /dev/null +++ b/src/assets/img/sidebar/account-circle.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/img/sidebar/add-circle.svg b/src/assets/img/sidebar/add-circle.svg new file mode 100644 index 0000000..3026a4b --- /dev/null +++ b/src/assets/img/sidebar/add-circle.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/img/sidebar/arrow-drop-down.svg b/src/assets/img/sidebar/arrow-drop-down.svg new file mode 100644 index 0000000..d1183f1 --- /dev/null +++ b/src/assets/img/sidebar/arrow-drop-down.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/img/sidebar/arrow_right.png b/src/assets/img/sidebar/arrow_right.png new file mode 100644 index 0000000000000000000000000000000000000000..eb0d33998e14413455aacca1160a0229d35b4786 GIT binary patch literal 208 zcmeAS@N?(olHy`uVBq!ia0vp^>_E)L!3HEN&baUbDaPU;cPEB*=VV?2IV|apzK#qG z8~eHcB(eheoCO|{#S9GG!XV7ZFl&wkP%zcg#W6%9I5{mLL4e^=i9#Lc5%~rQ)+5Xx z>lNzwkFY5)N+d8Pv2qCK9I8`j(`N8gVisY2F-d_TSfRmJh{b`cz)OwkBXiCqg-%uh xHD+f!f#y9-hd31&Qy7foRbDVWJIKh)%up}PyVFqSv>(ty22WQ%mvv4FO#n49F&Y2> literal 0 HcmV?d00001 diff --git a/src/assets/img/sidebar/bubbles.svg b/src/assets/img/sidebar/bubbles.svg new file mode 100644 index 0000000..88353e2 --- /dev/null +++ b/src/assets/img/sidebar/bubbles.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/assets/img/sidebar/new-chat.svg b/src/assets/img/sidebar/new-chat.svg new file mode 100644 index 0000000..e41d9f1 --- /dev/null +++ b/src/assets/img/sidebar/new-chat.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/assets/img/sidebar/toggle.svg b/src/assets/img/sidebar/toggle.svg new file mode 100644 index 0000000..0c14421 --- /dev/null +++ b/src/assets/img/sidebar/toggle.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/img/sidebar/workspace-logo.svg b/src/assets/img/sidebar/workspace-logo.svg new file mode 100644 index 0000000..6bc3c4a --- /dev/null +++ b/src/assets/img/sidebar/workspace-logo.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/img/smileIcon.svg b/src/assets/img/smileIcon.svg new file mode 100644 index 0000000..0023ed5 --- /dev/null +++ b/src/assets/img/smileIcon.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/img/user-icons/female-1.svg b/src/assets/img/user-icons/female-1.svg new file mode 100644 index 0000000..5934159 --- /dev/null +++ b/src/assets/img/user-icons/female-1.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/assets/img/user-icons/female-2.svg b/src/assets/img/user-icons/female-2.svg new file mode 100644 index 0000000..48977b2 --- /dev/null +++ b/src/assets/img/user-icons/female-2.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/img/user-icons/guest.svg b/src/assets/img/user-icons/guest.svg new file mode 100644 index 0000000..4a942e7 --- /dev/null +++ b/src/assets/img/user-icons/guest.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/assets/img/user-icons/male-1.svg b/src/assets/img/user-icons/male-1.svg new file mode 100644 index 0000000..57f5857 --- /dev/null +++ b/src/assets/img/user-icons/male-1.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/src/assets/img/user-icons/male-2.svg b/src/assets/img/user-icons/male-2.svg new file mode 100644 index 0000000..54d7880 --- /dev/null +++ b/src/assets/img/user-icons/male-2.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/src/assets/img/user-icons/male-3.svg b/src/assets/img/user-icons/male-3.svg new file mode 100644 index 0000000..900ee65 --- /dev/null +++ b/src/assets/img/user-icons/male-3.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/assets/img/user-icons/male-4.svg b/src/assets/img/user-icons/male-4.svg new file mode 100644 index 0000000..cae6455 --- /dev/null +++ b/src/assets/img/user-icons/male-4.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/src/assets/img/verticalLine.svg b/src/assets/img/verticalLine.svg new file mode 100644 index 0000000..ca95de9 --- /dev/null +++ b/src/assets/img/verticalLine.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/img/videoIcon.svg b/src/assets/img/videoIcon.svg new file mode 100644 index 0000000..9c3d73e --- /dev/null +++ b/src/assets/img/videoIcon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/favicon.ico b/src/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..13ec3f15497b7eba7a26e56e803ee9dde2a38b01 GIT binary patch literal 15406 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 literal 0 HcmV?d00001 diff --git a/src/index.html b/src/index.html new file mode 100644 index 0000000..0d6cb97 --- /dev/null +++ b/src/index.html @@ -0,0 +1,21 @@ + + + + + DABubble + + + + + + + + + + diff --git a/src/main.ts b/src/main.ts new file mode 100644 index 0000000..35b00f3 --- /dev/null +++ b/src/main.ts @@ -0,0 +1,6 @@ +import { bootstrapApplication } from '@angular/platform-browser'; +import { appConfig } from './app/app.config'; +import { AppComponent } from './app/app.component'; + +bootstrapApplication(AppComponent, appConfig) + .catch((err) => console.error(err)); diff --git a/src/styles.scss b/src/styles.scss new file mode 100644 index 0000000..8dc6995 --- /dev/null +++ b/src/styles.scss @@ -0,0 +1,352 @@ +$RESPONSIVE_THRESHOLD_MOBILE380px: 380px; +$RESPONSIVE_THRESHOLD_MOBILE: 600px; +$RESPONSIVE_THRESHOLD: 1300px; +$RESPONSIVE_THRESHOLD_MAX: 1900px; +$RESPONSIVE_THRESHOLD_SEARCHBAR: 1100px; + +* { + margin: 0; + font-family: "Nunito", sans-serif; +} + +body { + overflow-x: hidden; + background-color: #eceefe; +} + +@mixin displayFlex($d: flex, $j: center, $a: center, $g: 0) { + display: $d; + justify-content: $j; + align-items: $a; + gap: $g; +} + +.dBlock { + display: block; +} + +.dNone { + display: none; +} + +.fontNunito { + font-family: "Nunito"; +} + +.fontNunitoSans { + font-family: "Nunito Sans"; +} + +/* nunito-200 - latin */ +@font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: "Nunito"; + font-style: normal; + font-weight: 200; + src: url("./assets/fonts/nunito-v26-latin-200.woff2") format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ +} +/* nunito-200italic - latin */ +@font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: "Nunito"; + font-style: italic; + font-weight: 200; + src: url("./assets/fonts/nunito-v26-latin-200italic.woff2") format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ +} +/* nunito-300 - latin */ +@font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: "Nunito"; + font-style: normal; + font-weight: 300; + src: url("./assets/fonts/nunito-v26-latin-300.woff2") format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ +} +/* nunito-300italic - latin */ +@font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: "Nunito"; + font-style: italic; + font-weight: 300; + src: url("./assets/fonts/nunito-v26-latin-300italic.woff2") format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ +} +/* nunito-regular - latin */ +@font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: "Nunito"; + font-style: normal; + font-weight: 400; + src: url("./assets/fonts/nunito-v26-latin-regular.woff2") format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ +} +/* nunito-italic - latin */ +@font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: "Nunito"; + font-style: italic; + font-weight: 400; + src: url("./assets/fonts/nunito-v26-latin-italic.woff2") format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ +} +/* nunito-500 - latin */ +@font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: "Nunito"; + font-style: normal; + font-weight: 500; + src: url("./assets/fonts/nunito-v26-latin-500.woff2") format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ +} +/* nunito-500italic - latin */ +@font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: "Nunito"; + font-style: italic; + font-weight: 500; + src: url("./assets/fonts/nunito-v26-latin-500italic.woff2") format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ +} +/* nunito-600 - latin */ +@font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: "Nunito"; + font-style: normal; + font-weight: 600; + src: url("./assets/fonts/nunito-v26-latin-600.woff2") format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ +} +/* nunito-600italic - latin */ +@font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: "Nunito"; + font-style: italic; + font-weight: 600; + src: url("./assets/fonts/nunito-v26-latin-600italic.woff2") format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ +} +/* nunito-700 - latin */ +@font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: "Nunito"; + font-style: normal; + font-weight: 700; + src: url("./assets/fonts/nunito-v26-latin-700.woff2") format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ +} +/* nunito-700italic - latin */ +@font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: "Nunito"; + font-style: italic; + font-weight: 700; + src: url("./assets/fonts/nunito-v26-latin-700italic.woff2") format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ +} +/* nunito-800 - latin */ +@font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: "Nunito"; + font-style: normal; + font-weight: 800; + src: url("./assets/fonts/nunito-v26-latin-800.woff2") format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ +} +/* nunito-800italic - latin */ +@font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: "Nunito"; + font-style: italic; + font-weight: 800; + src: url("./assets/fonts/nunito-v26-latin-800italic.woff2") format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ +} +/* nunito-900 - latin */ +@font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: "Nunito"; + font-style: normal; + font-weight: 900; + src: url("./assets/fonts/nunito-v26-latin-900.woff2") format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ +} +/* nunito-900italic - latin */ +@font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: "Nunito"; + font-style: italic; + font-weight: 900; + src: url("./assets/fonts/nunito-v26-latin-900italic.woff2") format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ +} + +/* nunito-sans-200 - latin */ +@font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: "Nunito Sans"; + font-style: normal; + font-weight: 200; + src: url("./assets/fonts/nunito-sans-v15-latin-200.woff2") format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ +} +/* nunito-sans-200italic - latin */ +@font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: "Nunito Sans"; + font-style: italic; + font-weight: 200; + src: url("./assets/fonts/nunito-sans-v15-latin-200italic.woff2") + format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ +} +/* nunito-sans-300 - latin */ +@font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: "Nunito Sans"; + font-style: normal; + font-weight: 300; + src: url("./assets/fonts/nunito-sans-v15-latin-300.woff2") format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ +} +/* nunito-sans-300italic - latin */ +@font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: "Nunito Sans"; + font-style: italic; + font-weight: 300; + src: url("./assets/fonts/nunito-sans-v15-latin-300italic.woff2") + format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ +} +/* nunito-sans-regular - latin */ +@font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: "Nunito Sans"; + font-style: normal; + font-weight: 400; + src: url("./assets/fonts/nunito-sans-v15-latin-regular.woff2") format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ +} +/* nunito-sans-italic - latin */ +@font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: "Nunito Sans"; + font-style: italic; + font-weight: 400; + src: url("./assets/fonts/nunito-sans-v15-latin-italic.woff2") format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ +} +/* nunito-sans-500 - latin */ +@font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: "Nunito Sans"; + font-style: normal; + font-weight: 500; + src: url("./assets/fonts/nunito-sans-v15-latin-500.woff2") format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ +} +/* nunito-sans-500italic - latin */ +@font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: "Nunito Sans"; + font-style: italic; + font-weight: 500; + src: url("./assets/fonts/nunito-sans-v15-latin-500italic.woff2") + format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ +} +/* nunito-sans-600 - latin */ +@font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: "Nunito Sans"; + font-style: normal; + font-weight: 600; + src: url("./assets/fonts/nunito-sans-v15-latin-600.woff2") format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ +} +/* nunito-sans-600italic - latin */ +@font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: "Nunito Sans"; + font-style: italic; + font-weight: 600; + src: url("./assets/fonts/nunito-sans-v15-latin-600italic.woff2") + format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ +} +/* nunito-sans-700 - latin */ +@font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: "Nunito Sans"; + font-style: normal; + font-weight: 700; + src: url("./assets/fonts/nunito-sans-v15-latin-700.woff2") format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ +} +/* nunito-sans-700italic - latin */ +@font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: "Nunito Sans"; + font-style: italic; + font-weight: 700; + src: url("./assets/fonts/nunito-sans-v15-latin-700italic.woff2") + format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ +} +/* nunito-sans-800 - latin */ +@font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: "Nunito Sans"; + font-style: normal; + font-weight: 800; + src: url("./assets/fonts/nunito-sans-v15-latin-800.woff2") format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ +} +/* nunito-sans-800italic - latin */ +@font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: "Nunito Sans"; + font-style: italic; + font-weight: 800; + src: url("./assets/fonts/nunito-sans-v15-latin-800italic.woff2") + format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ +} +/* nunito-sans-900 - latin */ +@font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: "Nunito Sans"; + font-style: normal; + font-weight: 900; + src: url("./assets/fonts/nunito-sans-v15-latin-900.woff2") format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ +} +/* nunito-sans-900italic - latin */ +@font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: "Nunito Sans"; + font-style: italic; + font-weight: 900; + src: url("./assets/fonts/nunito-sans-v15-latin-900italic.woff2") + format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ +} +@font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: "Figtree"; + font-style: normal; + font-weight: 400; + src: url("./assets/fonts/figtree-v5-latin-regular.woff2") format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ +} +/* figtree-500 - latin */ +@font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: "Figtree"; + font-style: normal; + font-weight: 500; + src: url("./assets/fonts/figtree-v5-latin-500.woff2") format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ +} +/* figtree-600 - latin */ +@font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: "Figtree"; + font-style: normal; + font-weight: 600; + src: url("./assets/fonts/figtree-v5-latin-600.woff2") format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ +} +/* figtree-700 - latin */ +@font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: "Figtree"; + font-style: normal; + font-weight: 700; + src: url("./assets/fonts/figtree-v5-latin-700.woff2") format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ +} + +::-webkit-scrollbar-track { + -webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.2); + border-radius: 10px; + background-color: #f5f5f5; +} + +::-webkit-scrollbar { + width: 6px; + height: 6px; + background-color: #f5f5f5; +} + +::-webkit-scrollbar-thumb { + border-radius: 10px; + -webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.2); + background-color: #797ef3; +} diff --git a/tsconfig.app.json b/tsconfig.app.json new file mode 100644 index 0000000..374cc9d --- /dev/null +++ b/tsconfig.app.json @@ -0,0 +1,14 @@ +/* To learn more about this file see: https://angular.io/config/tsconfig. */ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/app", + "types": [] + }, + "files": [ + "src/main.ts" + ], + "include": [ + "src/**/*.d.ts" + ] +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..f37b67f --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,33 @@ +/* To learn more about this file see: https://angular.io/config/tsconfig. */ +{ + "compileOnSave": false, + "compilerOptions": { + "outDir": "./dist/out-tsc", + "forceConsistentCasingInFileNames": true, + "strict": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "skipLibCheck": true, + "esModuleInterop": true, + "sourceMap": true, + "declaration": false, + "experimentalDecorators": true, + "moduleResolution": "node", + "importHelpers": true, + "target": "ES2022", + "module": "ES2022", + "useDefineForClassFields": false, + "lib": [ + "ES2022", + "dom" + ] + }, + "angularCompilerOptions": { + "enableI18nLegacyMessageIdFormat": false, + "strictInjectionParameters": true, + "strictInputAccessModifiers": true, + "strictTemplates": true + } +} diff --git a/tsconfig.spec.json b/tsconfig.spec.json new file mode 100644 index 0000000..be7e9da --- /dev/null +++ b/tsconfig.spec.json @@ -0,0 +1,14 @@ +/* To learn more about this file see: https://angular.io/config/tsconfig. */ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/spec", + "types": [ + "jasmine" + ] + }, + "include": [ + "src/**/*.spec.ts", + "src/**/*.d.ts" + ] +}