diff --git a/.github/workflows/build_backend.yml b/.github/workflows/build_backend.yml index bd574d8..1bf1fd7 100644 --- a/.github/workflows/build_backend.yml +++ b/.github/workflows/build_backend.yml @@ -30,7 +30,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v2 + uses: actions/checkout@v3 # Install the cosign tool except on PR # https://github.com/sigstore/cosign-installer @@ -43,7 +43,7 @@ jobs: # Workaround: https://github.com/docker/build-push-action/issues/461 - name: Setup Docker buildx - uses: docker/setup-buildx-action@79abd3f86f79a9d68a23c75a09a9a85889262adf + uses: docker/setup-buildx-action@v2.2.1 # Login against a Docker registry except on PR # https://github.com/docker/login-action diff --git a/.github/workflows/frontend_lint.yml b/.github/workflows/frontend_lint.yml index c1f97b3..8086b68 100644 --- a/.github/workflows/frontend_lint.yml +++ b/.github/workflows/frontend_lint.yml @@ -8,6 +8,7 @@ on: branches: [ master ] paths: - "frontend/**" + workflow_dispatch: pull_request: jobs: @@ -15,11 +16,11 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2.0.0 + - uses: actions/checkout@v3.3.0 with: fetch-depth: 1 - - uses: pnpm/action-setup@v2.2.2 + - uses: pnpm/action-setup@v2.2.4 with: version: 7.9.3 working-directory: ./frontend diff --git a/classquiz/__init__.py b/classquiz/__init__.py index a24eeca..ec12387 100644 --- a/classquiz/__init__.py +++ b/classquiz/__init__.py @@ -28,6 +28,7 @@ from classquiz.routers import ( login, sitemap, remote, + community, ) from classquiz.socket_server import sio from classquiz.helpers import meilisearch_init, telemetry_ping, bg_tasks @@ -98,5 +99,6 @@ app.include_router( app.include_router(editor.router, tags=["editor"], prefix="/api/v1/editor", include_in_schema=True) app.include_router(eximport.router, tags=["export", "import"], prefix="/api/v1/eximport", include_in_schema=True) app.include_router(sitemap.router, tags=["sitemap"], prefix="/api/v1/sitemap", include_in_schema=True) +app.include_router(community.router, tags=["community"], prefix="/api/v1/community", include_in_schema=True) app.mount("/", ASGIApp(sio)) diff --git a/classquiz/auth.py b/classquiz/auth.py index ed81a58..92714d8 100644 --- a/classquiz/auth.py +++ b/classquiz/auth.py @@ -43,12 +43,12 @@ class OAuth2PasswordBearerWithCookie(OAuth2): super().__init__(flows=flows, scheme_name=scheme_name, auto_error=auto_error) async def __call__(self, request: Request) -> Optional[str]: - authorization: str = request.cookies.get("access_token") # changed to accept access token from httpOnly Cookie - if authorization is None: - try: - authorization = request.state.access_token - except AttributeError: - pass + try: + authorization = request.state.access_token + except AttributeError: + authorization: str = request.cookies.get( + "access_token" + ) # changed to accept access token from httpOnly Cookie scheme, param = get_authorization_scheme_param(authorization) if not authorization or scheme.lower() != "bearer": if self.auto_error: diff --git a/classquiz/db/models.py b/classquiz/db/models.py index 446a638..2249a6f 100644 --- a/classquiz/db/models.py +++ b/classquiz/db/models.py @@ -133,6 +133,7 @@ class QuizQuestion(BaseModel): @validator("answers") def answers_not_none_if_abcd_type(cls, v, values): + # print(values) if values["type"] == QuizQuestionType.ABCD and type(v[0]) != ABCDQuizAnswer: raise ValueError("Answers can't be none if type is ABCD") if values["type"] == QuizQuestionType.RANGE and type(v) != RangeQuizAnswer: @@ -272,3 +273,12 @@ class GameInLobby(BaseModel): game_pin: str quiz_title: str game_id: uuid.UUID + + +# +# class UserProfileLinks(ormar.Model): +# id: int = ormar.Integer(primary_key=True, autoincrement=True) +# user: Optional[User] = ormar.ForeignKey(User) +# github_username: str | None = ormar.Text(nullable=True) +# reddit_username: str | None = ormar.Text(nullable=True) +# kahoot_user_id: str | None = ormar.Text(nullable=True) diff --git a/classquiz/oauth/__init__.py b/classquiz/oauth/__init__.py index 5b35f89..af8115a 100644 --- a/classquiz/oauth/__init__.py +++ b/classquiz/oauth/__init__.py @@ -4,11 +4,15 @@ from datetime import timedelta, datetime from fastapi import APIRouter, Request, Response +from fastapi.security.utils import get_authorization_scheme_param +from jose import jws, jwt, JWTError, JWSError from classquiz.auth import ACCESS_TOKEN_EXPIRE_MINUTES, create_access_token from classquiz.db.models import UserSession from classquiz.oauth import google, github +from classquiz.config import settings +settings = settings() router = APIRouter() router.include_router(google.router, prefix="/google") @@ -18,7 +22,45 @@ router.include_router(github.router, prefix="/github") async def rememberme_middleware(request: Request, call_next): rememberme_cookie = request.cookies.get("rememberme_token") bearer_token = request.cookies.get("access_token") - if rememberme_cookie is not None and bearer_token is None: + conditions_to_handle_met = True + # print(bearer_token) + # if bearer_token is not None: + # bearer_token = bearer_token.replace("Bearer ", "") + # test = jws.verify(bearer_token, settings.secret_key, algorithms=["HS256"]) + # try: + # jwt.decode(bearer_token, settings.secret_key, algorithms=["HS256"]) + # print("jwt ok") + # except JWTError as e: + # print("jwt failed") + # print(test) + + scheme, param = get_authorization_scheme_param(bearer_token) + + # if bearer token is none, we can just do the request, since you can't be signed in + if scheme is None or param is None: + conditions_to_handle_met = False + # if rememberme token is none, we can just do the request, since you can't be signed in + if rememberme_cookie is None: + conditions_to_handle_met = False + + if scheme.lower() != "bearer": + conditions_to_handle_met = False + + # Verifying the bearer + try: + jwt.decode( + param, settings.secret_key, algorithms=["HS256"] + ) # checking if the token is valid, throws error if not + conditions_to_handle_met = False + except JWTError: + try: + jws.verify( + param, settings.secret_key, algorithms=["HS256"] + ) # Verifying only the signature of the jwt, throws error if signature is invalid + except JWSError: + conditions_to_handle_met = False + + if conditions_to_handle_met: user_session: UserSession | None = ( await UserSession.objects.filter(session_key=rememberme_cookie) .select_related(UserSession.user) @@ -27,17 +69,19 @@ async def rememberme_middleware(request: Request, call_next): if (user_session is None) or (user_session.user is None): response: Response = await call_next(request) return response - access_token_expires = timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES * 60) + access_token_expires = timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES) + # access_token_expires = timedelta(seconds=1) access_token = create_access_token(data={"sub": user_session.user.email}, expires_delta=access_token_expires) await user_session.update(last_seen=datetime.now()) request.state.access_token = f"Bearer {access_token}" + request.cookies.pop("access_token") response: Response = await call_next(request) response.set_cookie( key="access_token", value=f"Bearer {access_token}", httponly=True, samesite="lax", - max_age=ACCESS_TOKEN_EXPIRE_MINUTES * 60, + max_age=60 * 60 * 24 * 365, ) else: response: Response = await call_next(request) diff --git a/classquiz/oauth/authenticate_user.py b/classquiz/oauth/authenticate_user.py index 59fe0ba..9f8aae8 100644 --- a/classquiz/oauth/authenticate_user.py +++ b/classquiz/oauth/authenticate_user.py @@ -43,7 +43,7 @@ async def log_user_in(user: User, request: Request, response: Response): value=f"Bearer {access_token}", httponly=True, samesite="lax", - max_age=settings.access_token_expire_minutes * 60, + max_age=60 * 60 * 24 * 365, ) response.set_cookie( key="rememberme_token", value=session_key, httponly=True, samesite="lax", max_age=60 * 60 * 24 * 365 @@ -64,7 +64,7 @@ async def rememberme_check(rememberme_token: str, response: Response): value=f"Bearer {access_token}", httponly=True, samesite="lax", - max_age=settings.access_token_expire_minutes * 60, + max_age=60 * 60 * 24 * 365, ) response.set_cookie(key="expiry", value="", max_age=settings.access_token_expire_minutes * 60) response.status_code = 200 diff --git a/classquiz/routers/community.py b/classquiz/routers/community.py new file mode 100644 index 0000000..0810625 --- /dev/null +++ b/classquiz/routers/community.py @@ -0,0 +1,34 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +from fastapi import APIRouter, HTTPException +from uuid import UUID + +from classquiz.db.models import User, Quiz + +router = APIRouter() + + +# +@router.get("/user/{user_id}", response_model_include={"username", "created_at", "id"}, response_model=User) +async def get_user_by_user_id(user_id: UUID): + user = await User.objects.get_or_none(id=user_id) + # .select_related("quizs") + # print(user) + if user is None: + raise HTTPException(status_code=404, detail="user not found") + else: + return user + + +@router.get("/quizzes/{user_id}", response_model_exclude={"questions", "user_id"}, response_model=list[Quiz]) +async def get_quizzes_from_user(user_id: UUID, imported: bool | None = None): + if imported is None: + quizzes = await Quiz.objects.all(user_id=user_id, public=True) + else: + quizzes = await Quiz.objects.all(user_id=user_id, public=True, imported_from_kahoot=imported) + if len(quizzes) == 0: + raise HTTPException(status_code=404, detail="no quizzes found") + else: + return quizzes diff --git a/classquiz/routers/quiz.py b/classquiz/routers/quiz.py index 211ad95..c6d9946 100644 --- a/classquiz/routers/quiz.py +++ b/classquiz/routers/quiz.py @@ -18,7 +18,7 @@ import bleach from classquiz.auth import get_current_user from classquiz.config import redis, settings, storage, meilisearch -from classquiz.db.models import Quiz, QuizInput, User, PlayGame, GameInLobby +from classquiz.db.models import Quiz, QuizInput, User, PlayGame, GameInLobby, QuizQuestion from classquiz.kahoot_importer.import_quiz import import_quiz import html import urllib.parse @@ -75,17 +75,28 @@ async def get_quiz_from_id(quiz_id: str, user: User | None = Depends(get_current return quiz -@router.get("/get/public/{quiz_id}", response_model=Quiz) +class PublicQuizResponseUser(BaseModel): + username: str + id: uuid.UUID + + +class PublicQuizResponse(Quiz.get_pydantic()): + user_id: PublicQuizResponseUser + questions: list[QuizQuestion] + + +@router.get("/get/public/{quiz_id}") async def get_public_quiz(quiz_id: str): try: quiz_id = uuid.UUID(quiz_id) except ValueError: raise HTTPException(status_code=400, detail="badly formed quiz id") - quiz = await Quiz.objects.get_or_none(id=quiz_id) + quiz = await Quiz.objects.select_related("user_id").get_or_none(id=quiz_id) + print(quiz.dict(exclude={"user_id": {"avatar"}})) if quiz is None: return JSONResponse(status_code=404, content={"detail": "quiz not found"}) else: - return quiz + return PublicQuizResponse(**quiz.dict()) @router.post("/start/{quiz_id}") diff --git a/frontend/package.json b/frontend/package.json index 3d0128b..7893b66 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -15,23 +15,22 @@ }, "devDependencies": { "@beyonk/svelte-mapbox": "^8.2.0", - "@ckeditor/ckeditor5-autoformat": "^35.3.2", - "@ckeditor/ckeditor5-basic-styles": "^35.3.2", - "@ckeditor/ckeditor5-build-balloon": "^35.3.2", - "@ckeditor/ckeditor5-editor-balloon": "^35.3.2", - "@ckeditor/ckeditor5-essentials": "^35.3.2", - "@ckeditor/ckeditor5-theme-lark": "^35.3.2", - "@felte/reporter-tippy": "^1.1.4", - "@felte/validator-yup": "^1.0.10", + "@ckeditor/ckeditor5-autoformat": "^35.4.0", + "@ckeditor/ckeditor5-basic-styles": "^35.4.0", + "@ckeditor/ckeditor5-build-balloon": "^35.4.0", + "@ckeditor/ckeditor5-editor-balloon": "^35.4.0", + "@ckeditor/ckeditor5-essentials": "^35.4.0", + "@ckeditor/ckeditor5-theme-lark": "^35.4.0", + "@felte/reporter-tippy": "^1.1.5", + "@felte/validator-yup": "^1.0.11", "@fontsource/marck-script": "^4.5.11", - "@neodrag/svelte": "^1.2.4", - "@sentry/browser": "^7.23.0", - "@sentry/tracing": "^7.23.0", + "@sentry/browser": "^7.31.1", + "@sentry/tracing": "^7.31.1", "@simplewebauthn/browser": "^6.2.2", - "@sveltejs/adapter-auto": "^1.0.0", - "@sveltejs/adapter-node": "^1.0.0-next.101", - "@sveltejs/kit": "^1.0.1", - "@tailwindcss/typography": "^0.5.8", + "@sveltejs/adapter-auto": "^1.0.2", + "@sveltejs/adapter-node": "^1.1.4", + "@sveltejs/kit": "^1.2.2", + "@tailwindcss/typography": "^0.5.9", "@types/canvas-confetti": "^1.6.0", "@types/cookie": "^0.5.1", "@types/js-cookie": "^3.0.2", @@ -39,8 +38,8 @@ "@types/qrcode": "^1.5.0", "@types/sortablejs": "^1.15.0", "@types/ua-parser-js": "^0.7.36", - "@typescript-eslint/eslint-plugin": "^5.45.0", - "@typescript-eslint/parser": "^5.45.0", + "@typescript-eslint/eslint-plugin": "^5.48.2", + "@typescript-eslint/parser": "^5.48.2", "@uppy/compressor": "^1.0.1", "@uppy/core": "^3.0.4", "@uppy/dashboard": "^3.2.0", @@ -56,46 +55,45 @@ "cookie": "^0.5.0", "crypto-js": "^4.1.1", "cssnano": "^5.1.14", - "eslint": "^8.28.0", - "eslint-config-prettier": "^8.5.0", + "eslint": "^8.32.0", + "eslint-config-prettier": "^8.6.0", "eslint-plugin-svelte3": "^4.0.0", - "felte": "^1.2.6", + "felte": "^1.2.7", "fuse.js": "^6.6.2", "highlight.js": "^11.7.0", "i18next-browser-languagedetector": "^7.0.1", "js-cookie": "^3.0.1", - "luxon": "^3.1.1", - "mapbox-gl": "^2.11.0", + "luxon": "^3.2.1", + "mapbox-gl": "^2.12.0", "mdsvex": "^0.10.6", "minisearch": "^5.1.0", "pikaso": "^2.7.4", "plausible-tracker": "^0.3.8", - "postcss": "^8.4.19", + "postcss": "^8.4.21", "postcss-import": "^14.1.0", "postcss-load-config": "^4.0.1", - "prettier": "^2.8.0", - "prettier-plugin-svelte": "^2.8.1", + "prettier": "^2.8.3", + "prettier-plugin-svelte": "^2.9.0", "qrcode": "^1.5.1", - "sass": "^1.56.1", + "sass": "^1.57.1", "socket.io-client": "^4.5.4", - "sortablejs": "^1.15.0", - "svelte": "^3.53.1", - "svelte-check": "^2.10.0", - "svelte-preprocess": "^5.0.0", - "svelte-range-slider-pips": "^2.1.0", + "svelte": "^3.55.1", + "svelte-check": "^3.0.2", + "svelte-preprocess": "^5.0.1", + "svelte-range-slider-pips": "^2.1.1", "svelte-tippy": "^1.3.2", - "swiper": "^8.4.5", + "swiper": "^8.4.6", "tailwindcss": "^3.2.4", "tippy.js": "^6.3.7", "tslib": "^2.4.1", "typescript": "~4.7.4", - "ua-parser-js": "^1.0.32", - "vite": "^4.0.1", + "ua-parser-js": "^1.0.33", + "vite": "^4.0.4", "vite-plugin-iso-import": "^1.0.0", "yup": "^0.32.11" }, "type": "module", "dependencies": { - "i18next": "^22.0.6" + "i18next": "^22.4.9" } } diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml index d011abc..3bdf7e0 100644 --- a/frontend/pnpm-lock.yaml +++ b/frontend/pnpm-lock.yaml @@ -2,23 +2,22 @@ lockfileVersion: 5.4 specifiers: '@beyonk/svelte-mapbox': ^8.2.0 - '@ckeditor/ckeditor5-autoformat': ^35.3.2 - '@ckeditor/ckeditor5-basic-styles': ^35.3.2 - '@ckeditor/ckeditor5-build-balloon': ^35.3.2 - '@ckeditor/ckeditor5-editor-balloon': ^35.3.2 - '@ckeditor/ckeditor5-essentials': ^35.3.2 - '@ckeditor/ckeditor5-theme-lark': ^35.3.2 - '@felte/reporter-tippy': ^1.1.4 - '@felte/validator-yup': ^1.0.10 + '@ckeditor/ckeditor5-autoformat': ^35.4.0 + '@ckeditor/ckeditor5-basic-styles': ^35.4.0 + '@ckeditor/ckeditor5-build-balloon': ^35.4.0 + '@ckeditor/ckeditor5-editor-balloon': ^35.4.0 + '@ckeditor/ckeditor5-essentials': ^35.4.0 + '@ckeditor/ckeditor5-theme-lark': ^35.4.0 + '@felte/reporter-tippy': ^1.1.5 + '@felte/validator-yup': ^1.0.11 '@fontsource/marck-script': ^4.5.11 - '@neodrag/svelte': ^1.2.4 - '@sentry/browser': ^7.23.0 - '@sentry/tracing': ^7.23.0 + '@sentry/browser': ^7.31.1 + '@sentry/tracing': ^7.31.1 '@simplewebauthn/browser': ^6.2.2 - '@sveltejs/adapter-auto': ^1.0.0 - '@sveltejs/adapter-node': ^1.0.0-next.101 - '@sveltejs/kit': ^1.0.1 - '@tailwindcss/typography': ^0.5.8 + '@sveltejs/adapter-auto': ^1.0.2 + '@sveltejs/adapter-node': ^1.1.4 + '@sveltejs/kit': ^1.2.2 + '@tailwindcss/typography': ^0.5.9 '@types/canvas-confetti': ^1.6.0 '@types/cookie': ^0.5.1 '@types/js-cookie': ^3.0.2 @@ -26,8 +25,8 @@ specifiers: '@types/qrcode': ^1.5.0 '@types/sortablejs': ^1.15.0 '@types/ua-parser-js': ^0.7.36 - '@typescript-eslint/eslint-plugin': ^5.45.0 - '@typescript-eslint/parser': ^5.45.0 + '@typescript-eslint/eslint-plugin': ^5.48.2 + '@typescript-eslint/parser': ^5.48.2 '@uppy/compressor': ^1.0.1 '@uppy/core': ^3.0.4 '@uppy/dashboard': ^3.2.0 @@ -43,47 +42,46 @@ specifiers: cookie: ^0.5.0 crypto-js: ^4.1.1 cssnano: ^5.1.14 - eslint: ^8.28.0 - eslint-config-prettier: ^8.5.0 + eslint: ^8.32.0 + eslint-config-prettier: ^8.6.0 eslint-plugin-svelte3: ^4.0.0 - felte: ^1.2.6 + felte: ^1.2.7 fuse.js: ^6.6.2 highlight.js: ^11.7.0 - i18next: ^22.0.6 + i18next: ^22.4.9 i18next-browser-languagedetector: ^7.0.1 js-cookie: ^3.0.1 - luxon: ^3.1.1 - mapbox-gl: ^2.11.0 + luxon: ^3.2.1 + mapbox-gl: ^2.12.0 mdsvex: ^0.10.6 minisearch: ^5.1.0 pikaso: ^2.7.4 plausible-tracker: ^0.3.8 - postcss: ^8.4.19 + postcss: ^8.4.21 postcss-import: ^14.1.0 postcss-load-config: ^4.0.1 - prettier: ^2.8.0 - prettier-plugin-svelte: ^2.8.1 + prettier: ^2.8.3 + prettier-plugin-svelte: ^2.9.0 qrcode: ^1.5.1 - sass: ^1.56.1 + sass: ^1.57.1 socket.io-client: ^4.5.4 - sortablejs: ^1.15.0 - svelte: ^3.53.1 - svelte-check: ^2.10.0 - svelte-preprocess: ^5.0.0 - svelte-range-slider-pips: ^2.1.0 + svelte: ^3.55.1 + svelte-check: ^3.0.2 + svelte-preprocess: ^5.0.1 + svelte-range-slider-pips: ^2.1.1 svelte-tippy: ^1.3.2 - swiper: ^8.4.5 + swiper: ^8.4.6 tailwindcss: ^3.2.4 tippy.js: ^6.3.7 tslib: ^2.4.1 typescript: ~4.7.4 - ua-parser-js: ^1.0.32 - vite: ^4.0.1 + ua-parser-js: ^1.0.33 + vite: ^4.0.4 vite-plugin-iso-import: ^1.0.0 yup: ^0.32.11 dependencies: - i18next: 22.4.5 + i18next: 22.4.9 devDependencies: '@beyonk/svelte-mapbox': 8.2.0 @@ -93,17 +91,16 @@ devDependencies: '@ckeditor/ckeditor5-editor-balloon': 35.4.0 '@ckeditor/ckeditor5-essentials': 35.4.0 '@ckeditor/ckeditor5-theme-lark': 35.4.0 - '@felte/reporter-tippy': 1.1.4_tippy.js@6.3.7 - '@felte/validator-yup': 1.0.10_yup@0.32.11 + '@felte/reporter-tippy': 1.1.5_tippy.js@6.3.7 + '@felte/validator-yup': 1.0.11_yup@0.32.11 '@fontsource/marck-script': 4.5.11 - '@neodrag/svelte': 1.2.4 - '@sentry/browser': 7.27.0 - '@sentry/tracing': 7.27.0 + '@sentry/browser': 7.31.1 + '@sentry/tracing': 7.31.1 '@simplewebauthn/browser': 6.2.2 - '@sveltejs/adapter-auto': 1.0.0_@sveltejs+kit@1.0.1 - '@sveltejs/adapter-node': 1.0.0_@sveltejs+kit@1.0.1 - '@sveltejs/kit': 1.0.1_svelte@3.55.0+vite@4.0.1 - '@tailwindcss/typography': 0.5.8_tailwindcss@3.2.4 + '@sveltejs/adapter-auto': 1.0.2_@sveltejs+kit@1.2.2 + '@sveltejs/adapter-node': 1.1.4_@sveltejs+kit@1.2.2 + '@sveltejs/kit': 1.2.2_svelte@3.55.1+vite@4.0.4 + '@tailwindcss/typography': 0.5.9_tailwindcss@3.2.4 '@types/canvas-confetti': 1.6.0 '@types/cookie': 0.5.1 '@types/js-cookie': 3.0.2 @@ -111,8 +108,8 @@ devDependencies: '@types/qrcode': 1.5.0 '@types/sortablejs': 1.15.0 '@types/ua-parser-js': 0.7.36 - '@typescript-eslint/eslint-plugin': 5.46.1_qtjn2brzzhu6l3ntqnv7ocqkwu - '@typescript-eslint/parser': 5.46.1_7yp3msae2ah6x4svoyguc3s57e + '@typescript-eslint/eslint-plugin': 5.48.2_2hbgynhxm74hsb5vlfnyqgemdi + '@typescript-eslint/parser': 5.48.2_oz6z67amphy2h47f67wll6poxm '@uppy/compressor': 1.0.1_@uppy+core@3.0.4 '@uppy/core': 3.0.4 '@uppy/dashboard': 3.2.0_@uppy+core@3.0.4 @@ -121,56 +118,55 @@ devDependencies: '@uppy/image-editor': 2.1.0_@uppy+core@3.0.4 '@uppy/progress-bar': 3.0.1_@uppy+core@3.0.4 '@uppy/status-bar': 3.0.1_@uppy+core@3.0.4 - '@uppy/svelte': 3.0.1_zd5pxjxq5i7vlrqcggsxalsir4 + '@uppy/svelte': 3.0.1_lzwna743apfraisht4o7qk5mce '@uppy/xhr-upload': 3.0.4_@uppy+core@3.0.4 - autoprefixer: 10.4.13_postcss@8.4.20 + autoprefixer: 10.4.13_postcss@8.4.21 canvas-confetti: 1.6.0 cookie: 0.5.0 crypto-js: 4.1.1 - cssnano: 5.1.14_postcss@8.4.20 - eslint: 8.30.0 - eslint-config-prettier: 8.5.0_eslint@8.30.0 - eslint-plugin-svelte3: 4.0.0_khrjkzzv5v2x7orkj5o7sxbz3a - felte: 1.2.6_svelte@3.55.0 + cssnano: 5.1.14_postcss@8.4.21 + eslint: 8.32.0 + eslint-config-prettier: 8.6.0_eslint@8.32.0 + eslint-plugin-svelte3: 4.0.0_tmo5zkisvhu6htudosk5k7m6pu + felte: 1.2.7_svelte@3.55.1 fuse.js: 6.6.2 highlight.js: 11.7.0 i18next-browser-languagedetector: 7.0.1 js-cookie: 3.0.1 - luxon: 3.1.1 - mapbox-gl: 2.11.1 - mdsvex: 0.10.6_svelte@3.55.0 + luxon: 3.2.1 + mapbox-gl: 2.12.0 + mdsvex: 0.10.6_svelte@3.55.1 minisearch: 5.1.0 pikaso: 2.7.4 plausible-tracker: 0.3.8 - postcss: 8.4.20 - postcss-import: 14.1.0_postcss@8.4.20 - postcss-load-config: 4.0.1_postcss@8.4.20 - prettier: 2.8.1 - prettier-plugin-svelte: 2.9.0_ajxj753sv7dbwexjherrch25ta + postcss: 8.4.21 + postcss-import: 14.1.0_postcss@8.4.21 + postcss-load-config: 4.0.1_postcss@8.4.21 + prettier: 2.8.3 + prettier-plugin-svelte: 2.9.0_kdmmghgdi3ngrsq6otxkjilbry qrcode: 1.5.1 - sass: 1.57.0 + sass: 1.57.1 socket.io-client: 4.5.4 - sortablejs: 1.15.0 - svelte: 3.55.0 - svelte-check: 2.10.2_qg5vvvck24g2hgmv67rlxrwpfu - svelte-preprocess: 5.0.0_yobe4dakbqoaknvfcvu2g5hg6u + svelte: 3.55.1 + svelte-check: 3.0.2_mraflicfyjy3x4taxigiwsr23i + svelte-preprocess: 5.0.1_uaodilper24tejwwmnc3sygxui svelte-range-slider-pips: 2.1.1 svelte-tippy: 1.3.2 - swiper: 8.4.5 - tailwindcss: 3.2.4_postcss@8.4.20 + swiper: 8.4.6 + tailwindcss: 3.2.4_postcss@8.4.21 tippy.js: 6.3.7 tslib: 2.4.1 typescript: 4.7.4 - ua-parser-js: 1.0.32 - vite: 4.0.1_sass@1.57.0 - vite-plugin-iso-import: 1.0.0_vite@4.0.1 + ua-parser-js: 1.0.33 + vite: 4.0.4_sass@1.57.1 + vite-plugin-iso-import: 1.0.0_vite@4.0.4 yup: 0.32.11 packages: - /@babel/runtime/7.20.6: + /@babel/runtime/7.20.13: resolution: { - integrity: sha512-Q+8MqP7TiHMWzSfwiJwXCjyf4GYA4Dgw3emg/7xmwsdLJOZUp+nMqcOwOzzYheuM1rhDu8FSj2l0aoMygEuXuA== + integrity: sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA== } engines: { node: '>=6.9.0' } dependencies: @@ -558,10 +554,10 @@ packages: lodash-es: 4.17.21 dev: true - /@esbuild/android-arm/0.16.8: + /@esbuild/android-arm/0.16.17: resolution: { - integrity: sha512-r/qxYWkC3gY+Uq24wZacAUevGGb6d7d8VpyO8R0HGg31LXVi+eUr8XxHLCcmVzAjRjlZsZfzPelGpAKP/DafKg== + integrity: sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw== } engines: { node: '>=12' } cpu: [arm] @@ -570,10 +566,10 @@ packages: dev: true optional: true - /@esbuild/android-arm64/0.16.8: + /@esbuild/android-arm64/0.16.17: resolution: { - integrity: sha512-TGQM/tdy5EV1KoFHu0+cMrKvPR8UBLGEfwS84PTCJ07KVp21Fr488aFEL2TCamz9CxoF1np36kY6XOSdLncg2Q== + integrity: sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg== } engines: { node: '>=12' } cpu: [arm64] @@ -582,10 +578,10 @@ packages: dev: true optional: true - /@esbuild/android-x64/0.16.8: + /@esbuild/android-x64/0.16.17: resolution: { - integrity: sha512-HtA4BNfrf5Nyoz3G2IS3qW4A0yckPJ1NjCMA3SiOw3zS1IfpMkbepDGp/Gdokc/tASFd38IP2uIL3W6bHJzAQw== + integrity: sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ== } engines: { node: '>=12' } cpu: [x64] @@ -594,10 +590,10 @@ packages: dev: true optional: true - /@esbuild/darwin-arm64/0.16.8: + /@esbuild/darwin-arm64/0.16.17: resolution: { - integrity: sha512-Ks8K1HGFf6LEjLnnVqB/zyaJcv7zMjbJ9txRZAwQwj+bzg8/AP0TmLBMJf9Ahwn6ATnHrhORtpydP8A/mNthXg== + integrity: sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w== } engines: { node: '>=12' } cpu: [arm64] @@ -606,10 +602,10 @@ packages: dev: true optional: true - /@esbuild/darwin-x64/0.16.8: + /@esbuild/darwin-x64/0.16.17: resolution: { - integrity: sha512-XXh2070hatspZdG/uPqyHLFlHlGbytvT4JlqZuTU3AizcyOvmatPBSnuARvwCtJMw30wjjehcYY8DWPZ5UF2og== + integrity: sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg== } engines: { node: '>=12' } cpu: [x64] @@ -618,10 +614,10 @@ packages: dev: true optional: true - /@esbuild/freebsd-arm64/0.16.8: + /@esbuild/freebsd-arm64/0.16.17: resolution: { - integrity: sha512-6DJuU3+tG9LcHCG/4K3e0AnqmmKWhUc9WDNIhLHOOdleafXwZeFvsqwfyaowNg9yUw5KipRLvV3JJMQ8kT1aPg== + integrity: sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw== } engines: { node: '>=12' } cpu: [arm64] @@ -630,10 +626,10 @@ packages: dev: true optional: true - /@esbuild/freebsd-x64/0.16.8: + /@esbuild/freebsd-x64/0.16.17: resolution: { - integrity: sha512-UcsCaR25C0tZWnoImprPzr7vMEMjLImlTQAIfWXU2wvjF4gBWKO9GEH2JlsKYqBjfWfGgH+HHoGSF/evZbKyxA== + integrity: sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug== } engines: { node: '>=12' } cpu: [x64] @@ -642,10 +638,10 @@ packages: dev: true optional: true - /@esbuild/linux-arm/0.16.8: + /@esbuild/linux-arm/0.16.17: resolution: { - integrity: sha512-Hn36NbKd6Prh0Ehv1A2ObjfXtN2g81jTpmq1+uRLHrW7CJW+W8GdVgOCVwyeupADUIOOa8bars6IZGcjkwq21w== + integrity: sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ== } engines: { node: '>=12' } cpu: [arm] @@ -654,10 +650,10 @@ packages: dev: true optional: true - /@esbuild/linux-arm64/0.16.8: + /@esbuild/linux-arm64/0.16.17: resolution: { - integrity: sha512-WTL1v/OhSxgE7rEELRFNWskym0e+hKDMl4JZs7jpQp7218yJPOjdOEWsbzVEYv4G1cbbtWFvp9DtaAONtdCW5w== + integrity: sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g== } engines: { node: '>=12' } cpu: [arm64] @@ -666,10 +662,10 @@ packages: dev: true optional: true - /@esbuild/linux-ia32/0.16.8: + /@esbuild/linux-ia32/0.16.17: resolution: { - integrity: sha512-Jt+8YBFR2Pk68oS7E9z9PtmgJrDonGdEW3Camb2plZcztKpu/OxfnxFu8f41+TYpKhzUDm5uNMwqxRH3yDYrsQ== + integrity: sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg== } engines: { node: '>=12' } cpu: [ia32] @@ -678,10 +674,10 @@ packages: dev: true optional: true - /@esbuild/linux-loong64/0.16.8: + /@esbuild/linux-loong64/0.16.17: resolution: { - integrity: sha512-P+5J/U/WwPEwcKOFTlTQBK6Gqw4OytpfBvR2V+kBRb5jujwMOQ1aG8iKX14DAwCLks1YHXrXPwXXDPNWEWC59A== + integrity: sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ== } engines: { node: '>=12' } cpu: [loong64] @@ -690,10 +686,10 @@ packages: dev: true optional: true - /@esbuild/linux-mips64el/0.16.8: + /@esbuild/linux-mips64el/0.16.17: resolution: { - integrity: sha512-RDSnljcka9UkVxcLtWv2lG5zcqkZUxIPY47ZSKytv4aoo8b05dH1gnKVWrxBZ+owp3dX48s2lXm6zp3hZHl8qw== + integrity: sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw== } engines: { node: '>=12' } cpu: [mips64el] @@ -702,10 +698,10 @@ packages: dev: true optional: true - /@esbuild/linux-ppc64/0.16.8: + /@esbuild/linux-ppc64/0.16.17: resolution: { - integrity: sha512-fNGvIKXyigXYhSflraBsqR/EBhXhuH0/0r7IpU+3reh+8yX3VjowjC/dwmqHDOSQXbcj+HJb1o9kWYi+fJQ/3g== + integrity: sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g== } engines: { node: '>=12' } cpu: [ppc64] @@ -714,10 +710,10 @@ packages: dev: true optional: true - /@esbuild/linux-riscv64/0.16.8: + /@esbuild/linux-riscv64/0.16.17: resolution: { - integrity: sha512-CsE1IKyVq/Y55PDnBUvm/e7XfvBgfb5kZxHbIEdmB9xt6cTcBkaVvv8EwLDZuYPkYI60WGl0UwyYYx9B2LLgkg== + integrity: sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw== } engines: { node: '>=12' } cpu: [riscv64] @@ -726,10 +722,10 @@ packages: dev: true optional: true - /@esbuild/linux-s390x/0.16.8: + /@esbuild/linux-s390x/0.16.17: resolution: { - integrity: sha512-k8RIN4M+GWQAfJ/oGqwxZlpzOyGF8mxp5mH1A1WUJrpSUo4pe0zkq2EoP1KMQbYkjeJi45YsjwK3IOnSoueXbA== + integrity: sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w== } engines: { node: '>=12' } cpu: [s390x] @@ -738,10 +734,10 @@ packages: dev: true optional: true - /@esbuild/linux-x64/0.16.8: + /@esbuild/linux-x64/0.16.17: resolution: { - integrity: sha512-u0hOo4E9PKyVDmPgJNeip1Tg63wxq+3KBJZKQFblqCl+d5N7n1h7pFwdN5ZzeLaaE645ep8aXzf76ndGnyOypg== + integrity: sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw== } engines: { node: '>=12' } cpu: [x64] @@ -750,10 +746,10 @@ packages: dev: true optional: true - /@esbuild/netbsd-x64/0.16.8: + /@esbuild/netbsd-x64/0.16.17: resolution: { - integrity: sha512-wtENU7TOrnEbUes9aQuNe5PeBM4cTK5dn1W7v6XCr1LatJxAOn6Jn8yDGRsa2uKeEbAS5HeYx7uBAbTBd98OXQ== + integrity: sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA== } engines: { node: '>=12' } cpu: [x64] @@ -762,10 +758,10 @@ packages: dev: true optional: true - /@esbuild/openbsd-x64/0.16.8: + /@esbuild/openbsd-x64/0.16.17: resolution: { - integrity: sha512-Y0DRVd/PIiutCpAYvRZHkpDNN3tdSQ1oyKy6xoh5TFTElAmzdlO7CO8ABs8689gq47lJ466cQEq9adJrKXrgXg== + integrity: sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg== } engines: { node: '>=12' } cpu: [x64] @@ -774,10 +770,10 @@ packages: dev: true optional: true - /@esbuild/sunos-x64/0.16.8: + /@esbuild/sunos-x64/0.16.17: resolution: { - integrity: sha512-eKg0I3C5z4NTF396Yo9QByXA8DdRS7QiYPFf6JHcED0BanyLW/jX8csUy96wyGivTNrmU0mCOShbeLgzb0eX7w== + integrity: sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw== } engines: { node: '>=12' } cpu: [x64] @@ -786,10 +782,10 @@ packages: dev: true optional: true - /@esbuild/win32-arm64/0.16.8: + /@esbuild/win32-arm64/0.16.17: resolution: { - integrity: sha512-M2BZhsa7z8kMGre96HTMXpm266cfJkbdtcZgVfAL8hY4ptkh5MwNDasl85CDo++ffW2issVT+W/xIGJOr0v2pg== + integrity: sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw== } engines: { node: '>=12' } cpu: [arm64] @@ -798,10 +794,10 @@ packages: dev: true optional: true - /@esbuild/win32-ia32/0.16.8: + /@esbuild/win32-ia32/0.16.17: resolution: { - integrity: sha512-mzzHVpnuHQT+IrptiW+uUswEMpVIueYuAkjwt1m4tQuVq9dGWqCA1y9EE+W3S19nMg6JvHMbaRjv3mlCcmi0rA== + integrity: sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig== } engines: { node: '>=12' } cpu: [ia32] @@ -810,10 +806,10 @@ packages: dev: true optional: true - /@esbuild/win32-x64/0.16.8: + /@esbuild/win32-x64/0.16.17: resolution: { - integrity: sha512-Zgzyn7njXpSSe1YGQk03eW4uei4QoZKloe/TBQZXgQHo6ul/ux0BtYdLz3MZ8WDlvqTG3QnLV4+gtV5ordM0+g== + integrity: sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q== } engines: { node: '>=12' } cpu: [x64] @@ -822,10 +818,10 @@ packages: dev: true optional: true - /@eslint/eslintrc/1.4.0: + /@eslint/eslintrc/1.4.1: resolution: { - integrity: sha512-7yfvXy6MWLgWSFsLhz5yH3iQ52St8cdUY6FoGieKkRDVxuxmrNuUetIuu6cmjNWwniUHiWXjxCr5tTXDrbYS5A== + integrity: sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA== } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } dependencies: @@ -833,7 +829,7 @@ packages: debug: 4.3.4 espree: 9.4.1 globals: 13.19.0 - ignore: 5.2.1 + ignore: 5.2.4 import-fresh: 3.3.0 js-yaml: 4.1.0 minimatch: 3.1.2 @@ -842,47 +838,47 @@ packages: - supports-color dev: true - /@felte/common/1.1.3: + /@felte/common/1.1.4: resolution: { - integrity: sha512-47OJYohloUT9FOgXRxEIaSkaveDB70/eRv3+6MfYDZbc44XfojHJLiUOz3uSWRwfl8f2wonhkhIPCYkzIUltTg== + integrity: sha512-4jNB4EwRpaGZppwV/YqbGF7SVRwehWw+hyTGmw2N+pL86LuqVTTSrgVOGXwPaLTju1BxAptcoAXjxZbBf0XB4Q== } engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } dev: true - /@felte/core/1.3.6: + /@felte/core/1.3.7: resolution: { - integrity: sha512-/V1WG+YTz7gfbvQYeBazMSgaCA5qnNRJy+HP6jtdvi2f5Xm/iwVxZXoZZU5/Da5CmT0rYdkCDcHQe9IG0iTV1Q== + integrity: sha512-/AkIEZu/Yg/K+YEdnup5c3Bb0xyr9ONdZnS0us6V/b9DgfiEqbcm1xgglD/mtwh+IH7KOhIuQecjBdPQfpNViQ== } engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } dependencies: - '@felte/common': 1.1.3 + '@felte/common': 1.1.4 dev: true - /@felte/reporter-tippy/1.1.4_tippy.js@6.3.7: + /@felte/reporter-tippy/1.1.5_tippy.js@6.3.7: resolution: { - integrity: sha512-GRf//P1AzyktICp+3dNx22T3NrmZk2gAHnGY0CMz9SJwqbxou0abCykkPArft6MbBrCRczKb0BLsRReUv/kw5A== + integrity: sha512-boCEXGOkqTXRQa1l0t2Whjw/7wJHy16fA1Q3TNNj7XOiDAKYyzGfwbQn0kMR1jdzJTpSteB/xGb+ue1PenRDEQ== } engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } peerDependencies: tippy.js: ^6.0.0 dependencies: - '@felte/common': 1.1.3 + '@felte/common': 1.1.4 tippy.js: 6.3.7 dev: true - /@felte/validator-yup/1.0.10_yup@0.32.11: + /@felte/validator-yup/1.0.11_yup@0.32.11: resolution: { - integrity: sha512-Ps7HN/ZI+OMJkYlxf84qG4g1mzd0PZt8yXbs9t/yS2kiJQ3XywPDDF/uJ0hAL7qutCLrL/nIPDztlxskwKIP/A== + integrity: sha512-T3VQQtNGGSnnL2+IIeW+eQHqDmSphDzJA0Ho8ivhEWisWyaLlBn2RHx1Iiv9f6um10MFanbh+bxRNdQLr5TXdg== } engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } peerDependencies: yup: ^0.32.9 dependencies: - '@felte/common': 1.1.3 + '@felte/common': 1.1.4 yup: 0.32.11 dev: true @@ -1045,7 +1041,7 @@ packages: engines: { node: '>= 8' } dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.14.0 + fastq: 1.15.0 dev: true /@polka/url/1.0.0-next.21: @@ -1062,10 +1058,10 @@ packages: } dev: true - /@rollup/plugin-commonjs/23.0.7_rollup@3.7.5: + /@rollup/plugin-commonjs/24.0.1_rollup@3.10.1: resolution: { - integrity: sha512-hsSD5Qzyuat/swzrExGG5l7EuIlPhwTsT7KwKbSCQzIcJWjRxiimi/0tyMYY2bByitNb3i1p+6JWEDGa0NvT0Q== + integrity: sha512-15LsiWRZk4eOGqvrJyu3z3DaBu5BhXIMeWnijSRvd8irrrg9SHpQ1pH+BUK4H6Z9wL9yOxZJMTLU+Au86XHxow== } engines: { node: '>=14.0.0' } peerDependencies: @@ -1074,19 +1070,19 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.0.2_rollup@3.7.5 + '@rollup/pluginutils': 5.0.2_rollup@3.10.1 commondir: 1.0.1 estree-walker: 2.0.2 - glob: 8.0.3 + glob: 8.1.0 is-reference: 1.2.1 magic-string: 0.27.0 - rollup: 3.7.5 + rollup: 3.10.1 dev: true - /@rollup/plugin-json/5.0.2_rollup@3.7.5: + /@rollup/plugin-json/6.0.0_rollup@3.10.1: resolution: { - integrity: sha512-D1CoOT2wPvadWLhVcmpkDnesTzjhNIQRWLsc3fA49IFOP2Y84cFOOJ+nKGYedvXHKUsPeq07HR4hXpBBr+CHlA== + integrity: sha512-i/4C5Jrdr1XUarRhVu27EEwjt4GObltD7c+MkCIpO2QIbojw8MUs+CCTqOphQi3Qtg1FLmYt+l+6YeoIf51J7w== } engines: { node: '>=14.0.0' } peerDependencies: @@ -1095,11 +1091,11 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.0.2_rollup@3.7.5 - rollup: 3.7.5 + '@rollup/pluginutils': 5.0.2_rollup@3.10.1 + rollup: 3.10.1 dev: true - /@rollup/plugin-node-resolve/15.0.1_rollup@3.7.5: + /@rollup/plugin-node-resolve/15.0.1_rollup@3.10.1: resolution: { integrity: sha512-ReY88T7JhJjeRVbfCyNj+NXAG3IIsVMsX9b5/9jC98dRP8/yxlZdz7mHZbHk5zHr24wZZICS5AcXsFZAXYUQEg== @@ -1111,16 +1107,16 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.0.2_rollup@3.7.5 + '@rollup/pluginutils': 5.0.2_rollup@3.10.1 '@types/resolve': 1.20.2 deepmerge: 4.2.2 is-builtin-module: 3.2.0 is-module: 1.0.0 resolve: 1.22.1 - rollup: 3.7.5 + rollup: 3.10.1 dev: true - /@rollup/pluginutils/5.0.2_rollup@3.7.5: + /@rollup/pluginutils/5.0.2_rollup@3.10.1: resolution: { integrity: sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA== @@ -1135,79 +1131,76 @@ packages: '@types/estree': 1.0.0 estree-walker: 2.0.2 picomatch: 2.3.1 - rollup: 3.7.5 + rollup: 3.10.1 dev: true - /@sentry/browser/7.27.0: + /@sentry/browser/7.31.1: resolution: { - integrity: sha512-6z+q+omLqmdEvy+9i4j7xzIT6zgmWJnXqEiLCURnE34KsPq6wr6Nij1XHsTlApMcohOpPlo+C3nMTmz+oYUf5w== + integrity: sha512-Rg9F61S1tz1Dv3iUyyGP26bxoi7WJAG2+f2fBbSmFuJ+JTH4Jvu2/F1bBig8Dz01ejzVhbNSUUCfoDhSvksIsQ== } engines: { node: '>=8' } dependencies: - '@sentry/core': 7.27.0 - '@sentry/replay': 7.27.0_@sentry+browser@7.27.0 - '@sentry/types': 7.27.0 - '@sentry/utils': 7.27.0 + '@sentry/core': 7.31.1 + '@sentry/replay': 7.31.1 + '@sentry/types': 7.31.1 + '@sentry/utils': 7.31.1 tslib: 1.14.1 dev: true - /@sentry/core/7.27.0: + /@sentry/core/7.31.1: resolution: { - integrity: sha512-9WkHMllGNOr6S55N2HKJYJj/2mog5Kv6mjruqlcHHPSgcKFA8bjwBXJTghy6UzwtGd14cyS/X7h5AVUkvuXTMw== + integrity: sha512-quaNU6z8jabmatBTDi28Wpff2yzfWIp/IU4bbi2QOtEiCNT+TQJXqlRTRMu9xLrX7YzyKCL5X2gbit/85lyWUg== } engines: { node: '>=8' } dependencies: - '@sentry/types': 7.27.0 - '@sentry/utils': 7.27.0 + '@sentry/types': 7.31.1 + '@sentry/utils': 7.31.1 tslib: 1.14.1 dev: true - /@sentry/replay/7.27.0_@sentry+browser@7.27.0: + /@sentry/replay/7.31.1: resolution: { - integrity: sha512-Db1TBx4JZWWbsAXSzWfAE55d4ekpPspZheyF66j84xq8jaFxgmlMMO7wBD8P7CHuQ6VUkgwa4glMkcamj/sfSg== + integrity: sha512-sLArvwZn6IwA/bASctyhxN7LhdCXJvMmyTynRfmk7pzuNzBMc5CNlHeIsDpHrfQuH53IKicvl6cHnHyclu5DSA== } engines: { node: '>=12' } - peerDependencies: - '@sentry/browser': '>=7.24.0' dependencies: - '@sentry/browser': 7.27.0 - '@sentry/core': 7.27.0 - '@sentry/types': 7.27.0 - '@sentry/utils': 7.27.0 + '@sentry/core': 7.31.1 + '@sentry/types': 7.31.1 + '@sentry/utils': 7.31.1 dev: true - /@sentry/tracing/7.27.0: + /@sentry/tracing/7.31.1: resolution: { - integrity: sha512-lxAiGAajbZgZkaViwYuxavbu/c8JUp56XOYzSAi7Km9jGnTFLNF4JCoyG0INy7lXipFJiWSd0Xq3aej0Lb+Cvg== + integrity: sha512-kW6vNwddp2Ycq2JfTzveUEIRF9YQwvl7L6BBoOZt9oVnYlsPipEeyU2Q277LatHldr8hDo2tbz/vz2BQjO5GSw== } engines: { node: '>=8' } dependencies: - '@sentry/core': 7.27.0 - '@sentry/types': 7.27.0 - '@sentry/utils': 7.27.0 + '@sentry/core': 7.31.1 + '@sentry/types': 7.31.1 + '@sentry/utils': 7.31.1 tslib: 1.14.1 dev: true - /@sentry/types/7.27.0: + /@sentry/types/7.31.1: resolution: { - integrity: sha512-vapN3jchu3/WEMWQkrCOy2XDlOLj0l7IewYXKMr15Q21dlfM1QZMigU/r5rtYj5L8a2ISIHx+cRECxX5UIKH7w== + integrity: sha512-1uzr2l0AxEnxUX/S0EdmXUQ15/kDsam8Nbdw4Gai8SU764XwQgA/TTjoewVP597CDI/AHKan67Y630/Ylmkx9w== } engines: { node: '>=8' } dev: true - /@sentry/utils/7.27.0: + /@sentry/utils/7.31.1: resolution: { - integrity: sha512-8e5cmjbeuxETPxPEymyyGEYlBbJO1IMveTlcxkTFySPU6nNz2oAIiqPVHv2QgFJJvRv79/i/4Tyl5gFMOW0+AA== + integrity: sha512-ZsIPq29aNdP9q3R7qIzJhZ9WW+4DzE9g5SfGwx3UjTIxoRRBfdUJUbf7S+LKEdvCkKbyoDt6FLt5MiSJV43xBA== } engines: { node: '>=8' } dependencies: - '@sentry/types': 7.27.0 + '@sentry/types': 7.31.1 tslib: 1.14.1 dev: true @@ -1225,37 +1218,37 @@ packages: } dev: true - /@sveltejs/adapter-auto/1.0.0_@sveltejs+kit@1.0.1: + /@sveltejs/adapter-auto/1.0.2_@sveltejs+kit@1.2.2: resolution: { - integrity: sha512-yKyPvlLVua1bJ/42FrR3X041mFGdB4GzTZOAEoHUcNBRE5Mhx94+eqHpC3hNvAOiLEDcKfVO0ObyKSu7qldU+w== + integrity: sha512-UXpEO/gutERZnD+Z5Vi4J/ifD3WSRuCI7xwtLJTcKNQvJ6t5Xsj1X3Mw2F8Vv/XTUuxf7xPLYUgThU331r0Y9w== } peerDependencies: '@sveltejs/kit': ^1.0.0 dependencies: - '@sveltejs/kit': 1.0.1_svelte@3.55.0+vite@4.0.1 - import-meta-resolve: 2.2.0 + '@sveltejs/kit': 1.2.2_svelte@3.55.1+vite@4.0.4 + import-meta-resolve: 2.2.1 dev: true - /@sveltejs/adapter-node/1.0.0_@sveltejs+kit@1.0.1: + /@sveltejs/adapter-node/1.1.4_@sveltejs+kit@1.2.2: resolution: { - integrity: sha512-Q8an8CXEt5XlFbyT1NBM4xELNZD8xPVZfKCcgorCfPkeBP5ftDgPaK12JIokXA5koYJ54AJcNY4ams9TZ7yGxA== + integrity: sha512-3iEBqi1fXLXP9YIbVuz2LXajoebRJCmAFEQbN40DlxAnA7G+InxUgnqFun3q9gBMz2Qvd99K51g/HxWetXRe8Q== } peerDependencies: '@sveltejs/kit': ^1.0.0 dependencies: - '@rollup/plugin-commonjs': 23.0.7_rollup@3.7.5 - '@rollup/plugin-json': 5.0.2_rollup@3.7.5 - '@rollup/plugin-node-resolve': 15.0.1_rollup@3.7.5 - '@sveltejs/kit': 1.0.1_svelte@3.55.0+vite@4.0.1 - rollup: 3.7.5 + '@rollup/plugin-commonjs': 24.0.1_rollup@3.10.1 + '@rollup/plugin-json': 6.0.0_rollup@3.10.1 + '@rollup/plugin-node-resolve': 15.0.1_rollup@3.10.1 + '@sveltejs/kit': 1.2.2_svelte@3.55.1+vite@4.0.4 + rollup: 3.10.1 dev: true - /@sveltejs/kit/1.0.1_svelte@3.55.0+vite@4.0.1: + /@sveltejs/kit/1.2.2_svelte@3.55.1+vite@4.0.4: resolution: { - integrity: sha512-C41aCaDjA7xoUdsrc/lSdU1059UdLPIRE1vEIRRynzpMujNgp82bTMHkDosb6vykH6LrLf3tT2w2/5NYQhKYGQ== + integrity: sha512-aZUjAZ/6gWEYFQDrDNINuvOi6VxlG86kCcIDRWDIFJjI38Ueieo1fySb0j0d2VkQVrYXU7VqjTVMBZFix+hByA== } engines: { node: ^16.14 || >=18 } hasBin: true @@ -1264,10 +1257,10 @@ packages: svelte: ^3.54.0 vite: ^4.0.0 dependencies: - '@sveltejs/vite-plugin-svelte': 2.0.2_svelte@3.55.0+vite@4.0.1 + '@sveltejs/vite-plugin-svelte': 2.0.2_svelte@3.55.1+vite@4.0.4 '@types/cookie': 0.5.1 cookie: 0.5.0 - devalue: 4.2.0 + devalue: 4.2.2 esm-env: 1.0.0 kleur: 4.1.5 magic-string: 0.27.0 @@ -1275,15 +1268,15 @@ packages: sade: 1.8.1 set-cookie-parser: 2.5.1 sirv: 2.0.2 - svelte: 3.55.0 + svelte: 3.55.1 tiny-glob: 0.2.9 - undici: 5.14.0 - vite: 4.0.1_sass@1.57.0 + undici: 5.15.1 + vite: 4.0.4_sass@1.57.1 transitivePeerDependencies: - supports-color dev: true - /@sveltejs/vite-plugin-svelte/2.0.2_svelte@3.55.0+vite@4.0.1: + /@sveltejs/vite-plugin-svelte/2.0.2_svelte@3.55.1+vite@4.0.4: resolution: { integrity: sha512-xCEan0/NNpQuL0l5aS42FjwQ6wwskdxC3pW1OeFtEKNZwRg7Evro9lac9HesGP6TdFsTv2xMes5ASQVKbCacxg== @@ -1297,18 +1290,18 @@ packages: deepmerge: 4.2.2 kleur: 4.1.5 magic-string: 0.27.0 - svelte: 3.55.0 - svelte-hmr: 0.15.1_svelte@3.55.0 - vite: 4.0.1_sass@1.57.0 - vitefu: 0.2.4_vite@4.0.1 + svelte: 3.55.1 + svelte-hmr: 0.15.1_svelte@3.55.1 + vite: 4.0.4_sass@1.57.1 + vitefu: 0.2.4_vite@4.0.4 transitivePeerDependencies: - supports-color dev: true - /@tailwindcss/typography/0.5.8_tailwindcss@3.2.4: + /@tailwindcss/typography/0.5.9_tailwindcss@3.2.4: resolution: { - integrity: sha512-xGQEp8KXN8Sd8m6R4xYmwxghmswrd0cPnNI2Lc6fmrC3OojysTBJJGSIVwPV56q4t6THFUK3HJ0EaWwpglSxWw== + integrity: sha512-t8Sg3DyynFysV9f4JDOVISGsjazNb48AeIYQwcL+Bsq5uf4RYL75C1giZ43KISjeDGBaTN3Kxh7Xj/vRSMJUUg== } peerDependencies: tailwindcss: '>=3.0.0 || insiders' @@ -1317,7 +1310,7 @@ packages: lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 postcss-selector-parser: 6.0.10 - tailwindcss: 3.2.4_postcss@8.4.20 + tailwindcss: 3.2.4_postcss@8.4.21 dev: true /@transloadit/prettier-bytes/0.0.7: @@ -1391,10 +1384,10 @@ packages: } dev: true - /@types/node/18.11.16: + /@types/node/18.11.18: resolution: { - integrity: sha512-6T7P5bDkRhqRxrQtwj7vru+bWTpelgtcETAZEUSdq0YISKz8WKdoBukQLYQQ6DFHvU9JRsbFq0JH5C51X2ZdnA== + integrity: sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA== } dev: true @@ -1411,7 +1404,7 @@ packages: integrity: sha512-x5ilHXRxUPIMfjtM+1vf/GPTRWZ81nqscursm5gMznJeK9M0YnZ1c3bEvRLQ0zSSgedLx1J6MGL231ObQGGhaA== } dependencies: - '@types/node': 18.11.16 + '@types/node': 18.11.18 dev: true /@types/resolve/1.20.2: @@ -1427,7 +1420,7 @@ packages: integrity: sha512-BPdoIt1lfJ6B7rw35ncdwBZrAssjcwzI5LByIrYs+tpXlj/CAkuVdRsgZDdP4lq5EjyWzwxZCqAoFyHKFwp32g== } dependencies: - '@types/node': 18.11.16 + '@types/node': 18.11.18 dev: true /@types/semver/7.3.13: @@ -1458,10 +1451,10 @@ packages: } dev: true - /@typescript-eslint/eslint-plugin/5.46.1_qtjn2brzzhu6l3ntqnv7ocqkwu: + /@typescript-eslint/eslint-plugin/5.48.2_2hbgynhxm74hsb5vlfnyqgemdi: resolution: { - integrity: sha512-YpzNv3aayRBwjs4J3oz65eVLXc9xx0PDbIRisHj+dYhvBn02MjYOD96P8YGiWEIFBrojaUjxvkaUpakD82phsA== + integrity: sha512-sR0Gja9Ky1teIq4qJOl0nC+Tk64/uYdX+mi+5iB//MH8gwyx8e3SOyhEzeLZEFEEfCaLf8KJq+Bd/6je1t+CAg== } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } peerDependencies: @@ -1472,13 +1465,13 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/parser': 5.46.1_7yp3msae2ah6x4svoyguc3s57e - '@typescript-eslint/scope-manager': 5.46.1 - '@typescript-eslint/type-utils': 5.46.1_7yp3msae2ah6x4svoyguc3s57e - '@typescript-eslint/utils': 5.46.1_7yp3msae2ah6x4svoyguc3s57e + '@typescript-eslint/parser': 5.48.2_oz6z67amphy2h47f67wll6poxm + '@typescript-eslint/scope-manager': 5.48.2 + '@typescript-eslint/type-utils': 5.48.2_oz6z67amphy2h47f67wll6poxm + '@typescript-eslint/utils': 5.48.2_oz6z67amphy2h47f67wll6poxm debug: 4.3.4 - eslint: 8.30.0 - ignore: 5.2.1 + eslint: 8.32.0 + ignore: 5.2.4 natural-compare-lite: 1.4.0 regexpp: 3.2.0 semver: 7.3.8 @@ -1488,10 +1481,10 @@ packages: - supports-color dev: true - /@typescript-eslint/parser/5.46.1_7yp3msae2ah6x4svoyguc3s57e: + /@typescript-eslint/parser/5.48.2_oz6z67amphy2h47f67wll6poxm: resolution: { - integrity: sha512-RelQ5cGypPh4ySAtfIMBzBGyrNerQcmfA1oJvPj5f+H4jI59rl9xxpn4bonC0tQvUKOEN7eGBFWxFLK3Xepneg== + integrity: sha512-38zMsKsG2sIuM5Oi/olurGwYJXzmtdsHhn5mI/pQogP+BjYVkK5iRazCQ8RGS0V+YLk282uWElN70zAAUmaYHw== } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } peerDependencies: @@ -1501,31 +1494,31 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 5.46.1 - '@typescript-eslint/types': 5.46.1 - '@typescript-eslint/typescript-estree': 5.46.1_typescript@4.7.4 + '@typescript-eslint/scope-manager': 5.48.2 + '@typescript-eslint/types': 5.48.2 + '@typescript-eslint/typescript-estree': 5.48.2_typescript@4.7.4 debug: 4.3.4 - eslint: 8.30.0 + eslint: 8.32.0 typescript: 4.7.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/scope-manager/5.46.1: + /@typescript-eslint/scope-manager/5.48.2: resolution: { - integrity: sha512-iOChVivo4jpwUdrJZyXSMrEIM/PvsbbDOX1y3UCKjSgWn+W89skxWaYXACQfxmIGhPVpRWK/VWPYc+bad6smIA== + integrity: sha512-zEUFfonQid5KRDKoI3O+uP1GnrFd4tIHlvs+sTJXiWuypUWMuDaottkJuR612wQfOkjYbsaskSIURV9xo4f+Fw== } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } dependencies: - '@typescript-eslint/types': 5.46.1 - '@typescript-eslint/visitor-keys': 5.46.1 + '@typescript-eslint/types': 5.48.2 + '@typescript-eslint/visitor-keys': 5.48.2 dev: true - /@typescript-eslint/type-utils/5.46.1_7yp3msae2ah6x4svoyguc3s57e: + /@typescript-eslint/type-utils/5.48.2_oz6z67amphy2h47f67wll6poxm: resolution: { - integrity: sha512-V/zMyfI+jDmL1ADxfDxjZ0EMbtiVqj8LUGPAGyBkXXStWmCUErMpW873zEHsyguWCuq2iN4BrlWUkmuVj84yng== + integrity: sha512-QVWx7J5sPMRiOMJp5dYshPxABRoZV1xbRirqSk8yuIIsu0nvMTZesKErEA3Oix1k+uvsk8Cs8TGJ6kQ0ndAcew== } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } peerDependencies: @@ -1535,28 +1528,28 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 5.46.1_typescript@4.7.4 - '@typescript-eslint/utils': 5.46.1_7yp3msae2ah6x4svoyguc3s57e + '@typescript-eslint/typescript-estree': 5.48.2_typescript@4.7.4 + '@typescript-eslint/utils': 5.48.2_oz6z67amphy2h47f67wll6poxm debug: 4.3.4 - eslint: 8.30.0 + eslint: 8.32.0 tsutils: 3.21.0_typescript@4.7.4 typescript: 4.7.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/types/5.46.1: + /@typescript-eslint/types/5.48.2: resolution: { - integrity: sha512-Z5pvlCaZgU+93ryiYUwGwLl9AQVB/PQ1TsJ9NZ/gHzZjN7g9IAn6RSDkpCV8hqTwAiaj6fmCcKSQeBPlIpW28w== + integrity: sha512-hE7dA77xxu7ByBc6KCzikgfRyBCTst6dZQpwaTy25iMYOnbNljDT4hjhrGEJJ0QoMjrfqrx+j1l1B9/LtKeuqA== } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } dev: true - /@typescript-eslint/typescript-estree/5.46.1_typescript@4.7.4: + /@typescript-eslint/typescript-estree/5.48.2_typescript@4.7.4: resolution: { - integrity: sha512-j9W4t67QiNp90kh5Nbr1w92wzt+toiIsaVPnEblB2Ih2U9fqBTyqV9T3pYWZBRt6QoMh/zVWP59EpuCjc4VRBg== + integrity: sha512-bibvD3z6ilnoVxUBFEgkO0k0aFvUc4Cttt0dAreEr+nrAHhWzkO83PEVVuieK3DqcgL6VAK5dkzK8XUVja5Zcg== } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } peerDependencies: @@ -1565,8 +1558,8 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 5.46.1 - '@typescript-eslint/visitor-keys': 5.46.1 + '@typescript-eslint/types': 5.48.2 + '@typescript-eslint/visitor-keys': 5.48.2 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 @@ -1577,10 +1570,10 @@ packages: - supports-color dev: true - /@typescript-eslint/utils/5.46.1_7yp3msae2ah6x4svoyguc3s57e: + /@typescript-eslint/utils/5.48.2_oz6z67amphy2h47f67wll6poxm: resolution: { - integrity: sha512-RBdBAGv3oEpFojaCYT4Ghn4775pdjvwfDOfQ2P6qzNVgQOVrnSPe5/Pb88kv7xzYQjoio0eKHKB9GJ16ieSxvA== + integrity: sha512-2h18c0d7jgkw6tdKTlNaM7wyopbLRBiit8oAxoP89YnuBOzCZ8g8aBCaCqq7h208qUTroL7Whgzam7UY3HVLow== } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } peerDependencies: @@ -1588,26 +1581,26 @@ packages: dependencies: '@types/json-schema': 7.0.11 '@types/semver': 7.3.13 - '@typescript-eslint/scope-manager': 5.46.1 - '@typescript-eslint/types': 5.46.1 - '@typescript-eslint/typescript-estree': 5.46.1_typescript@4.7.4 - eslint: 8.30.0 + '@typescript-eslint/scope-manager': 5.48.2 + '@typescript-eslint/types': 5.48.2 + '@typescript-eslint/typescript-estree': 5.48.2_typescript@4.7.4 + eslint: 8.32.0 eslint-scope: 5.1.1 - eslint-utils: 3.0.0_eslint@8.30.0 + eslint-utils: 3.0.0_eslint@8.32.0 semver: 7.3.8 transitivePeerDependencies: - supports-color - typescript dev: true - /@typescript-eslint/visitor-keys/5.46.1: + /@typescript-eslint/visitor-keys/5.48.2: resolution: { - integrity: sha512-jczZ9noovXwy59KjRTk1OftT78pwygdcmCuBf8yMoWt/8O8l+6x2LSEze0E4TeepXK4MezW3zGSyoDRZK7Y9cg== + integrity: sha512-z9njZLSkwmjFWUelGEwEbdf4NwKvfHxvGC0OcGN1Hp/XNDIcJ7D5DpPNPv6x6/mFvc1tQHsaWmpD/a4gOvvCJQ== } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } dependencies: - '@typescript-eslint/types': 5.46.1 + '@typescript-eslint/types': 5.48.2 eslint-visitor-keys: 3.3.0 dev: true @@ -1778,7 +1771,7 @@ packages: } dev: true - /@uppy/svelte/3.0.1_zd5pxjxq5i7vlrqcggsxalsir4: + /@uppy/svelte/3.0.1_lzwna743apfraisht4o7qk5mce: resolution: { integrity: sha512-zIfW9zEWKYMI8N+sX9RHm5FW9a0CgezElsPfSfCm/kUb2GPx94O5TeEvMsvY6Si5fr+gXa6KM/1Q5LdwhJxQIQ== @@ -1796,7 +1789,7 @@ packages: '@uppy/drag-drop': 3.0.1_@uppy+core@3.0.4 '@uppy/progress-bar': 3.0.1_@uppy+core@3.0.4 '@uppy/status-bar': 3.0.1_@uppy+core@3.0.4 - svelte: 3.55.0 + svelte: 3.55.1 dev: true /@uppy/thumbnail-generator/3.0.2_@uppy+core@3.0.4: @@ -1946,7 +1939,7 @@ packages: engines: { node: '>=8' } dev: true - /autoprefixer/10.4.13_postcss@8.4.20: + /autoprefixer/10.4.13_postcss@8.4.21: resolution: { integrity: sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg== @@ -1957,11 +1950,11 @@ packages: postcss: ^8.1.0 dependencies: browserslist: 4.21.4 - caniuse-lite: 1.0.30001439 + caniuse-lite: 1.0.30001446 fraction.js: 4.2.0 normalize-range: 0.1.2 picocolors: 1.0.0 - postcss: 8.4.20 + postcss: 8.4.21 postcss-value-parser: 4.2.0 dev: true @@ -2031,7 +2024,7 @@ packages: engines: { node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 } hasBin: true dependencies: - caniuse-lite: 1.0.30001439 + caniuse-lite: 1.0.30001446 electron-to-chromium: 1.4.284 node-releases: 2.0.8 update-browserslist-db: 1.0.10_browserslist@4.21.4 @@ -2093,15 +2086,15 @@ packages: } dependencies: browserslist: 4.21.4 - caniuse-lite: 1.0.30001439 + caniuse-lite: 1.0.30001446 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 dev: true - /caniuse-lite/1.0.30001439: + /caniuse-lite/1.0.30001446: resolution: { - integrity: sha512-1MgUzEkoMO6gKfXflStpYgZDlFM7M/ck/bgfVCACO5vnAf0fXoNVHdWtqGU+MYca+4bL9Z5bpOVmR33cWW9G2A== + integrity: sha512-fEoga4PrImGcwUUGEol/PoFCSBnSkA9drgdkxXkJLsUBOnJ8rs3zDv6ApqYXGQFOyMPsjh79naWhF4DAxbF8rw== } dev: true @@ -2270,7 +2263,7 @@ packages: } dev: true - /css-declaration-sorter/6.3.1_postcss@8.4.20: + /css-declaration-sorter/6.3.1_postcss@8.4.21: resolution: { integrity: sha512-fBffmak0bPAnyqc/HO8C3n2sHrp9wcqQz6ES9koRF2/mLOVAx9zIQ3Y7R29sYCteTPqMCwns4WYQoCX91Xl3+w== @@ -2279,7 +2272,7 @@ packages: peerDependencies: postcss: ^8.0.9 dependencies: - postcss: 8.4.20 + postcss: 8.4.21 dev: true /css-select/4.3.0: @@ -2330,7 +2323,7 @@ packages: hasBin: true dev: true - /cssnano-preset-default/5.2.13_postcss@8.4.20: + /cssnano-preset-default/5.2.13_postcss@8.4.21: resolution: { integrity: sha512-PX7sQ4Pb+UtOWuz8A1d+Rbi+WimBIxJTRyBdgGp1J75VU0r/HFQeLnMYgHiCAp6AR4rqrc7Y4R+1Rjk3KJz6DQ== @@ -2339,39 +2332,39 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - css-declaration-sorter: 6.3.1_postcss@8.4.20 - cssnano-utils: 3.1.0_postcss@8.4.20 - postcss: 8.4.20 - postcss-calc: 8.2.4_postcss@8.4.20 - postcss-colormin: 5.3.0_postcss@8.4.20 - postcss-convert-values: 5.1.3_postcss@8.4.20 - postcss-discard-comments: 5.1.2_postcss@8.4.20 - postcss-discard-duplicates: 5.1.0_postcss@8.4.20 - postcss-discard-empty: 5.1.1_postcss@8.4.20 - postcss-discard-overridden: 5.1.0_postcss@8.4.20 - postcss-merge-longhand: 5.1.7_postcss@8.4.20 - postcss-merge-rules: 5.1.3_postcss@8.4.20 - postcss-minify-font-values: 5.1.0_postcss@8.4.20 - postcss-minify-gradients: 5.1.1_postcss@8.4.20 - postcss-minify-params: 5.1.4_postcss@8.4.20 - postcss-minify-selectors: 5.2.1_postcss@8.4.20 - postcss-normalize-charset: 5.1.0_postcss@8.4.20 - postcss-normalize-display-values: 5.1.0_postcss@8.4.20 - postcss-normalize-positions: 5.1.1_postcss@8.4.20 - postcss-normalize-repeat-style: 5.1.1_postcss@8.4.20 - postcss-normalize-string: 5.1.0_postcss@8.4.20 - postcss-normalize-timing-functions: 5.1.0_postcss@8.4.20 - postcss-normalize-unicode: 5.1.1_postcss@8.4.20 - postcss-normalize-url: 5.1.0_postcss@8.4.20 - postcss-normalize-whitespace: 5.1.1_postcss@8.4.20 - postcss-ordered-values: 5.1.3_postcss@8.4.20 - postcss-reduce-initial: 5.1.1_postcss@8.4.20 - postcss-reduce-transforms: 5.1.0_postcss@8.4.20 - postcss-svgo: 5.1.0_postcss@8.4.20 - postcss-unique-selectors: 5.1.1_postcss@8.4.20 + css-declaration-sorter: 6.3.1_postcss@8.4.21 + cssnano-utils: 3.1.0_postcss@8.4.21 + postcss: 8.4.21 + postcss-calc: 8.2.4_postcss@8.4.21 + postcss-colormin: 5.3.0_postcss@8.4.21 + postcss-convert-values: 5.1.3_postcss@8.4.21 + postcss-discard-comments: 5.1.2_postcss@8.4.21 + postcss-discard-duplicates: 5.1.0_postcss@8.4.21 + postcss-discard-empty: 5.1.1_postcss@8.4.21 + postcss-discard-overridden: 5.1.0_postcss@8.4.21 + postcss-merge-longhand: 5.1.7_postcss@8.4.21 + postcss-merge-rules: 5.1.3_postcss@8.4.21 + postcss-minify-font-values: 5.1.0_postcss@8.4.21 + postcss-minify-gradients: 5.1.1_postcss@8.4.21 + postcss-minify-params: 5.1.4_postcss@8.4.21 + postcss-minify-selectors: 5.2.1_postcss@8.4.21 + postcss-normalize-charset: 5.1.0_postcss@8.4.21 + postcss-normalize-display-values: 5.1.0_postcss@8.4.21 + postcss-normalize-positions: 5.1.1_postcss@8.4.21 + postcss-normalize-repeat-style: 5.1.1_postcss@8.4.21 + postcss-normalize-string: 5.1.0_postcss@8.4.21 + postcss-normalize-timing-functions: 5.1.0_postcss@8.4.21 + postcss-normalize-unicode: 5.1.1_postcss@8.4.21 + postcss-normalize-url: 5.1.0_postcss@8.4.21 + postcss-normalize-whitespace: 5.1.1_postcss@8.4.21 + postcss-ordered-values: 5.1.3_postcss@8.4.21 + postcss-reduce-initial: 5.1.1_postcss@8.4.21 + postcss-reduce-transforms: 5.1.0_postcss@8.4.21 + postcss-svgo: 5.1.0_postcss@8.4.21 + postcss-unique-selectors: 5.1.1_postcss@8.4.21 dev: true - /cssnano-utils/3.1.0_postcss@8.4.20: + /cssnano-utils/3.1.0_postcss@8.4.21: resolution: { integrity: sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA== @@ -2380,10 +2373,10 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.20 + postcss: 8.4.21 dev: true - /cssnano/5.1.14_postcss@8.4.20: + /cssnano/5.1.14_postcss@8.4.21: resolution: { integrity: sha512-Oou7ihiTocbKqi0J1bB+TRJIQX5RMR3JghA8hcWSw9mjBLQ5Y3RWqEDoYG3sRNlAbCIXpqMoZGbq5KDR3vdzgw== @@ -2392,9 +2385,9 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - cssnano-preset-default: 5.2.13_postcss@8.4.20 + cssnano-preset-default: 5.2.13_postcss@8.4.21 lilconfig: 2.0.6 - postcss: 8.4.20 + postcss: 8.4.21 yaml: 1.10.2 dev: true @@ -2474,10 +2467,10 @@ packages: minimist: 1.2.7 dev: true - /devalue/4.2.0: + /devalue/4.2.2: resolution: { - integrity: sha512-mbjoAaCL2qogBKgeFxFPOXAUsZchircF+B/79LD4sHH0+NHfYm8gZpQrskKDn5gENGt35+5OI1GUF7hLVnkPDw== + integrity: sha512-Pkwd8qrI9O20VJ14fBNHu+on99toTNZFbgWRpZbC0zbDXpnE2WHYcrC1fHhMsF/3Ee+2yaW7vEujAT7fCYgqrA== } dev: true @@ -2606,7 +2599,7 @@ packages: dependencies: '@socket.io/component-emitter': 3.1.0 debug: 4.3.4 - engine.io-parser: 5.0.4 + engine.io-parser: 5.0.6 ws: 8.2.3 xmlhttprequest-ssl: 2.0.0 transitivePeerDependencies: @@ -2615,10 +2608,10 @@ packages: - utf-8-validate dev: true - /engine.io-parser/5.0.4: + /engine.io-parser/5.0.6: resolution: { - integrity: sha512-+nVFp+5z1E3HcToEnO7ZIj3g+3k9389DvWtvJZz0T6/eOCPIyyxehFcedoYrZQrp0LgQbD9pPXhpMBKMd5QURg== + integrity: sha512-tjuoZDMAdEhVnSFleYPCtdL2GXwVTGtNjoeJd9IhIG3C1xs9uwxqRNEu5WpnDZCaozwVlK/nuQhpodhXSIMaxw== } engines: { node: '>=10.0.0' } dev: true @@ -2644,37 +2637,37 @@ packages: } dev: true - /esbuild/0.16.8: + /esbuild/0.16.17: resolution: { - integrity: sha512-RKxRaLYAI5b/IVJ5k8jK3bO2G7cch2ZIZFbfKHbBzpwsWt9+VChcBEndNISBBZ5c3WwekFfkfl11/2QfIGHgDw== + integrity: sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg== } engines: { node: '>=12' } hasBin: true requiresBuild: true optionalDependencies: - '@esbuild/android-arm': 0.16.8 - '@esbuild/android-arm64': 0.16.8 - '@esbuild/android-x64': 0.16.8 - '@esbuild/darwin-arm64': 0.16.8 - '@esbuild/darwin-x64': 0.16.8 - '@esbuild/freebsd-arm64': 0.16.8 - '@esbuild/freebsd-x64': 0.16.8 - '@esbuild/linux-arm': 0.16.8 - '@esbuild/linux-arm64': 0.16.8 - '@esbuild/linux-ia32': 0.16.8 - '@esbuild/linux-loong64': 0.16.8 - '@esbuild/linux-mips64el': 0.16.8 - '@esbuild/linux-ppc64': 0.16.8 - '@esbuild/linux-riscv64': 0.16.8 - '@esbuild/linux-s390x': 0.16.8 - '@esbuild/linux-x64': 0.16.8 - '@esbuild/netbsd-x64': 0.16.8 - '@esbuild/openbsd-x64': 0.16.8 - '@esbuild/sunos-x64': 0.16.8 - '@esbuild/win32-arm64': 0.16.8 - '@esbuild/win32-ia32': 0.16.8 - '@esbuild/win32-x64': 0.16.8 + '@esbuild/android-arm': 0.16.17 + '@esbuild/android-arm64': 0.16.17 + '@esbuild/android-x64': 0.16.17 + '@esbuild/darwin-arm64': 0.16.17 + '@esbuild/darwin-x64': 0.16.17 + '@esbuild/freebsd-arm64': 0.16.17 + '@esbuild/freebsd-x64': 0.16.17 + '@esbuild/linux-arm': 0.16.17 + '@esbuild/linux-arm64': 0.16.17 + '@esbuild/linux-ia32': 0.16.17 + '@esbuild/linux-loong64': 0.16.17 + '@esbuild/linux-mips64el': 0.16.17 + '@esbuild/linux-ppc64': 0.16.17 + '@esbuild/linux-riscv64': 0.16.17 + '@esbuild/linux-s390x': 0.16.17 + '@esbuild/linux-x64': 0.16.17 + '@esbuild/netbsd-x64': 0.16.17 + '@esbuild/openbsd-x64': 0.16.17 + '@esbuild/sunos-x64': 0.16.17 + '@esbuild/win32-arm64': 0.16.17 + '@esbuild/win32-ia32': 0.16.17 + '@esbuild/win32-x64': 0.16.17 dev: true /escalade/3.1.1: @@ -2693,19 +2686,19 @@ packages: engines: { node: '>=10' } dev: true - /eslint-config-prettier/8.5.0_eslint@8.30.0: + /eslint-config-prettier/8.6.0_eslint@8.32.0: resolution: { - integrity: sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q== + integrity: sha512-bAF0eLpLVqP5oEVUFKpMA+NnRFICwn9X8B5jrR9FcqnYBuPbqWEjTEspPWMj5ye6czoSLDweCzSo3Ko7gGrZaA== } hasBin: true peerDependencies: eslint: '>=7.0.0' dependencies: - eslint: 8.30.0 + eslint: 8.32.0 dev: true - /eslint-plugin-svelte3/4.0.0_khrjkzzv5v2x7orkj5o7sxbz3a: + /eslint-plugin-svelte3/4.0.0_tmo5zkisvhu6htudosk5k7m6pu: resolution: { integrity: sha512-OIx9lgaNzD02+MDFNLw0GEUbuovNcglg+wnd/UY0fbZmlQSz7GlQiQ1f+yX0XvC07XPcDOnFcichqI3xCwp71g== @@ -2714,8 +2707,8 @@ packages: eslint: '>=8.0.0' svelte: ^3.2.0 dependencies: - eslint: 8.30.0 - svelte: 3.55.0 + eslint: 8.32.0 + svelte: 3.55.1 dev: true /eslint-scope/5.1.1: @@ -2740,7 +2733,7 @@ packages: estraverse: 5.3.0 dev: true - /eslint-utils/3.0.0_eslint@8.30.0: + /eslint-utils/3.0.0_eslint@8.32.0: resolution: { integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== @@ -2749,7 +2742,7 @@ packages: peerDependencies: eslint: '>=5' dependencies: - eslint: 8.30.0 + eslint: 8.32.0 eslint-visitor-keys: 2.1.0 dev: true @@ -2769,15 +2762,15 @@ packages: engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } dev: true - /eslint/8.30.0: + /eslint/8.32.0: resolution: { - integrity: sha512-MGADB39QqYuzEGov+F/qb18r4i7DohCDOfatHaxI2iGlPuC65bwG2gxgO+7DkyL38dRFaRH7RaRAgU6JKL9rMQ== + integrity: sha512-nETVXpnthqKPFyuY2FNjz/bEd6nbosRgKbkgS/y1C7LJop96gYHWpiguLecMHQ2XCPxn77DS0P+68WzG6vkZSQ== } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } hasBin: true dependencies: - '@eslint/eslintrc': 1.4.0 + '@eslint/eslintrc': 1.4.1 '@humanwhocodes/config-array': 0.11.8 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 @@ -2788,7 +2781,7 @@ packages: doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.1.1 - eslint-utils: 3.0.0_eslint@8.30.0 + eslint-utils: 3.0.0_eslint@8.32.0 eslint-visitor-keys: 3.3.0 espree: 9.4.1 esquery: 1.4.0 @@ -2799,12 +2792,12 @@ packages: glob-parent: 6.0.2 globals: 13.19.0 grapheme-splitter: 1.0.4 - ignore: 5.2.1 + ignore: 5.2.4 import-fresh: 3.3.0 imurmurhash: 0.1.4 is-glob: 4.0.3 is-path-inside: 3.0.3 - js-sdsl: 4.2.0 + js-sdsl: 4.3.0 js-yaml: 4.1.0 json-stable-stringify-without-jsonify: 1.0.1 levn: 0.4.1 @@ -2932,26 +2925,26 @@ packages: } dev: true - /fastq/1.14.0: + /fastq/1.15.0: resolution: { - integrity: sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg== + integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== } dependencies: reusify: 1.0.4 dev: true - /felte/1.2.6_svelte@3.55.0: + /felte/1.2.7_svelte@3.55.1: resolution: { - integrity: sha512-0dcDPVkA09vkXFm+hiOFanWGGH1hwjqWDul02nRVjkMe4dtf6FxtyV8JSFY2Rxcq7rCoaYkn1Dv8oeRDRdVPsw== + integrity: sha512-VfCkYBODReCUrYeRMmJ9lRs7O/pC4PYKMTT7E2K6m9UzmTGpm3Ql3C518J3gUVVG5ZeEeSEifUaqmrAcaWB89w== } engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } peerDependencies: svelte: ^3.31.0 dependencies: - '@felte/core': 1.3.6 - svelte: 3.55.0 + '@felte/core': 1.3.7 + svelte: 3.55.1 dev: true /file-entry-cache/6.0.1: @@ -3118,17 +3111,17 @@ packages: path-is-absolute: 1.0.1 dev: true - /glob/8.0.3: + /glob/8.1.0: resolution: { - integrity: sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ== + integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== } engines: { node: '>=12' } dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 inherits: 2.0.4 - minimatch: 5.1.1 + minimatch: 5.1.6 once: 1.4.0 dev: true @@ -3159,7 +3152,7 @@ packages: array-union: 2.1.0 dir-glob: 3.0.1 fast-glob: 3.2.12 - ignore: 5.2.1 + ignore: 5.2.4 merge2: 1.4.1 slash: 3.0.0 dev: true @@ -3224,16 +3217,16 @@ packages: integrity: sha512-Pa5kFwaczXJAeHE56CHG2aWzFBMJNUNghf0Pm4SwSrEMps/PTKqW90EYWlIvhuYStf3Sn1K0vw+gH3+TLdkH1g== } dependencies: - '@babel/runtime': 7.20.6 + '@babel/runtime': 7.20.13 dev: true - /i18next/22.4.5: + /i18next/22.4.9: resolution: { - integrity: sha512-Kc+Ow0guRetUq+kv02tj0Yof9zveROPBAmJ8UxxNODLVBRSwsM4iD0Gw3BEieOmkWemF6clU3K1fbnCuTqiN2Q== + integrity: sha512-8gWMmUz460KJDQp/ob3MNUX84cVuDRY9PLFPnV8d+Qezz/6dkjxwOaH70xjrCNDO+JrUL25iXfAIN9wUkInNZw== } dependencies: - '@babel/runtime': 7.20.6 + '@babel/runtime': 7.20.13 dev: false /ieee754/1.2.1: @@ -3243,18 +3236,18 @@ packages: } dev: true - /ignore/5.2.1: + /ignore/5.2.4: resolution: { - integrity: sha512-d2qQLzTJ9WxQftPAuEQpSPmKqzxePjzVbpAVv62AQ64NTL+wR4JkrVqR/LqFsFEUsHDAiId52mJteHDFuDkElA== + integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== } engines: { node: '>= 4' } dev: true - /immutable/4.1.0: + /immutable/4.2.2: resolution: { - integrity: sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ== + integrity: sha512-fTMKDwtbvO5tldky9QZ2fMX7slR0mYpY5nbnFWYp0fOzDhHqhgIw9KoYgxLWsoNTS9ZHGauHj18DTyEw6BK3Og== } dev: true @@ -3269,10 +3262,10 @@ packages: resolve-from: 4.0.0 dev: true - /import-meta-resolve/2.2.0: + /import-meta-resolve/2.2.1: resolution: { - integrity: sha512-CpPOtiCHxP9HdtDM5F45tNiAe66Cqlv3f5uHoJjt+KlaLrUh9/Wz9vepADZ78SlqEo62aDWZtj9ydMGXV+CPnw== + integrity: sha512-C6lLL7EJPY44kBvA80gq4uMsVFw5x3oSKfuMl1cuZ2RkI5+UJqQXgn+6hlUew0y4ig7Ypt4CObAAIzU53Nfpuw== } dev: true @@ -3418,10 +3411,10 @@ packages: engines: { node: '>=12' } dev: true - /js-sdsl/4.2.0: + /js-sdsl/4.3.0: resolution: { - integrity: sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ== + integrity: sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ== } dev: true @@ -3464,10 +3457,10 @@ packages: engines: { node: '>=6' } dev: true - /konva/8.3.14: + /konva/8.4.2: resolution: { - integrity: sha512-6I/TZppgY3Frs//AvZ87YVQLFxLywitb8wLS3qMM+Ih9e4QcB5Yy8br6eq7DdUzxPdbsYTz1FQBHzNxs08M1Tw== + integrity: sha512-4VQcrgj/PI8ydJjtLcTuinHBE8o0WGX0YoRwbiN5mpYQiC52aOzJ0XbpKNDJdRvORQphK5LP+jeM0hQJEYIuUA== } dev: true @@ -3583,23 +3576,14 @@ packages: yallist: 4.0.0 dev: true - /luxon/3.1.1: + /luxon/3.2.1: resolution: { - integrity: sha512-Ah6DloGmvseB/pX1cAmjbFvyU/pKuwQMQqz7d0yvuDlVYLTs2WeDHQMpC8tGjm1da+BriHROW/OEIT/KfYg6xw== + integrity: sha512-QrwPArQCNLAKGO/C+ZIilgIuDnEnKx5QYODdDtbFaxzsbZcc/a7WFq7MhsVYgRlwawLtvOUESTlfJ+hc/USqPg== } engines: { node: '>=12' } dev: true - /magic-string/0.25.9: - resolution: - { - integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ== - } - dependencies: - sourcemap-codec: 1.4.8 - dev: true - /magic-string/0.27.0: resolution: { @@ -3610,10 +3594,10 @@ packages: '@jridgewell/sourcemap-codec': 1.4.14 dev: true - /mapbox-gl/2.11.1: + /mapbox-gl/2.12.0: resolution: { - integrity: sha512-UzPi3m9i4t95M234sPmL3n9q2XpyHoyIFMXDjuJP+3OmzROwYUMzLcNMnPHrOmgwGicg99dr7rEJGYyEGr9i+A== + integrity: sha512-T60fbDV1ULikrhwPdRbpeQOF02+Nhv7QgJ4uGfKWybkoH+DdCxNWTmT7OFiKR0uz9ed98TAodYiHZQAQtFdwwQ== } dependencies: '@mapbox/geojson-rewind': 0.5.2 @@ -3646,7 +3630,7 @@ packages: } dev: true - /mdsvex/0.10.6_svelte@3.55.0: + /mdsvex/0.10.6_svelte@3.55.1: resolution: { integrity: sha512-aGRDY0r5jx9+OOgFdyB9Xm3EBr9OUmcrTDPWLB7a7g8VPRxzPy4MOBmcVYgz7ErhAJ7bZ/coUoj6aHio3x/2mA== @@ -3657,7 +3641,7 @@ packages: '@types/unist': 2.0.6 prism-svelte: 0.4.7 prismjs: 1.29.0 - svelte: 3.55.0 + svelte: 3.55.1 vfile-message: 2.0.4 dev: true @@ -3722,10 +3706,10 @@ packages: brace-expansion: 1.1.11 dev: true - /minimatch/5.1.1: + /minimatch/5.1.6: resolution: { - integrity: sha512-362NP+zlprccbEt/SkxKfRMHnNY85V74mVnpUpNyr3F35covl09Kec7/sEFLt3RA4oXmewtoaanoIf67SE5Y5g== + integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== } engines: { node: '>=10' } dependencies: @@ -4042,7 +4026,7 @@ packages: } dependencies: deepmerge: 4.2.2 - konva: 8.3.14 + konva: 8.4.2 typescript: 4.7.4 dev: true @@ -4062,7 +4046,7 @@ packages: engines: { node: '>=10.13.0' } dev: true - /postcss-calc/8.2.4_postcss@8.4.20: + /postcss-calc/8.2.4_postcss@8.4.21: resolution: { integrity: sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q== @@ -4070,12 +4054,12 @@ packages: peerDependencies: postcss: ^8.2.2 dependencies: - postcss: 8.4.20 + postcss: 8.4.21 postcss-selector-parser: 6.0.11 postcss-value-parser: 4.2.0 dev: true - /postcss-colormin/5.3.0_postcss@8.4.20: + /postcss-colormin/5.3.0_postcss@8.4.21: resolution: { integrity: sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg== @@ -4087,11 +4071,11 @@ packages: browserslist: 4.21.4 caniuse-api: 3.0.0 colord: 2.9.3 - postcss: 8.4.20 + postcss: 8.4.21 postcss-value-parser: 4.2.0 dev: true - /postcss-convert-values/5.1.3_postcss@8.4.20: + /postcss-convert-values/5.1.3_postcss@8.4.21: resolution: { integrity: sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA== @@ -4101,11 +4085,11 @@ packages: postcss: ^8.2.15 dependencies: browserslist: 4.21.4 - postcss: 8.4.20 + postcss: 8.4.21 postcss-value-parser: 4.2.0 dev: true - /postcss-discard-comments/5.1.2_postcss@8.4.20: + /postcss-discard-comments/5.1.2_postcss@8.4.21: resolution: { integrity: sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ== @@ -4114,10 +4098,10 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.20 + postcss: 8.4.21 dev: true - /postcss-discard-duplicates/5.1.0_postcss@8.4.20: + /postcss-discard-duplicates/5.1.0_postcss@8.4.21: resolution: { integrity: sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw== @@ -4126,10 +4110,10 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.20 + postcss: 8.4.21 dev: true - /postcss-discard-empty/5.1.1_postcss@8.4.20: + /postcss-discard-empty/5.1.1_postcss@8.4.21: resolution: { integrity: sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A== @@ -4138,10 +4122,10 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.20 + postcss: 8.4.21 dev: true - /postcss-discard-overridden/5.1.0_postcss@8.4.20: + /postcss-discard-overridden/5.1.0_postcss@8.4.21: resolution: { integrity: sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw== @@ -4150,10 +4134,10 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.20 + postcss: 8.4.21 dev: true - /postcss-import/14.1.0_postcss@8.4.20: + /postcss-import/14.1.0_postcss@8.4.21: resolution: { integrity: sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw== @@ -4162,13 +4146,13 @@ packages: peerDependencies: postcss: ^8.0.0 dependencies: - postcss: 8.4.20 + postcss: 8.4.21 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.1 dev: true - /postcss-js/4.0.0_postcss@8.4.20: + /postcss-js/4.0.0_postcss@8.4.21: resolution: { integrity: sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ== @@ -4178,10 +4162,10 @@ packages: postcss: ^8.3.3 dependencies: camelcase-css: 2.0.1 - postcss: 8.4.20 + postcss: 8.4.21 dev: true - /postcss-load-config/3.1.4_postcss@8.4.20: + /postcss-load-config/3.1.4_postcss@8.4.21: resolution: { integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg== @@ -4197,11 +4181,11 @@ packages: optional: true dependencies: lilconfig: 2.0.6 - postcss: 8.4.20 + postcss: 8.4.21 yaml: 1.10.2 dev: true - /postcss-load-config/4.0.1_postcss@8.4.20: + /postcss-load-config/4.0.1_postcss@8.4.21: resolution: { integrity: sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA== @@ -4217,11 +4201,11 @@ packages: optional: true dependencies: lilconfig: 2.0.6 - postcss: 8.4.20 - yaml: 2.1.3 + postcss: 8.4.21 + yaml: 2.2.1 dev: true - /postcss-merge-longhand/5.1.7_postcss@8.4.20: + /postcss-merge-longhand/5.1.7_postcss@8.4.21: resolution: { integrity: sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ== @@ -4230,12 +4214,12 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.20 + postcss: 8.4.21 postcss-value-parser: 4.2.0 - stylehacks: 5.1.1_postcss@8.4.20 + stylehacks: 5.1.1_postcss@8.4.21 dev: true - /postcss-merge-rules/5.1.3_postcss@8.4.20: + /postcss-merge-rules/5.1.3_postcss@8.4.21: resolution: { integrity: sha512-LbLd7uFC00vpOuMvyZop8+vvhnfRGpp2S+IMQKeuOZZapPRY4SMq5ErjQeHbHsjCUgJkRNrlU+LmxsKIqPKQlA== @@ -4246,12 +4230,12 @@ packages: dependencies: browserslist: 4.21.4 caniuse-api: 3.0.0 - cssnano-utils: 3.1.0_postcss@8.4.20 - postcss: 8.4.20 + cssnano-utils: 3.1.0_postcss@8.4.21 + postcss: 8.4.21 postcss-selector-parser: 6.0.11 dev: true - /postcss-minify-font-values/5.1.0_postcss@8.4.20: + /postcss-minify-font-values/5.1.0_postcss@8.4.21: resolution: { integrity: sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA== @@ -4260,11 +4244,11 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.20 + postcss: 8.4.21 postcss-value-parser: 4.2.0 dev: true - /postcss-minify-gradients/5.1.1_postcss@8.4.20: + /postcss-minify-gradients/5.1.1_postcss@8.4.21: resolution: { integrity: sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw== @@ -4274,12 +4258,12 @@ packages: postcss: ^8.2.15 dependencies: colord: 2.9.3 - cssnano-utils: 3.1.0_postcss@8.4.20 - postcss: 8.4.20 + cssnano-utils: 3.1.0_postcss@8.4.21 + postcss: 8.4.21 postcss-value-parser: 4.2.0 dev: true - /postcss-minify-params/5.1.4_postcss@8.4.20: + /postcss-minify-params/5.1.4_postcss@8.4.21: resolution: { integrity: sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw== @@ -4289,12 +4273,12 @@ packages: postcss: ^8.2.15 dependencies: browserslist: 4.21.4 - cssnano-utils: 3.1.0_postcss@8.4.20 - postcss: 8.4.20 + cssnano-utils: 3.1.0_postcss@8.4.21 + postcss: 8.4.21 postcss-value-parser: 4.2.0 dev: true - /postcss-minify-selectors/5.2.1_postcss@8.4.20: + /postcss-minify-selectors/5.2.1_postcss@8.4.21: resolution: { integrity: sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg== @@ -4303,11 +4287,11 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.20 + postcss: 8.4.21 postcss-selector-parser: 6.0.11 dev: true - /postcss-nested/6.0.0_postcss@8.4.20: + /postcss-nested/6.0.0_postcss@8.4.21: resolution: { integrity: sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w== @@ -4316,11 +4300,11 @@ packages: peerDependencies: postcss: ^8.2.14 dependencies: - postcss: 8.4.20 + postcss: 8.4.21 postcss-selector-parser: 6.0.11 dev: true - /postcss-normalize-charset/5.1.0_postcss@8.4.20: + /postcss-normalize-charset/5.1.0_postcss@8.4.21: resolution: { integrity: sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg== @@ -4329,10 +4313,10 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.20 + postcss: 8.4.21 dev: true - /postcss-normalize-display-values/5.1.0_postcss@8.4.20: + /postcss-normalize-display-values/5.1.0_postcss@8.4.21: resolution: { integrity: sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA== @@ -4341,11 +4325,11 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.20 + postcss: 8.4.21 postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-positions/5.1.1_postcss@8.4.20: + /postcss-normalize-positions/5.1.1_postcss@8.4.21: resolution: { integrity: sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg== @@ -4354,11 +4338,11 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.20 + postcss: 8.4.21 postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-repeat-style/5.1.1_postcss@8.4.20: + /postcss-normalize-repeat-style/5.1.1_postcss@8.4.21: resolution: { integrity: sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g== @@ -4367,11 +4351,11 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.20 + postcss: 8.4.21 postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-string/5.1.0_postcss@8.4.20: + /postcss-normalize-string/5.1.0_postcss@8.4.21: resolution: { integrity: sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w== @@ -4380,11 +4364,11 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.20 + postcss: 8.4.21 postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-timing-functions/5.1.0_postcss@8.4.20: + /postcss-normalize-timing-functions/5.1.0_postcss@8.4.21: resolution: { integrity: sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg== @@ -4393,11 +4377,11 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.20 + postcss: 8.4.21 postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-unicode/5.1.1_postcss@8.4.20: + /postcss-normalize-unicode/5.1.1_postcss@8.4.21: resolution: { integrity: sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA== @@ -4407,11 +4391,11 @@ packages: postcss: ^8.2.15 dependencies: browserslist: 4.21.4 - postcss: 8.4.20 + postcss: 8.4.21 postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-url/5.1.0_postcss@8.4.20: + /postcss-normalize-url/5.1.0_postcss@8.4.21: resolution: { integrity: sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew== @@ -4421,11 +4405,11 @@ packages: postcss: ^8.2.15 dependencies: normalize-url: 6.1.0 - postcss: 8.4.20 + postcss: 8.4.21 postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-whitespace/5.1.1_postcss@8.4.20: + /postcss-normalize-whitespace/5.1.1_postcss@8.4.21: resolution: { integrity: sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA== @@ -4434,11 +4418,11 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.20 + postcss: 8.4.21 postcss-value-parser: 4.2.0 dev: true - /postcss-ordered-values/5.1.3_postcss@8.4.20: + /postcss-ordered-values/5.1.3_postcss@8.4.21: resolution: { integrity: sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ== @@ -4447,12 +4431,12 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - cssnano-utils: 3.1.0_postcss@8.4.20 - postcss: 8.4.20 + cssnano-utils: 3.1.0_postcss@8.4.21 + postcss: 8.4.21 postcss-value-parser: 4.2.0 dev: true - /postcss-reduce-initial/5.1.1_postcss@8.4.20: + /postcss-reduce-initial/5.1.1_postcss@8.4.21: resolution: { integrity: sha512-//jeDqWcHPuXGZLoolFrUXBDyuEGbr9S2rMo19bkTIjBQ4PqkaO+oI8wua5BOUxpfi97i3PCoInsiFIEBfkm9w== @@ -4463,10 +4447,10 @@ packages: dependencies: browserslist: 4.21.4 caniuse-api: 3.0.0 - postcss: 8.4.20 + postcss: 8.4.21 dev: true - /postcss-reduce-transforms/5.1.0_postcss@8.4.20: + /postcss-reduce-transforms/5.1.0_postcss@8.4.21: resolution: { integrity: sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ== @@ -4475,7 +4459,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.20 + postcss: 8.4.21 postcss-value-parser: 4.2.0 dev: true @@ -4501,7 +4485,7 @@ packages: util-deprecate: 1.0.2 dev: true - /postcss-svgo/5.1.0_postcss@8.4.20: + /postcss-svgo/5.1.0_postcss@8.4.21: resolution: { integrity: sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA== @@ -4510,12 +4494,12 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.20 + postcss: 8.4.21 postcss-value-parser: 4.2.0 svgo: 2.8.0 dev: true - /postcss-unique-selectors/5.1.1_postcss@8.4.20: + /postcss-unique-selectors/5.1.1_postcss@8.4.21: resolution: { integrity: sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA== @@ -4524,7 +4508,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.20 + postcss: 8.4.21 postcss-selector-parser: 6.0.11 dev: true @@ -4535,10 +4519,10 @@ packages: } dev: true - /postcss/8.4.20: + /postcss/8.4.21: resolution: { - integrity: sha512-6Q04AXR1212bXr5fh03u8aAwbLxAQNGQ/Q1LNa0VfOI06ZAlhPHtQvE4OIdpj4kLThXilalPnmDSOD65DcHt+g== + integrity: sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg== } engines: { node: ^10 || ^12 || >=14 } dependencies: @@ -4569,7 +4553,7 @@ packages: engines: { node: '>= 0.8.0' } dev: true - /prettier-plugin-svelte/2.9.0_ajxj753sv7dbwexjherrch25ta: + /prettier-plugin-svelte/2.9.0_kdmmghgdi3ngrsq6otxkjilbry: resolution: { integrity: sha512-3doBi5NO4IVgaNPtwewvrgPpqAcvNv0NwJNflr76PIGgi9nf1oguQV1Hpdm9TI2ALIQVn/9iIwLpBO5UcD2Jiw== @@ -4578,14 +4562,14 @@ packages: prettier: ^1.16.4 || ^2.0.0 svelte: ^3.2.0 dependencies: - prettier: 2.8.1 - svelte: 3.55.0 + prettier: 2.8.3 + svelte: 3.55.1 dev: true - /prettier/2.8.1: + /prettier/2.8.3: resolution: { - integrity: sha512-lqGoSJBQNJidqCHE80vqZJHWHRFoNYsSpP9AjFhlhi9ODCJA541svILes/+/1GM3VaL/abZi7cpFzOpdR9UPKg== + integrity: sha512-tJ/oJ4amDihPoufT5sM0Z1SKEuKay8LfVAMlbbhnnkvt6BUserZylqo2PN+p9KeljLr0OHa2rXHU1T8reeoTrw== } engines: { node: '>=10.13.0' } hasBin: true @@ -4628,10 +4612,10 @@ packages: } dev: true - /punycode/2.1.1: + /punycode/2.3.0: resolution: { - integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== } engines: { node: '>=6' } dev: true @@ -4777,10 +4761,10 @@ packages: glob: 7.2.3 dev: true - /rollup/3.7.5: + /rollup/3.10.1: resolution: { - integrity: sha512-z0ZbqHBtS/et2EEUKMrAl2CoSdwN7ZPzL17UMiKN9RjjqHShTlv7F9J6ZJZJNREYjBh3TvBrdfjkFDIXFNeuiQ== + integrity: sha512-3Er+yel3bZbZX1g2kjVM+FW+RUWDxbG87fcqFM5/9HbPCTpbVp6JOLn7jlxnNlbu7s/N/uDA4EV/91E2gWnxzw== } engines: { node: '>=14.18.0', npm: '>=8.0.0' } hasBin: true @@ -4826,16 +4810,16 @@ packages: rimraf: 2.7.1 dev: true - /sass/1.57.0: + /sass/1.57.1: resolution: { - integrity: sha512-IZNEJDTK1cF5B1cGA593TPAV/1S0ysUDxq9XHjX/+SMy0QfUny+nfUsq5ZP7wWSl4eEf7wDJcEZ8ABYFmh3m/w== + integrity: sha512-O2+LwLS79op7GI0xZ8fqzF7X2m/m8WFfI02dHOdsK5R2ECeS5F62zrwg/relM1rjSLy7Vd/DiMNIvPrQGsA0jw== } engines: { node: '>=12.0.0' } hasBin: true dependencies: chokidar: 3.5.3 - immutable: 4.1.0 + immutable: 4.2.2 source-map-js: 1.0.2 dev: true @@ -4912,17 +4896,17 @@ packages: '@socket.io/component-emitter': 3.1.0 debug: 4.3.4 engine.io-client: 6.2.3 - socket.io-parser: 4.2.1 + socket.io-parser: 4.2.2 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate dev: true - /socket.io-parser/4.2.1: + /socket.io-parser/4.2.2: resolution: { - integrity: sha512-V4GrkLy+HeF1F/en3SpUaM+7XxYXpuMUWLGde1kSSh5nQMN4hLrbPIkD+otwh6q9R6NOQBN4AMaOZ2zVjui82g== + integrity: sha512-DJtziuKypFkMMHCm2uIshOYC7QaylbtzQwiMYDuCKy3OPkjLzu4B2vAhTlqipRHHzrI0NJeBAizTK7X+6m1jVw== } engines: { node: '>=10.0.0' } dependencies: @@ -4932,17 +4916,17 @@ packages: - supports-color dev: true - /sorcery/0.10.0: + /sorcery/0.11.0: resolution: { - integrity: sha512-R5ocFmKZQFfSTstfOtHjJuAwbpGyf9qjQa1egyhvXSbM7emjrtLXtGdZsDJDABC85YBfVvrOiGWKSYXPKdvP1g== + integrity: sha512-J69LQ22xrQB1cIFJhPfgtLuI6BpWRiWu1Y3vSsIwK/eAScqJxd/+CJlUuHQRdX2C9NGFamq+KqNywGgaThwfHw== } hasBin: true dependencies: + '@jridgewell/sourcemap-codec': 1.4.14 buffer-crc32: 0.2.13 minimist: 1.2.7 sander: 0.5.1 - sourcemap-codec: 1.4.8 dev: true /sortablejs/1.15.0: @@ -4968,14 +4952,6 @@ packages: engines: { node: '>=0.10.0' } dev: true - /sourcemap-codec/1.4.8: - resolution: - { - integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== - } - deprecated: Please use @jridgewell/sourcemap-codec instead - dev: true - /ssr-window/4.0.2: resolution: { @@ -5039,7 +5015,7 @@ packages: engines: { node: '>=8' } dev: true - /stylehacks/5.1.1_postcss@8.4.20: + /stylehacks/5.1.1_postcss@8.4.21: resolution: { integrity: sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw== @@ -5049,7 +5025,7 @@ packages: postcss: ^8.2.15 dependencies: browserslist: 4.21.4 - postcss: 8.4.20 + postcss: 8.4.21 postcss-selector-parser: 6.0.11 dev: true @@ -5080,14 +5056,14 @@ packages: engines: { node: '>= 0.4' } dev: true - /svelte-check/2.10.2_qg5vvvck24g2hgmv67rlxrwpfu: + /svelte-check/3.0.2_mraflicfyjy3x4taxigiwsr23i: resolution: { - integrity: sha512-h1Tuiir0m8J5yqN+Vx6qgKKk1L871e6a9o7rMwVWfu8Qs6Wg7x2R+wcxS3SO3VpW5JCxCat90rxPsZMYgz+HaQ== + integrity: sha512-DkhKhV0Jt0gh7q9DBB26+J2Vfb9y4/4JWxnbkXBZha7542LOhwvj3edJFjyJ+xjdaXyInZ+YRRYc3V6wytP2ew== } hasBin: true peerDependencies: - svelte: ^3.24.0 + svelte: ^3.55.0 dependencies: '@jridgewell/trace-mapping': 0.3.17 chokidar: 3.5.3 @@ -5095,14 +5071,13 @@ packages: import-fresh: 3.3.0 picocolors: 1.0.0 sade: 1.8.1 - svelte: 3.55.0 - svelte-preprocess: 4.10.7_yobe4dakbqoaknvfcvu2g5hg6u - typescript: 4.7.4 + svelte: 3.55.1 + svelte-preprocess: 5.0.1_kmnkm63hwcse26ffcjvrch7uda + typescript: 4.9.4 transitivePeerDependencies: - '@babel/core' - coffeescript - less - - node-sass - postcss - postcss-load-config - pug @@ -5111,7 +5086,7 @@ packages: - sugarss dev: true - /svelte-hmr/0.15.1_svelte@3.55.0: + /svelte-hmr/0.15.1_svelte@3.55.1: resolution: { integrity: sha512-BiKB4RZ8YSwRKCNVdNxK/GfY+r4Kjgp9jCLEy0DuqAKfmQtpL38cQK3afdpjw4sqSs4PLi3jIPJIFp259NkZtA== @@ -5120,70 +5095,13 @@ packages: peerDependencies: svelte: '>=3.19.0' dependencies: - svelte: 3.55.0 + svelte: 3.55.1 dev: true - /svelte-preprocess/4.10.7_yobe4dakbqoaknvfcvu2g5hg6u: + /svelte-preprocess/5.0.1_kmnkm63hwcse26ffcjvrch7uda: resolution: { - integrity: sha512-sNPBnqYD6FnmdBrUmBCaqS00RyCsCpj2BG58A1JBswNF7b0OKviwxqVrOL/CKyJrLSClrSeqQv5BXNg2RUbPOw== - } - engines: { node: '>= 9.11.2' } - requiresBuild: true - peerDependencies: - '@babel/core': ^7.10.2 - coffeescript: ^2.5.1 - less: ^3.11.3 || ^4.0.0 - node-sass: '*' - postcss: ^7 || ^8 - postcss-load-config: ^2.1.0 || ^3.0.0 || ^4.0.0 - pug: ^3.0.0 - sass: ^1.26.8 - stylus: ^0.55.0 - sugarss: ^2.0.0 - svelte: ^3.23.0 - typescript: ^3.9.5 || ^4.0.0 - peerDependenciesMeta: - '@babel/core': - optional: true - coffeescript: - optional: true - less: - optional: true - node-sass: - optional: true - postcss: - optional: true - postcss-load-config: - optional: true - pug: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - typescript: - optional: true - dependencies: - '@types/pug': 2.0.6 - '@types/sass': 1.43.1 - detect-indent: 6.1.0 - magic-string: 0.25.9 - postcss: 8.4.20 - postcss-load-config: 4.0.1_postcss@8.4.20 - sass: 1.57.0 - sorcery: 0.10.0 - strip-indent: 3.0.0 - svelte: 3.55.0 - typescript: 4.7.4 - dev: true - - /svelte-preprocess/5.0.0_yobe4dakbqoaknvfcvu2g5hg6u: - resolution: - { - integrity: sha512-q7lpa7i2FBu8Pa+G0MmuQQWETBwCKgsGmuq1Sf6n8q4uaG9ZLcLP0Y+etC6bF4sE6EbLxfiI38zV6RfPe3RSfg== + integrity: sha512-0HXyhCoc9rsW4zGOgtInylC6qj259E1hpFnJMJWTf+aIfeqh4O/QHT31KT2hvPEqQfdjmqBR/kO2JDkkciBLrQ== } engines: { node: '>= 14.10.0' } requiresBuild: true @@ -5225,12 +5143,66 @@ packages: '@types/sass': 1.43.1 detect-indent: 6.1.0 magic-string: 0.27.0 - postcss: 8.4.20 - postcss-load-config: 4.0.1_postcss@8.4.20 - sass: 1.57.0 - sorcery: 0.10.0 + postcss: 8.4.21 + postcss-load-config: 4.0.1_postcss@8.4.21 + sass: 1.57.1 + sorcery: 0.11.0 strip-indent: 3.0.0 - svelte: 3.55.0 + svelte: 3.55.1 + typescript: 4.9.4 + dev: true + + /svelte-preprocess/5.0.1_uaodilper24tejwwmnc3sygxui: + resolution: + { + integrity: sha512-0HXyhCoc9rsW4zGOgtInylC6qj259E1hpFnJMJWTf+aIfeqh4O/QHT31KT2hvPEqQfdjmqBR/kO2JDkkciBLrQ== + } + engines: { node: '>= 14.10.0' } + requiresBuild: true + peerDependencies: + '@babel/core': ^7.10.2 + coffeescript: ^2.5.1 + less: ^3.11.3 || ^4.0.0 + postcss: ^7 || ^8 + postcss-load-config: ^2.1.0 || ^3.0.0 || ^4.0.0 + pug: ^3.0.0 + sass: ^1.26.8 + stylus: ^0.55.0 + sugarss: ^2.0.0 || ^3.0.0 || ^4.0.0 + svelte: ^3.23.0 + typescript: ^3.9.5 || ^4.0.0 + peerDependenciesMeta: + '@babel/core': + optional: true + coffeescript: + optional: true + less: + optional: true + postcss: + optional: true + postcss-load-config: + optional: true + pug: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + typescript: + optional: true + dependencies: + '@types/pug': 2.0.6 + '@types/sass': 1.43.1 + detect-indent: 6.1.0 + magic-string: 0.27.0 + postcss: 8.4.21 + postcss-load-config: 4.0.1_postcss@8.4.21 + sass: 1.57.1 + sorcery: 0.11.0 + strip-indent: 3.0.0 + svelte: 3.55.1 typescript: 4.7.4 dev: true @@ -5250,10 +5222,10 @@ packages: tippy.js: 6.3.7 dev: true - /svelte/3.55.0: + /svelte/3.55.1: resolution: { - integrity: sha512-uGu2FVMlOuey4JoKHKrpZFkoYyj0VLjJdz47zX5+gVK5odxHM40RVhar9/iK2YFRVxvfg9FkhfVlR0sjeIrOiA== + integrity: sha512-S+87/P0Ve67HxKkEV23iCdAh/SX1xiSfjF1HOglno/YTbSTW7RniICMCofWGdJJbdjw3S+0PfFb1JtGfTXE0oQ== } engines: { node: '>= 8' } dev: true @@ -5275,10 +5247,10 @@ packages: stable: 0.1.8 dev: true - /swiper/8.4.5: + /swiper/8.4.6: resolution: { - integrity: sha512-zveyEFBBv4q1sVkbJHnuH4xCtarKieavJ4SxP0QEHvdpPLJRuD7j/Xg38IVVLbp7Db6qrPsLUePvxohYx39Agw== + integrity: sha512-HACW035vBz2T6Kfut23EAzXhcDpgR8doX+wjq0ZUvJgS5SQApGrV885DAPLBFnmPUISsAhNSVxPKDxqroFvXvQ== } engines: { node: '>= 4.7.0' } requiresBuild: true @@ -5287,7 +5259,7 @@ packages: ssr-window: 4.0.2 dev: true - /tailwindcss/3.2.4_postcss@8.4.20: + /tailwindcss/3.2.4_postcss@8.4.21: resolution: { integrity: sha512-AhwtHCKMtR71JgeYDaswmZXhPcW9iuI9Sp2LvZPo9upDZ7231ZJ7eA9RaURbhpXGVlrjX4cFNlB4ieTetEb7hQ== @@ -5311,11 +5283,11 @@ packages: normalize-path: 3.0.0 object-hash: 3.0.0 picocolors: 1.0.0 - postcss: 8.4.20 - postcss-import: 14.1.0_postcss@8.4.20 - postcss-js: 4.0.0_postcss@8.4.20 - postcss-load-config: 3.1.4_postcss@8.4.20 - postcss-nested: 6.0.0_postcss@8.4.20 + postcss: 8.4.21 + postcss-import: 14.1.0_postcss@8.4.21 + postcss-js: 4.0.0_postcss@8.4.21 + postcss-load-config: 3.1.4_postcss@8.4.21 + postcss-nested: 6.0.0_postcss@8.4.21 postcss-selector-parser: 6.0.11 postcss-value-parser: 4.2.0 quick-lru: 5.1.1 @@ -5436,17 +5408,26 @@ packages: hasBin: true dev: true - /ua-parser-js/1.0.32: + /typescript/4.9.4: resolution: { - integrity: sha512-dXVsz3M4j+5tTiovFVyVqssXBu5HM47//YSOeZ9fQkdDKkfzv2v3PP1jmH6FUyPW+yCSn7aBVK1fGGKNhowdDA== + integrity: sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg== + } + engines: { node: '>=4.2.0' } + hasBin: true + dev: true + + /ua-parser-js/1.0.33: + resolution: + { + integrity: sha512-RqshF7TPTE0XLYAqmjlu5cLLuGdKrNu9O1KLA/qp39QtbZwuzwv1dT46DZSopoUMsYgXpB3Cv8a03FI8b74oFQ== } dev: true - /undici/5.14.0: + /undici/5.15.1: resolution: { - integrity: sha512-yJlHYw6yXPPsuOH0x2Ib1Km61vu4hLiRRQoafs+WUgX1vO64vgnxiCEN9dpIrhZyHFsai3F0AEj4P9zy19enEQ== + integrity: sha512-XLk8g0WAngdvFqTI+VKfBtM4YWXgdxkf1WezC771Es0Dd+Pm1KmNx8t93WTC+Hh9tnghmVxkclU1HN+j+CvIUA== } engines: { node: '>=12.18' } dependencies: @@ -5482,7 +5463,7 @@ packages: integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== } dependencies: - punycode: 2.1.1 + punycode: 2.3.0 dev: true /util-deprecate/1.0.2: @@ -5502,7 +5483,7 @@ packages: unist-util-stringify-position: 2.0.3 dev: true - /vite-plugin-iso-import/1.0.0_vite@4.0.1: + /vite-plugin-iso-import/1.0.0_vite@4.0.4: resolution: { integrity: sha512-DqhCElHfkbkqLXtm0UMiAXqh9FdqRHegHpawXtp5LWHjGsdAqYPhmUGBTKFuTRwPSNFYCpyjHRsm7lvM2dskGw== @@ -5512,13 +5493,13 @@ packages: dependencies: es-module-lexer: 1.1.0 magic-string: 0.27.0 - vite: 4.0.1_sass@1.57.0 + vite: 4.0.4_sass@1.57.1 dev: true - /vite/4.0.1_sass@1.57.0: + /vite/4.0.4_sass@1.57.1: resolution: { - integrity: sha512-kZQPzbDau35iWOhy3CpkrRC7It+HIHtulAzBhMqzGHKRf/4+vmh8rPDDdv98SWQrFWo6//3ozwsRmwQIPZsK9g== + integrity: sha512-xevPU7M8FU0i/80DMR+YhgrzR5KS2ORy1B4xcX/cXLsvnUWvfHuqMmVU6N0YiJ4JWGRJJsLCgjEzKjG9/GKoSw== } engines: { node: ^14.18.0 || >=16.0.0 } hasBin: true @@ -5543,16 +5524,16 @@ packages: terser: optional: true dependencies: - esbuild: 0.16.8 - postcss: 8.4.20 + esbuild: 0.16.17 + postcss: 8.4.21 resolve: 1.22.1 - rollup: 3.7.5 - sass: 1.57.0 + rollup: 3.10.1 + sass: 1.57.1 optionalDependencies: fsevents: 2.3.2 dev: true - /vitefu/0.2.4_vite@4.0.1: + /vitefu/0.2.4_vite@4.0.4: resolution: { integrity: sha512-fanAXjSaf9xXtOOeno8wZXIhgia+CZury481LsDaV++lSvcU2R9Ch2bPh3PYFyoHW+w9LqAeYRISVQjUIew14g== @@ -5563,7 +5544,7 @@ packages: vite: optional: true dependencies: - vite: 4.0.1_sass@1.57.0 + vite: 4.0.4_sass@1.57.1 dev: true /vt-pbf/3.1.3: @@ -5683,10 +5664,10 @@ packages: engines: { node: '>= 6' } dev: true - /yaml/2.1.3: + /yaml/2.2.1: resolution: { - integrity: sha512-AacA8nRULjKMX2DvWvOAdBZMOfQlypSFkjcOcu9FalllIDJ1kvlREzcdIZmidQUqqeMv7jorHjq2HlLv/+c2lg== + integrity: sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw== } engines: { node: '>= 14' } dev: true @@ -5737,7 +5718,7 @@ packages: } engines: { node: '>=10' } dependencies: - '@babel/runtime': 7.20.6 + '@babel/runtime': 7.20.13 '@types/lodash': 4.14.191 lodash: 4.17.21 lodash-es: 4.17.21 diff --git a/frontend/src/app.css b/frontend/src/app.css index 06bed2a..0442e55 100644 --- a/frontend/src/app.css +++ b/frontend/src/app.css @@ -26,7 +26,12 @@ .normal-background { @apply bg-gradient-to-r from-[#009444] via-[#39b54a] to-[#8dc63f] dark:bg-[#0f2702] dark:from-[#0f2702] dark:via-[#0f2702] dark:to[#0f2702]; } + .admin-button { @apply px-4 py-2 leading-5 text-white transition-colors duration-200 transform bg-gray-700 rounded text-center hover:bg-gray-600 focus:outline-none disabled:cursor-not-allowed disabled:opacity-50; } + + .action-button { + @apply px-4 py-2 leading-5 text-black dark:text-white transition-colors duration-200 transform bg-gray-50 dark:bg-gray-700 rounded text-center hover:bg-gray-300 focus:outline-none disabled:cursor-not-allowed disabled:opacity-50 dark:hover:bg-gray-600; + } } diff --git a/frontend/src/lib/i18n/i18n-service.ts b/frontend/src/lib/i18n/i18n-service.ts index 06c9df0..f3b0cfa 100644 --- a/frontend/src/lib/i18n/i18n-service.ts +++ b/frontend/src/lib/i18n/i18n-service.ts @@ -15,6 +15,7 @@ import ca from './locales/ca.json'; import it from './locales/it.json'; import es from './locales/es.json'; import nb_no from './locales/nb_NO.json'; +import zh_Hant from './locales/zh_Hant.json'; import LanguageDetector from 'i18next-browser-languagedetector'; import type { i18n, Resource } from 'i18next'; @@ -68,6 +69,7 @@ export class I18nService { this.i18n.addResourceBundle('ca', 'translation', ca); this.i18n.addResourceBundle('es', 'translation', es); this.i18n.addResourceBundle('nb_NO', 'translation', nb_no); + this.i18n.addResourceBundle('zh_Hant', 'translation', zh_Hant); } changeLanguage(language: string): void { diff --git a/frontend/src/lib/i18n/locales/de.json b/frontend/src/lib/i18n/locales/de.json index 3afcf26..aeca426 100644 --- a/frontend/src/lib/i18n/locales/de.json +++ b/frontend/src/lib/i18n/locales/de.json @@ -17,7 +17,7 @@ "see_all_quizzes": "Sieh all deine Quizze", "students_site": "Seite der Schüler*innen", "teachers_site": "Seite der Lehrer*innen", - "no_tracking_content": "Kahoot! trackt mit mindestens 2 amerikanischen Drittanbietern und ClassQuiz trackt gar nicht mit Drittanbietern!", + "no_tracking_content": "Kahoot! trackt mit mindestens zwei amerikanischen Drittanbietern und ClassQuiz trackt gar nicht mit Drittanbietern!", "quiz_results_downloadable_content": "Quiz-Ergebnisse können einfach in Form einer Excel-Tabelle heruntergeladen werden (Wusste gar nicht, dass andere dies nicht können).", "multilingual_content": "ClassQuiz ist jetzt schon komplett in Englisch, Deutsch, Türkisch, Französisch, norwegischem Bokmål und Italienisch verfügbar, wobei es auch teilweise in Indonesisch und Katalanisch verfügbar ist.", "no_tracking": "Kein Tracking", @@ -92,7 +92,8 @@ "unexpected": "Der gute alte unerwartete Fehler hat uns heimgesucht!" } } - } + }, + "use_backup_code": "Backup-Code benutzen" }, "words": { "question": "Frage", @@ -150,7 +151,10 @@ "practice": "Üben", "error": "Fehler", "voting": "Umfrage", - "download": "Herunterladen" + "download": "Herunterladen", + "continue": "Weiter", + "totp": "TOTP", + "backup_code": "Backup-Code" }, "editor": { "time_in_seconds": "Zeit in Sekunden", diff --git a/frontend/src/lib/i18n/locales/es.json b/frontend/src/lib/i18n/locales/es.json index 586705b..d69c1d8 100644 --- a/frontend/src/lib/i18n/locales/es.json +++ b/frontend/src/lib/i18n/locales/es.json @@ -8,7 +8,7 @@ "features_description": { "1": "ClassQuiz es una plataforma de quiz que permite crear y gestionar quiz.", "2": "La principal funcionalidad es una función de importación de Kahoot! que permite importar cuestionarios de Kahoot!", - "3": "Destaca el editor sencillo, así como la función de exportar los resultados de los cuestionarios a archivos de Excel." + "3": "El editor fácil de usar es un punto destacado, al igual que la función de exportación para descargar los resultados de las pruebas como archivos de Excel." }, "stats": "Ya hay {{user_count}} usuarios y {{quiz_count}} cuestionarios en ClassQuiz.", "see_what_true_and_false": "Ver lo que estaba correcto o incorrecto", @@ -16,20 +16,20 @@ "get_a_quiz": "1. Haz un quiz", "create_a_quiz_from_scratch": "Crea un quiz desde cero con el editor e incluye imágenes y más", "find_or_explore": "Encuentra (o explora) quizzes hechos o importados por otras personas", - "import_quiz_from_kahoot_and_edit": "Importa un cuestionario de Kahoot! y edítalo en ClassQuiz", + "import_quiz_from_kahoot_and_edit": "¡Importa un cuestionario de Kahoot! y editarlo en ClassQuiz", "no_tracking": "Sin rastreo", "german_server": "Servidor alemán", "user_friendly": "Fácil de usar", - "completely_free": "Totalmente gratuito", + "completely_free": "Totalmente gratis", "quiz_results_downloadable": "Los resultados de los cuestionarios se pueden descargar", "multilingual": "Multilingüe", - "completely_free_content": "ClassQuiz es completamente gratuito, sin planes de pago ni molestas redirecciones a la página de actualización. Sin embargo, ¡se agradece una donación!", + "completely_free_content": "ClassQuiz es gratuito para el usuario, sin planes pagos ni redireccionamientos para una versión paga. Por lo tanto, cualquier donación es apreciada.", "see_how_many_true_and_false": "Ver cuántos estaban correctos o equivocados", "create_or_import": "Crear o importar", "see_all_quizzes": "Ver todos tus cuestionarios", "teachers_site": "Portal de profesores", "students_site": "Portal estudiante", - "multilingual_content": "ClassQuiz ya está totalmente traducido al inglés, alemán, turco, francés e italiano. También está parcialmente traducido al indonesio y al catalán.", + "multilingual_content": "ClassQuiz ya está completamente disponible en inglés, alemán, turco, francés, bokmål noruego e italiano, mientras que también está disponible parcialmente en indonesio y catalán.", "select_answer": "Selecciona la respuesta", "view_results": "Ver los resultados", "check_if_chosen_wisely": "Comprueba, si has elegido bien", @@ -37,52 +37,57 @@ "get_ranking_and_winners": "Consigue la clasificación y mira quién ha ganado", "why_classquiz": "¿Por qué ClassQuiz?", "self_hostable_content": "ClassQuiz puede ser fácilmente auto-alojado, por lo que los datos sólo están bajo tu control!", - "user_friendly_content": "ClassQuiz trata de ser lo más fácil de uso posible, por lo que es fácil de usar para todo el mundo", + "user_friendly_content": "ClassQuiz está diseñado para ser simple y fácil de usar para todos.", "quiz_results_downloadable_content": "Los resultados de los cuestionarios se pueden exportar fácilmente a una hoja de cálculo de Excel. (No sabía que otros no pudieran hacerlo)", "dark_mode_content": "Una de las funcionalidades más importantes que puede tener un sitio web!", "german_server_content": "Los servidores de ClassQuiz se encuentran en Alemania y están alojados con netcup.", "play_quiz": "2. Haz el quiz", "choose_answer_wisely": "Elige bien tu respuesta", - "no_tracking_content": "Kahoot! rastrea con al menos 2 proveedores americanos y ClassQuiz no rastrea con ningún proveedor!", - "self_hostable": "Autohospedable" + "no_tracking_content": "Kahoot! rastrea y comparte su perfil con terceros, pero ClassQuiz no lo hace.", + "self_hostable": "Autohospedable", + "download_quizzes": "Descargar cuestionarios", + "community_driven_content": "¡ClassQuiz depende de la comunidad que proporciona ClassQuiz con donaciones, solicitudes de funciones, traducciones y más! ¡También puede convertirse en parte de la comunidad de ClassQuiz!", + "community_driven": "Impulsado por la comunidad", + "download_quizzes_content": "Los cuestionarios se pueden descargar como un solo archivo e importar en cualquier momento, lo que le permite mover fácilmente sus cuestionarios a otra instancia de ClassQuiz." }, "create_page": { "success": { - "body": "¡Creación del quiz con éxito!", - "title": "¡Quiz creado con éxito!" + "body": "Que empiecen los juegos.", + "title": "Cuestionario creado." } }, "login_page": { "modal": { "success": { - "success_check_mail": "¡Inicio de sesión exitoso! ¡Comprueba tu buzón de correo!", + "success_check_mail": "Conectado. Por favor revise su bandeja de entrada de correo electrónico.", "description": { - "success_check_mail": "Por favor, comprueba tu buzón, ya que deberías haber recibido un correo, con un enlace en el que puedes hacer clic para iniciar sesión.", - "success": "¡Se ha iniciado la sesión con éxito!" + "success_check_mail": "Verifique su buzón de correo ya que debería haber recibido un correo electrónico con un enlace para iniciar sesión.", + "success": "Conectado." }, - "success": "¡Inicio de sesión exitoso!" + "success": "Conectado." }, "error": { - "wrong_creds": "Correo electrónico o contraseña incorrectos!", + "wrong_creds": "Dirección de correo electrónico o contraseña incorrecta.", "unexpected": "¡Error inesperado!", "description": { - "wrong_creds": "Asegúrate de que tu contraseña y tu correo electrónico son correctos!", + "wrong_creds": "Por favor, asegúrese de que su contraseña y dirección de correo electrónico sean correctas.", "unexpected": "Se produjo el típico error inesperado!" } } }, - "welcome_back": "¡Bienvenido de nuevo!", - "login_or_create_account": "Iniciar sesión o crear una cuenta", - "already_have_account": "¿No tienes una cuenta?" + "welcome_back": "Bienvenido de nuevo.", + "login_or_create_account": "Ingresar o Crear una cuenta", + "already_have_account": "¿No tienes una cuenta?", + "use_backup_code": "Usar el código de la copia de seguridad" }, "overview_page": { "created_at": "Creado en", "question_count": "Recuento de preguntas", - "no_quizzes": "Parece que no tienes ningún quiz. ¿Quieres cambiar eso? ¡Haz clic en el botón \"Crear\" o importa un cuestionario de Kahoot!" + "no_quizzes": "Haga clic en el botón \"Crear\" o importe un cuestionario de Kahoot. para ponerse en marcha." }, "edit_page": { - "success_update_title": "¡Quiz actualizado con éxito!", - "success_update_body": "¡Actualización del quiz con éxito!" + "success_update_title": "Cuestionario actualizado.", + "success_update_body": "Nadie esperará la Inquisición." }, "register_page": { "greeting": "¡Encantado de conocerte!", @@ -114,8 +119,8 @@ "answer": "Respuesta", "stats": "Estadísticas", "features": "Características", - "login": "Inicio de sesión", - "email": "Correo electrónico", + "login": "Iniciar sesión", + "email": "Dirección de correo electrónico", "username": "Nombre de usuario", "count": "Cuenta", "range": "Zona", @@ -145,7 +150,11 @@ "correct": "Correcto", "result": "Resultado", "result_plural": "Resultados", - "password": "Contraseña" + "password": "Contraseña", + "download": "Descargar", + "continue": "Continuar", + "backup_code": "Código de la copia de seguridad", + "totp": "contraseña de un solo uso (Totp)" }, "admin_page": { "export_results": "Exportar resultados", @@ -157,7 +166,7 @@ "start_game": "Iniciar el juego", "time_left": "Tiempo restante", "get_final_results": "Ver los resultados finales", - "start_by_showing_first_question": "Comienza mostrando la primera pregunta!", + "start_by_showing_first_question": "Comienza mostrando la primera pregunta.", "no_answers": "¡No hay respuestas!" }, "settings_page": { @@ -183,7 +192,7 @@ }, "footer": { "self_ads": "Hecho con ❤️ por {{mawoka_link}} y con la ayuda de {{others_link}}.", - "more_details_here": "Más detalles aquí", + "more_details_here": "Para más información", "donate": "Si te resulta útil, considera {{donate_link}}." }, "error_page": { @@ -201,19 +210,29 @@ }, "import_page": { "need_help": "¿Necesitas ayuda?", - "visit_docs": "Visite la documentación" + "visit_docs": "Visite la documentación", + "url_should_look_like_this": "La URL debería verse así: https://create.kahoot.it/details/...", + "a_kahoot_quiz": "¡Un Kahoot! Prueba", + "side_import_kahoot": "¡En este lado puedes importar cuestionarios, que viven en Kahoot!.", + "classquiz_quiz": "Un ClassQuiz-Quiz", + "upload_file_ending": "Cargue el archivo que termina en .cqa", + "this_side_classquiz": "Desde aquí puede importar cuestionarios exportados desde ClassQuiz." }, "explore_page": { "made_by": "Hecho por", "imported_by": "Importado por" }, "search_page": { - "at_least_3_characters": "Escribe al menos 3 caracteres..." + "at_least_3_characters": "Escribe al menos 3 caracteres...", + "nothing_here": "No hay nada aquí..." }, "password_reset_page": { "reset_password": "Restablecer contraseña" }, "dashboard": { "search_for_own_quizzes": "Busca tus propios quizzes" + }, + "uploader": { + "add_image": "Añadir una imagen" } } diff --git a/frontend/src/lib/i18n/locales/zh_Hant.json b/frontend/src/lib/i18n/locales/zh_Hant.json new file mode 100644 index 0000000..f2604fe --- /dev/null +++ b/frontend/src/lib/i18n/locales/zh_Hant.json @@ -0,0 +1,194 @@ +{ + "index_page": { + "meta": { + "title": "首頁", + "description": "ClassQuiz 是一款為學生設計的似 Kahoot! 測驗應用程式,不僅開源還免費" + }, + "slogan": "開源的測驗平台!", + "create_or_import": "建立或匯入", + "see_all_quizzes": "查看你所有的測驗", + "teachers_site": "教師頁面", + "students_site": "學生頁面", + "no_tracking": "零追蹤", + "self_hostable": "可自行架設", + "german_server": "德國伺服器", + "user_friendly": "易於使用", + "completely_free": "完全免費", + "multilingual": "多語言", + "dark_mode": "深色模式", + "get_a_quiz": "1. 取得測驗", + "create_a_quiz_from_scratch": "使用編輯器建立測驗並加入圖片和更多內容", + "import_quiz_from_kahoot_and_edit": "從 Kahoot! 匯入測驗並在 ClassQuiz 上進行編輯", + "play_quiz": "2. 遊玩測驗", + "select_answer": "選擇答案", + "choose_answer_wisely": "明智地選擇你的答案", + "view_results": "檢視結果", + "check_if_chosen_wisely": "驗證你的選擇是否正確", + "list_winners": "列出贏家", + "get_ranking_and_winners": "取得排名和贏家", + "why_classquiz": "為什麼選擇 ClassQuiz?", + "download_quizzes": "下載測驗", + "stats": "ClassQuiz 上已有 {{user_count}} 位使用者和 {{quiz_count}} 個測驗。", + "features_description": { + "1": "ClassQuiz 是一個可以讓你建立和管理測驗的測驗平台。", + "2": "最主要的功能之一是允許你匯入 Kahoot! 上的測驗。" + }, + "quiz_results_downloadable": "可被下載的測驗結果", + "find_or_explore": "搜尋 (或瀏覽) 其他人建立和匯入的測驗", + "no_tracking_content": "Kahoot! 會追蹤並將你的資料分享給第三方,但 ClassQuiz 不會。", + "user_friendly_content": "ClassQuiz 旨在簡單,每個人都可以輕鬆使用。", + "dark_mode_content": "一個網站最重要的功能之一!", + "german_server_content": "ClassQuiz 的伺服器位於德國,並由 netcup 提供。" + }, + "edit_page": { + "success_update_title": "測驗已更新。" + }, + "create_page": { + "success": { + "title": "測驗已建立。", + "body": "讓遊戲開始吧。" + } + }, + "register_page": { + "create_account": "建立帳戶", + "forgot_password?": "忘記密碼?", + "already_have_account?": "已經擁有帳戶?", + "greeting": "很高興見到你!" + }, + "login_page": { + "login_or_create_account": "登入或建立帳戶", + "already_have_account": "沒有帳戶?", + "modal": { + "error": { + "wrong_creds": "電子郵件地址或密碼錯誤。", + "unexpected": "非預期錯誤!", + "description": { + "wrong_creds": "請確認你的密碼和電子郵件地址是否正確。" + } + }, + "success": { + "success": "已登入。", + "success_check_mail": "已登入。請檢查你的電子信箱收件匣。", + "description": { + "success": "已登入。" + } + } + }, + "welcome_back": "歡迎回來。", + "use_backup_code": "使用備用代碼" + }, + "editor": { + "delete_question": "刪除問題", + "add_new_question": "新增問題", + "delete_answer": "刪除答案", + "add_new_answer": "新增答案" + }, + "import_page": { + "need_help": "需要幫助?" + }, + "admin_page": { + "start_game": "開始遊戲", + "get_results": "取得結果", + "get_results_and_stop_time": "取得結果並停止計時", + "get_final_results": "取得最終結果", + "export_results": "匯出結果", + "show_next_question": "顯示下一個問題", + "time_left": "剩餘時間", + "stop_time": "停止計時" + }, + "password_reset_page": { + "reset_password": "重設密碼" + }, + "settings_page": { + "old_password": "舊密碼", + "new_password": "新密碼", + "repeat_password": "再次輸入密碼", + "change_password_submit": "變更密碼!", + "check_location": "檢查位置" + }, + "explore_page": { + "made_by": "作者為", + "imported_by": "匯入者為" + }, + "play_page": { + "2nd_place": "第二名", + "3rd place": "第三名", + "with_out_of": "{{total_question_count}} 題中答對 {{correct_questions}} 題", + "1st_place": "第一名" + }, + "editor_page": { + "add_an_answer": "新增一個答案", + "right_click_to_delete": "右鍵點擊一個答案即可將它刪除!" + }, + "footer": { + "more_details_here": "更多詳細資訊" + }, + "uploader": { + "add_image": "新增圖片" + }, + "words": { + "find": "尋找", + "question": "問題", + "answer": "答案", + "stats": "統計資料", + "features": "功能", + "login": "登入", + "email": "電子郵件地址", + "username": "使用者名稱", + "password": "密碼", + "edit": "編輯", + "delete": "刪除", + "public": "公開", + "create": "建立", + "import": "匯入", + "logout": "登出", + "title": "標題", + "url": "URL", + "submit": "提交", + "pin": "PIN", + "kick": "踢出", + "register": "註冊", + "close": "關閉", + "save": "儲存", + "description": "描述", + "image": "圖片", + "settings": "設定", + "repeat_password": "再次輸入密碼", + "explore": "發現", + "screenshot": "螢幕截圖", + "screenshot_plural": "螢幕截圖", + "browser": "瀏覽器", + "correct": "正確", + "result": "結果", + "result_plural": "結果", + "range": "範圍", + "multiple_choice": "選擇題", + "private": "私人", + "dashboard": "儀錶板", + "question_plural": "問題", + "game_pin": "遊戲 PIN", + "other": "其他", + "search": "搜尋", + "other_plural": "其他", + "download": "下載", + "voting": "投票", + "docs": "文件", + "donating": "贊助", + "practice": "練習", + "error": "錯誤", + "continue": "繼續", + "backup_code": "備用代碼", + "totp": "" + }, + "search_page": { + "at_least_3_characters": "輸入至少 3 個字元..." + }, + "dashboard": { + "search_for_own_quizzes": "搜尋你的測驗" + }, + "overview_page": { + "created_at": "建立於", + "question_count": "問題數", + "no_quizzes": "點擊「建立」按鈕或從 Kahoot! 匯入測驗。" + } +} diff --git a/frontend/src/lib/language-toggle.svelte b/frontend/src/lib/language-toggle.svelte index 390f46f..34d10e5 100644 --- a/frontend/src/lib/language-toggle.svelte +++ b/frontend/src/lib/language-toggle.svelte @@ -97,6 +97,11 @@ code: 'nb_NO', name: 'Norsk', flag: '🇳🇴' + }, + { + code: 'zh_Hant', + name: 'Chinese (traditional)', + flag: '🇨🇳' } ]; const get_selected_language = (): string => { diff --git a/frontend/src/routes/admin/+page.svelte b/frontend/src/routes/admin/+page.svelte index 4a0f4e8..96452d9 100644 --- a/frontend/src/routes/admin/+page.svelte +++ b/frontend/src/routes/admin/+page.svelte @@ -172,7 +172,7 @@ QR code to join the game

{$t('words.pin')}: {quiz_data.game_pin}

diff --git a/frontend/src/routes/user/[user_id]/+page.svelte b/frontend/src/routes/user/[user_id]/+page.svelte new file mode 100644 index 0000000..07dcd2c --- /dev/null +++ b/frontend/src/routes/user/[user_id]/+page.svelte @@ -0,0 +1,182 @@ + + + + + ClassQuiz - @{data.user.username} + + +
+
+
+
+ profile +
+

+ @{data.user.username} +

+

+ Joined on {new Date(data.user.created_at).toLocaleDateString()} +

+
+
+ {#each data.quizzes as quiz} +
+
+ +
+

{@html quiz.title}

+

+ {@html quiz.description} +

+ {#if quiz.cover_image} +
+
+ Not provided +
+
+ {/if} +
+ + +
+ +
+
+ {#if $signedIn} + + + + + + + {:else} +
+ +
+
+ +
+ {/if} +
+
+
+ {/each} +
+
+
+{#if start_game !== null} + +{/if} diff --git a/frontend/src/routes/user/[user_id]/+page.ts b/frontend/src/routes/user/[user_id]/+page.ts new file mode 100644 index 0000000..7aadc47 --- /dev/null +++ b/frontend/src/routes/user/[user_id]/+page.ts @@ -0,0 +1,24 @@ +/* + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ + +// import type { PageLoad } from './$types'; + +export const load = async ({ params, fetch }) => { + const user_req = await fetch(`/api/v1/community/user/${params.user_id}`); + const user = await user_req.json(); + if (!user) { + return { + user: undefined, + quizzes: undefined + }; + } + const quiz_req = await fetch(`/api/v1/community/quizzes/${params.user_id}?imported=false`); + const quizzes = await quiz_req.json(); + return { + user, + quizzes + }; +}; // satisfies PageLoad; diff --git a/frontend/src/routes/view/[quiz_id]/+page.svelte b/frontend/src/routes/view/[quiz_id]/+page.svelte index b9fd687..890aab1 100644 --- a/frontend/src/routes/view/[quiz_id]/+page.svelte +++ b/frontend/src/routes/view/[quiz_id]/+page.svelte @@ -68,6 +68,9 @@

{@html quiz.description}

+

+ Made by @{quiz.user_id.username} +

{#if quiz.cover_image}