From 53b33073ac417068f829ee1a4cb883318646701e Mon Sep 17 00:00:00 2001 From: Ilia Denisov Date: Sun, 12 Jul 2026 01:34:25 +0200 Subject: [PATCH 01/18] docs(android): fix plan (dict source, Capacitor 8 / SDK 36 / JDK 21) and record scaffolding progress + native-build notes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Correct ANDROID_PLAN.md: bundled offline dictionaries come from the scrabble-dictionary release (DICT_VERSION), not scrabble-solver; pin the toolchain to Capacitor 8 (compileSdk/targetSdk 36, minSdk 24, JDK 21 — @capacitor/android compiles at Java 21). Add a Progress section marking the scaffolding milestone done, and capture the native-Android build recipe + toolchain gotchas in .claude/CLAUDE.md so a fresh session resumes without re-deriving them. Co-Authored-By: Claude Opus 4.8 --- .claude/CLAUDE.md | 30 +++++++++++++++++++ ANDROID_PLAN.md | 73 ++++++++++++++++++++++++++++++++++++----------- 2 files changed, 86 insertions(+), 17 deletions(-) diff --git a/.claude/CLAUDE.md b/.claude/CLAUDE.md index 9588de4..451a7ad 100644 --- a/.claude/CLAUDE.md +++ b/.claude/CLAUDE.md @@ -28,6 +28,36 @@ on it**, and prefer the authoritative docs where they overlap. Add to this file - **pnpm corepack pre-flight flakes.** `pnpm exec` / `pnpm check` occasionally abort on a corepack pre-flight. Dodge it by invoking the tool directly: `node_modules/.bin/`. +## Native Android build (Capacitor) + +The native Android app (`ANDROID_PLAN.md`) is a Capacitor 8 wrapper of the `ui` SPA, scaffolded under +`ui/` (a Node project outside `go.work`). Hard-won bring-up facts — verify against current code: + +- **Capacitor 8 needs JDK 21, not 17.** `@capacitor/android` compiles at `VERSION_21`; a JDK 17 Gradle + run dies with `error: invalid source release: 21`. Install sudo-free via the Homebrew **formula** + `brew install openjdk@21` (the `temurin@21` **cask** wants sudo for a system `.pkg`, unusable + non-interactively) + a user symlink into `~/Library/Java/JavaVirtualMachines/` so + `/usr/libexec/java_home -v 21` finds it. JDK 17 stays fine for `sdkmanager`/`avdmanager`. +- **Cap 8 SDK pins:** compileSdk/targetSdk **36**, minSdk **24**, Gradle **8.14.3**, AGP **8.13.0** + (`ui/android/variables.gradle`). Install `platforms;android-36` — Android Studio's newer + `android-36.1` does NOT satisfy compileSdk 36. +- **SDK is Android Studio's** at `~/Library/Android/sdk` (no `cmdline-tools` by default → `brew install + --cask android-commandlinetools`, then `sdkmanager`/`avdmanager --sdk_root=$HOME/Library/Android/sdk`). + Gradle finds it via **`ANDROID_HOME`** (`local.properties` is gitignored, machine-specific). +- **Build recipe:** `cd ui && pnpm build && node_modules/.bin/cap sync android`; then `cd ui/android && + ANDROID_HOME=~/Library/Android/sdk JAVA_HOME=$(/usr/libexec/java_home -v 21) ./gradlew assembleDebug` + → `ui/android/app/build/outputs/apk/debug/app-debug.apk`. Prefer the local `ui/node_modules/.bin/cap` + (dodges the corepack flake). +- **Emulator smoke:** existing AVDs `Pixel_10` / `Pixel_4_Android_10_API_29` / `Pixel_Android_9`; + `emulator -avd `, `adb install -r `, `adb shell monkey -p ru.eruditgame.app -c + android.intent.category.LAUNCHER 1`, `adb exec-out screencap -p > x.png`. The boot wait needs `sleep` + → run it as a **background** Bash task (foreground `sleep` is blocked). +- **`sharp` is whitelisted** in `ui/pnpm-workspace.yaml` (`allowBuilds: sharp: true`) — `@capacitor/assets` + uses it for `pnpm android:assets` (launcher icon/splash); else pnpm 11 raises `ERR_PNPM_IGNORED_BUILDS`. +- **Bundled offline dicts come from the `scrabble-dictionary` release** (`scrabble-dawg-.tar.gz`, + keyed on the `DICT_VERSION` Gitea var — the same source the backend image + CI `curl`), NOT + `scrabble-solver/dawg` (those are the solver's pinned test fixtures). + ## Wire / schema evolution (client ↔ gateway ↔ backend) - **FBS is additive-only.** Add **trailing** fields ("added trailing — backward-compatible"). Never diff --git a/ANDROID_PLAN.md b/ANDROID_PLAN.md index 959ea6f..7bc9c99 100644 --- a/ANDROID_PLAN.md +++ b/ANDROID_PLAN.md @@ -45,6 +45,7 @@ installs away cleanly, and (c) opens offline-first as a soft guest with local pl | Payments in MVP | Hidden (deferred; reuse the distribution flag) | | appId (permanent) | **`ru.eruditgame.app`** | | App display name | **`Эрудит`** (Cyrillic) | +| Toolchain (locked) | **Capacitor 8** (`@capacitor/*` `^8`); **compileSdk/targetSdk 36, minSdk 24**; **JDK 21** (required — `@capacitor/android` compiles at Java 21; AGP 8.13 / Gradle 8.14.3); Android SDK `platforms;android-36` + `build-tools;36.x` | **Conventions:** all code/comments/commits/docs in English. Do NOT put stage/phase numbers in code, commits, or PR titles. Bake design into the main docs (`docs/ARCHITECTURE.md` etc.) — this repo @@ -57,23 +58,52 @@ client-only (no server change). --- +## Progress (as-built) + +Kept current as parts land so a fresh session resumes without re-deriving. Verify against code. + +- **A. Capacitor scaffolding — ✅ DONE & verified (2026-07-12).** Capacitor 8 native project generated + under `ui/android/` (tracked), `@capacitor/*` deps + `capacitor.config.ts`, hardware Back in + `ui/src/lib/native.ts` wired from `App.svelte`. `pnpm build` → `cap sync` → `./gradlew assembleDebug` + builds a debug APK that installs and **cold-launches to the Login screen** on the Pixel_10 emulator. + `svelte-check` 0 errors, `vitest` 584 passed. Build recipe + toolchain gotchas live in + `.claude/CLAUDE.md` → "Native Android build (Capacitor)". + **Remaining sub-item:** owner-supplied launcher icon (`ui/assets/icon.png`) → `pnpm android:assets`. +- **B–G — pending.** + +Open logistics (not code): the launcher icon (above); `~/.claude/bin/gitea-ci-watch.py` must exist +before the first push/PR; RuStore publication prerequisites gate release only. + +--- + ## Prerequisites to start DEVELOPMENT (on the other device) Have all of these before writing code: -- **JDK 17** (Temurin/OpenJDK). +- **JDK 21** (Temurin/OpenJDK) — **required** by Capacitor 8: `@capacitor/android` sets + `sourceCompatibility/targetCompatibility = VERSION_21`, so a JDK 17 Gradle run fails with + `invalid source release: 21`. (Homebrew: `brew install openjdk@21`.) - **Android SDK** — Android Studio (recommended: bundles the SDK manager + AVD emulator) *or* - cmdline-tools. Install: `platform-tools`, `platforms;android-34`, `build-tools;34.0.0`. + cmdline-tools. Capacitor 8 targets **compileSdk/targetSdk 36, minSdk 24**, so install: + `platform-tools`, `platforms;android-36`, `build-tools;36.0.0` (a newer build-tools such as + `36.1.0` is also accepted — AGP treats it as a minimum). Gradle 8.14.3 / AGP 8.13 arrive via the + wrapper `cap add android` generates. - **Node 20+ and pnpm** (via corepack), matching the repo's `ui` toolchain. - **Git**, plus this repo's Gitea access. If this device will push/PR, set up the `tea` CLI login and the CI watcher exactly as the owner's global setup (`~/.claude` tooling: `python3 ~/.claude/bin/gitea-ci-watch.py`, `tea` against `gitea.lan`). - **Both repositories side by side** per `go.work`: clone `developer/scrabble-game` **and** the - sibling `scrabble-solver` next to it. The sibling holds the committed dictionaries - (`scrabble-solver/dawg/{ru_scrabble,ru_erudit,en_sowpods}.dawg`) that offline-first bundles, and - the solver library the backend/CI use. -- **A test target**: a physical Android device with USB debugging **or** an emulator AVD (e.g. Pixel, - API 34). + sibling `scrabble-solver` next to it — the solver **library** the backend/CI consume via the + `go.work` replace. **The bundled dictionaries do NOT come from the solver.** The versioned, + production dictionary set is published by `developer/scrabble-dictionary` as a **release artifact** + `scrabble-dawg-.tar.gz` (one semver label per set); `backend/Dockerfile` and every CI + job already `curl` exactly that tarball, keyed on the shared Gitea variable `DICT_VERSION`. + Offline-first bundles the DAWGs from that same release (see D.1 / E), so the Android build needs + `DICT_VERSION` + network access to the release, **not** `scrabble-solver`. (`scrabble-solver/dawg/*.dawg` + are the solver's committed test fixtures — byte-identical to a build but pinned to the solver + commit, not the versioned production set.) +- **A test target**: a physical Android device with USB debugging **or** an emulator AVD (e.g. a + Pixel AVD; any recent API image). - **No backend needed to build the APK** — it points at production `erudit-game.ru`. A local gateway is only needed to exercise the version gate locally (optional). @@ -152,7 +182,7 @@ it and stay a local guest (do not overlay). Implementation seam: the reconciliat Ordered so each part is independently verifiable. The MVP now includes offline-first, so the sequence is: scaffold → native-correct → gate → offline-first → CI → docs → release. -### A. Capacitor scaffolding +### A. Capacitor scaffolding — ✅ DONE - `ui/package.json`: add deps `@capacitor/core`, `@capacitor/android`, `@capacitor/app`; devDeps `@capacitor/cli`, `@capacitor/assets`. Scripts: `"cap:sync": "cap sync android"`, @@ -339,9 +369,13 @@ and `ui/src/screens/NewGame.svelte:177-431`. This phase makes them reachable on with no network**. 1. **Bundle dictionaries in the APK.** - - New build step `ui/scripts/bundle-dicts.mjs`: copy `../scrabble-solver/dawg/{ru_scrabble,ru_erudit,en_sowpods}.dawg` - → `ui/dist/dict/@.dawg` (dictKey naming). Run only in the native pipeline - (after `pnpm build`, before `cap sync`). Web builds stay slim. + - New build step `ui/scripts/bundle-dicts.mjs`: copy the three DAWGs from the unpacked + **`scrabble-dictionary` release** (`scrabble-dawg-.tar.gz` → a dict dir passed via + `DICT_DIR`; **NOT** `../scrabble-solver/dawg`) → `ui/dist/dict/.dawg` (the + `dictKey(variant, version)` naming the loader's bundled tier fetches). Run only in the native + pipeline (after `pnpm build`, before `cap sync`). Web builds stay slim. `VITE_DICT_VERSION` must + equal the release's `DICT_VERSION` so the bundled `(variant, version)` matches what the loader + requests. - Vite `define`: add `__DICT_VERSION__` from `VITE_DICT_VERSION` (mirrors `__APP_VERSION__`); declare it in `vite-env.d.ts`. - **Loader tier** — `ui/src/lib/dict/loader.ts` `load()`: between the IndexedDB tier (line 73-85) @@ -394,15 +428,20 @@ silently establishes a server guest and lights up online play. New **manual** workflow `.gitea/workflows/android-build.yaml` (mirror `prod-deploy.yaml`'s `workflow_dispatch` + `confirm` gate; from `master`; not on PRs). Steps: -1. Checkout this repo **and the sibling `scrabble-solver`** — copy the checkout + Node/pnpm setup - block from `.gitea/workflows/ci.yaml` (the `ui` job). The sibling is needed for the bundled dicts. +1. Checkout this repo; copy the Node/pnpm setup block from `.gitea/workflows/ci.yaml` (the `ui` job). + Add the **"Fetch dictionary DAWGs"** step verbatim from `ci.yaml` (the `curl … + scrabble-dictionary/releases/download/${DICT_VERSION}/scrabble-dawg-${DICT_VERSION}.tar.gz` + + untar into `${GITHUB_WORKSPACE}/dawg`), keyed on the `DICT_VERSION` Gitea variable — **this**, not + the `scrabble-solver` sibling, is the source of the bundled dicts. (`scrabble-solver` is not needed + by the Android build: `ui` is a Node project outside `go.work`.) 2. `pnpm install --frozen-lockfile`. 3. `pnpm build` with the native env (below), `VITE_APP_VERSION` = `git describe --tags`, `VITE_DICT_VERSION` = the release dict version. -4. `node ui/scripts/bundle-dicts.mjs` (copy the `.dawg` into `ui/dist/dict/`). -5. Setup JDK 17 (`actions/setup-java@v4`, temurin 17). -6. Install Android SDK via `sdkmanager` (pin `platform-tools`, `platforms;android-34`, - `build-tools;34.0.0`); cache the SDK. **No emulator** — assemble only; on-device smoke is manual. +4. `DICT_DIR=${GITHUB_WORKSPACE}/dawg node ui/scripts/bundle-dicts.mjs` (copy the release `.dawg` + files into `ui/dist/dict/`). +5. Setup JDK 21 (`actions/setup-java@v4`, temurin 21). +6. Install Android SDK via `sdkmanager` (pin `platform-tools`, `platforms;android-36`, + `build-tools;36.0.0`); cache the SDK. **No emulator** — assemble only; on-device smoke is manual. 7. `npx cap sync android`. 8. Decode the keystore from `ANDROID_KEYSTORE_BASE64`; compute `versionCode`/`versionName` from the tag (scheme below). From 0f5db0ee911b3fcfa45e5fd4b822308095c9beec Mon Sep 17 00:00:00 2001 From: Ilia Denisov Date: Sun, 12 Jul 2026 01:34:25 +0200 Subject: [PATCH 02/18] feat(android): scaffold Capacitor 8 native project + hardware Back button MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add @capacitor/{core,android,app,cli,assets} to ui/, a capacitor.config.ts (appId ru.eruditgame.app, appName Эрудит, webDir dist — bundle model, no server.url), and the generated ui/android/ Gradle project (tracked; build outputs and the machine-specific local.properties gitignored, keystore patterns un-commented so signing material can never be committed). Wire the Android hardware Back button in ui/src/lib/native.ts behind a dynamic @capacitor/app import (web/mock bundles never load it), called from App.svelte onMount and reusing routeDepth for the navigation-root check. Whitelist sharp in pnpm-workspace.yaml for @capacitor/assets icon generation. Co-Authored-By: Claude Opus 4.8 --- ui/android/.gitignore | 101 + ui/android/app/.gitignore | 2 + ui/android/app/build.gradle | 54 + ui/android/app/capacitor.build.gradle | 19 + ui/android/app/proguard-rules.pro | 21 + .../myapp/ExampleInstrumentedTest.java | 26 + ui/android/app/src/main/AndroidManifest.xml | 41 + .../java/ru/eruditgame/app/MainActivity.java | 5 + .../main/res/drawable-land-hdpi/splash.png | Bin 0 -> 7705 bytes .../main/res/drawable-land-mdpi/splash.png | Bin 0 -> 4040 bytes .../main/res/drawable-land-xhdpi/splash.png | Bin 0 -> 9251 bytes .../main/res/drawable-land-xxhdpi/splash.png | Bin 0 -> 13984 bytes .../main/res/drawable-land-xxxhdpi/splash.png | Bin 0 -> 17683 bytes .../main/res/drawable-port-hdpi/splash.png | Bin 0 -> 7934 bytes .../main/res/drawable-port-mdpi/splash.png | Bin 0 -> 4096 bytes .../main/res/drawable-port-xhdpi/splash.png | Bin 0 -> 9875 bytes .../main/res/drawable-port-xxhdpi/splash.png | Bin 0 -> 13346 bytes .../main/res/drawable-port-xxxhdpi/splash.png | Bin 0 -> 17489 bytes .../drawable-v24/ic_launcher_foreground.xml | 34 + .../res/drawable/ic_launcher_background.xml | 170 + .../app/src/main/res/drawable/splash.png | Bin 0 -> 4040 bytes .../app/src/main/res/layout/activity_main.xml | 12 + .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 2786 bytes .../mipmap-hdpi/ic_launcher_foreground.png | Bin 0 -> 3450 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 4341 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 1869 bytes .../mipmap-mdpi/ic_launcher_foreground.png | Bin 0 -> 2110 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 2725 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 3981 bytes .../mipmap-xhdpi/ic_launcher_foreground.png | Bin 0 -> 5036 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 6593 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 6644 bytes .../mipmap-xxhdpi/ic_launcher_foreground.png | Bin 0 -> 9793 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 10455 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 9441 bytes .../mipmap-xxxhdpi/ic_launcher_foreground.png | Bin 0 -> 15529 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 15916 bytes .../res/values/ic_launcher_background.xml | 4 + .../app/src/main/res/values/strings.xml | 7 + ui/android/app/src/main/res/values/styles.xml | 22 + .../app/src/main/res/xml/file_paths.xml | 5 + .../getcapacitor/myapp/ExampleUnitTest.java | 18 + ui/android/build.gradle | 29 + ui/android/capacitor.settings.gradle | 6 + ui/android/gradle.properties | 22 + ui/android/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 43764 bytes .../gradle/wrapper/gradle-wrapper.properties | 7 + ui/android/gradlew | 251 ++ ui/android/gradlew.bat | 94 + ui/android/settings.gradle | 5 + ui/android/variables.gradle | 16 + ui/capacitor.config.ts | 12 + ui/package.json | 7 + ui/pnpm-lock.yaml | 2856 +++++++++++++++++ ui/pnpm-workspace.yaml | 4 + ui/src/App.svelte | 5 + ui/src/lib/native.ts | 25 + 59 files changed, 3890 insertions(+) create mode 100644 ui/android/.gitignore create mode 100644 ui/android/app/.gitignore create mode 100644 ui/android/app/build.gradle create mode 100644 ui/android/app/capacitor.build.gradle create mode 100644 ui/android/app/proguard-rules.pro create mode 100644 ui/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java create mode 100644 ui/android/app/src/main/AndroidManifest.xml create mode 100644 ui/android/app/src/main/java/ru/eruditgame/app/MainActivity.java create mode 100644 ui/android/app/src/main/res/drawable-land-hdpi/splash.png create mode 100644 ui/android/app/src/main/res/drawable-land-mdpi/splash.png create mode 100644 ui/android/app/src/main/res/drawable-land-xhdpi/splash.png create mode 100644 ui/android/app/src/main/res/drawable-land-xxhdpi/splash.png create mode 100644 ui/android/app/src/main/res/drawable-land-xxxhdpi/splash.png create mode 100644 ui/android/app/src/main/res/drawable-port-hdpi/splash.png create mode 100644 ui/android/app/src/main/res/drawable-port-mdpi/splash.png create mode 100644 ui/android/app/src/main/res/drawable-port-xhdpi/splash.png create mode 100644 ui/android/app/src/main/res/drawable-port-xxhdpi/splash.png create mode 100644 ui/android/app/src/main/res/drawable-port-xxxhdpi/splash.png create mode 100644 ui/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml create mode 100644 ui/android/app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 ui/android/app/src/main/res/drawable/splash.png create mode 100644 ui/android/app/src/main/res/layout/activity_main.xml create mode 100644 ui/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 ui/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 ui/android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 ui/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png create mode 100644 ui/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 ui/android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 ui/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png create mode 100644 ui/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 ui/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 ui/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png create mode 100644 ui/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 ui/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 ui/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png create mode 100644 ui/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 ui/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 ui/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png create mode 100644 ui/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 ui/android/app/src/main/res/values/ic_launcher_background.xml create mode 100644 ui/android/app/src/main/res/values/strings.xml create mode 100644 ui/android/app/src/main/res/values/styles.xml create mode 100644 ui/android/app/src/main/res/xml/file_paths.xml create mode 100644 ui/android/app/src/test/java/com/getcapacitor/myapp/ExampleUnitTest.java create mode 100644 ui/android/build.gradle create mode 100644 ui/android/capacitor.settings.gradle create mode 100644 ui/android/gradle.properties create mode 100644 ui/android/gradle/wrapper/gradle-wrapper.jar create mode 100644 ui/android/gradle/wrapper/gradle-wrapper.properties create mode 100755 ui/android/gradlew create mode 100644 ui/android/gradlew.bat create mode 100644 ui/android/settings.gradle create mode 100644 ui/android/variables.gradle create mode 100644 ui/capacitor.config.ts create mode 100644 ui/src/lib/native.ts diff --git a/ui/android/.gitignore b/ui/android/.gitignore new file mode 100644 index 0000000..18ab5c9 --- /dev/null +++ b/ui/android/.gitignore @@ -0,0 +1,101 @@ +# Using Android gitignore template: https://github.com/github/gitignore/blob/HEAD/Android.gitignore + +# Built application files +*.apk +*.aar +*.ap_ +*.aab + +# Files for the ART/Dalvik VM +*.dex + +# Java class files +*.class + +# Generated files +bin/ +gen/ +out/ +# Uncomment the following line in case you need and you don't have the release build type files in your app +# release/ + +# Gradle files +.gradle/ +build/ + +# Local configuration file (sdk path, etc) +local.properties + +# Proguard folder generated by Eclipse +proguard/ + +# Log Files +*.log + +# Android Studio Navigation editor temp files +.navigation/ + +# Android Studio captures folder +captures/ + +# IntelliJ +*.iml +.idea/workspace.xml +.idea/tasks.xml +.idea/gradle.xml +.idea/assetWizardSettings.xml +.idea/dictionaries +.idea/libraries +# Android Studio 3 in .gitignore file. +.idea/caches +.idea/modules.xml +# Comment next line if keeping position of elements in Navigation Editor is relevant for you +.idea/navEditor.xml + +# Keystore files +# Release signing material must never be committed (see ANDROID_PLAN.md — keystore loss/leak risk). +*.jks +*.keystore + +# External native build folder generated in Android Studio 2.2 and later +.externalNativeBuild +.cxx/ + +# Google Services (e.g. APIs or Firebase) +# google-services.json + +# Freeline +freeline.py +freeline/ +freeline_project_description.json + +# fastlane +fastlane/report.xml +fastlane/Preview.html +fastlane/screenshots +fastlane/test_output +fastlane/readme.md + +# Version control +vcs.xml + +# lint +lint/intermediates/ +lint/generated/ +lint/outputs/ +lint/tmp/ +# lint/reports/ + +# Android Profiling +*.hprof + +# Cordova plugins for Capacitor +capacitor-cordova-android-plugins + +# Copied web assets +app/src/main/assets/public + +# Generated Config files +app/src/main/assets/capacitor.config.json +app/src/main/assets/capacitor.plugins.json +app/src/main/res/xml/config.xml diff --git a/ui/android/app/.gitignore b/ui/android/app/.gitignore new file mode 100644 index 0000000..043df80 --- /dev/null +++ b/ui/android/app/.gitignore @@ -0,0 +1,2 @@ +/build/* +!/build/.npmkeep diff --git a/ui/android/app/build.gradle b/ui/android/app/build.gradle new file mode 100644 index 0000000..baa3db2 --- /dev/null +++ b/ui/android/app/build.gradle @@ -0,0 +1,54 @@ +apply plugin: 'com.android.application' + +android { + namespace = "ru.eruditgame.app" + compileSdk = rootProject.ext.compileSdkVersion + defaultConfig { + applicationId "ru.eruditgame.app" + minSdkVersion rootProject.ext.minSdkVersion + targetSdkVersion rootProject.ext.targetSdkVersion + versionCode 1 + versionName "1.0" + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + aaptOptions { + // Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps. + // Default: https://android.googlesource.com/platform/frameworks/base/+/282e181b58cf72b6ca770dc7ca5f91f135444502/tools/aapt/AaptAssets.cpp#61 + ignoreAssetsPattern = '!.svn:!.git:!.ds_store:!*.scc:.*:!CVS:!thumbs.db:!picasa.ini:!*~' + } + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } +} + +repositories { + flatDir{ + dirs '../capacitor-cordova-android-plugins/src/main/libs', 'libs' + } +} + +dependencies { + implementation fileTree(include: ['*.jar'], dir: 'libs') + implementation "androidx.appcompat:appcompat:$androidxAppCompatVersion" + implementation "androidx.coordinatorlayout:coordinatorlayout:$androidxCoordinatorLayoutVersion" + implementation "androidx.core:core-splashscreen:$coreSplashScreenVersion" + implementation project(':capacitor-android') + testImplementation "junit:junit:$junitVersion" + androidTestImplementation "androidx.test.ext:junit:$androidxJunitVersion" + androidTestImplementation "androidx.test.espresso:espresso-core:$androidxEspressoCoreVersion" + implementation project(':capacitor-cordova-android-plugins') +} + +apply from: 'capacitor.build.gradle' + +try { + def servicesJSON = file('google-services.json') + if (servicesJSON.text) { + apply plugin: 'com.google.gms.google-services' + } +} catch(Exception e) { + logger.info("google-services.json not found, google-services plugin not applied. Push Notifications won't work") +} diff --git a/ui/android/app/capacitor.build.gradle b/ui/android/app/capacitor.build.gradle new file mode 100644 index 0000000..1005ebc --- /dev/null +++ b/ui/android/app/capacitor.build.gradle @@ -0,0 +1,19 @@ +// DO NOT EDIT THIS FILE! IT IS GENERATED EACH TIME "capacitor update" IS RUN + +android { + compileOptions { + sourceCompatibility JavaVersion.VERSION_21 + targetCompatibility JavaVersion.VERSION_21 + } +} + +apply from: "../capacitor-cordova-android-plugins/cordova.variables.gradle" +dependencies { + implementation project(':capacitor-app') + +} + + +if (hasProperty('postBuildExtras')) { + postBuildExtras() +} diff --git a/ui/android/app/proguard-rules.pro b/ui/android/app/proguard-rules.pro new file mode 100644 index 0000000..f1b4245 --- /dev/null +++ b/ui/android/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/ui/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java b/ui/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java new file mode 100644 index 0000000..f2c2217 --- /dev/null +++ b/ui/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package com.getcapacitor.myapp; + +import static org.junit.Assert.*; + +import android.content.Context; +import androidx.test.ext.junit.runners.AndroidJUnit4; +import androidx.test.platform.app.InstrumentationRegistry; +import org.junit.Test; +import org.junit.runner.RunWith; + +/** + * Instrumented test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + + @Test + public void useAppContext() throws Exception { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); + + assertEquals("com.getcapacitor.app", appContext.getPackageName()); + } +} diff --git a/ui/android/app/src/main/AndroidManifest.xml b/ui/android/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..b06ddbf --- /dev/null +++ b/ui/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ui/android/app/src/main/java/ru/eruditgame/app/MainActivity.java b/ui/android/app/src/main/java/ru/eruditgame/app/MainActivity.java new file mode 100644 index 0000000..4c29e8b --- /dev/null +++ b/ui/android/app/src/main/java/ru/eruditgame/app/MainActivity.java @@ -0,0 +1,5 @@ +package ru.eruditgame.app; + +import com.getcapacitor.BridgeActivity; + +public class MainActivity extends BridgeActivity {} diff --git a/ui/android/app/src/main/res/drawable-land-hdpi/splash.png b/ui/android/app/src/main/res/drawable-land-hdpi/splash.png new file mode 100644 index 0000000000000000000000000000000000000000..e31573b4fc93e60d171f4046c0220e1463075d9e GIT binary patch literal 7705 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 wKmFJ0_JHhk1&0B>;%YXATM literal 0 HcmV?d00001 diff --git a/ui/android/app/src/main/res/drawable-land-mdpi/splash.png b/ui/android/app/src/main/res/drawable-land-mdpi/splash.png new file mode 100644 index 0000000000000000000000000000000000000000..f7a64923ea1a0565d25fa139c176d6bf42184e48 GIT binary patch literal 4040 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 XyOn+%7f`N3b2T^T3uj5+eShz7v)7qy literal 0 HcmV?d00001 diff --git a/ui/android/app/src/main/res/drawable-land-xhdpi/splash.png b/ui/android/app/src/main/res/drawable-land-xhdpi/splash.png new file mode 100644 index 0000000000000000000000000000000000000000..807725501bdd92e94e51e7b2b0006f69e0083a0b GIT binary patch literal 9251 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 literal 0 HcmV?d00001 diff --git a/ui/android/app/src/main/res/drawable-land-xxhdpi/splash.png b/ui/android/app/src/main/res/drawable-land-xxhdpi/splash.png new file mode 100644 index 0000000000000000000000000000000000000000..14c6c8fe39fcd51a0414866ad28cbe8ff3acb060 GIT binary patch literal 13984 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®q@N z14_H8ofW)l{|J8q+a)eH)I0r)>WXdzV%7J>PA~6_J)KLT90iYa^K=Wz7D!OybzqSru=f4?|KFl;Y)gP_H6V4x`~kZ6fE(xM1&;?72-TZNk+0 zr+Crr5yl%Iy@vfmt3eYFl!jIvPGFz^8Ek+2`48O1_pCX3xNWh-zBa{rIcc%+=|XVj zANYTg&s}TKb#OztQrCW(Xk?V^i{`q~%HtcveTxq(_HKeC9GzrtguMT4Nvs@KakPTA z9>*8bBZmLz`lK5=l)=b|=dT3a5ag^a1^znZyx5QKfUb1b9yacArRp%3@QWo(hrsCU z-K!-=jDmv!zb7XT>)r|-Z0Ry}lk2;dk-ECqMwr_nKN#x*X6~B5hVIN>6$1HwBz3Of z=Pk){AL5*=d90f17_qZEJLm;Q%WMdX=*N&!ki@E&cy7?>{1ssAH(tACtp*r@d^til z)x(1#6(kPD+joSF&J3sxJU@{-sWCS+pZq{Gsx=?z4wP;>?)1yHv0?X?VP{}cX4~aH zxeBPKw_rgW8rvewS1W2#^y+c>-183iMbJCqc38RN_o~__9-n|jcd&oA`m7*&Fqqpc z;Tev*0LS-ZK47Sq1unfvP1S43uA12P?PJmI8BeTYPr~R*tYUm^0;U%Hmu?bSZHEK6 zPjsW=E67Kq-&trmf;)UkmRABH2U)V)-eRT$j(%G12lLMsThSsU10iP#{)ZnvjzN$d z*K%P3`}oqyvpWP~venr>3viH8^`)Ma*=B31hw*Q+tqE>i2y7w!(o^lI^Yss^=tHW( z;cnCT(%B1gLz+TRGW9roFjI1EQTu-u`(f#RmZ8;FSN(bsC1J;+(i_R6mrW=yYx$cy z#%QKVrEx~kVMg~yo?^N28Wnk6x%L;J8i|*|ANEiNjq(Vhzuzl3ikpA*G!Z}kLAzAI z9qnySo%D|AuJj12%h;Otqjs(>LPj?rNdeU8so>P(C>XMzlho94ZD#w=cCOOU;=3&^ zsqAG!i{~lY271D|m>ztPV`)X@FO_;`wPjppYNQpM+ncvtz1lZjN>!Q^*I}T%uP78Z7tbV2$q3W_)14=kLFyJ z1GqL6T>ClgeZorL!}xP4f%OB_EsmJ`uw7dGWNV9OLlhb|UMpVhc{4@Bhh`tO!ZqzD zhusd<=K^ah!L@gQ?6dOpI-ge^e>S5W9eII57Zu16eU?GRbgKTeVk9yS{iK|O(zLR> zheb?;jwGCHS80NCn=jKxgJ>}qu4l%5NPihjzazGv#J?Jcyl;<#IW&x4mm>nrW8>}C z3U@aeD~)*F(0o^2{GnKVm$Jr#aZE ztl~TOkM^SdzJapQ((!-i8b!RkVQBKkL`2ZCBuy!qI1L{3Er526plVols~68U-^9Px zR(3{j;Z9RHX^muc0dUywJ|`yyZFf=k&-Gb#m4u73Lm5Ks%BfHj%2|gjn#i> zLC5pO$2Em9H;qoKQmMtl<@wgtPF1%2HariD5O~u>8=^*J&au~JH%Ih@&2Uging3U_ z0bzfKucW$ZHSx}!#buB?+-J)%RQbbXM-!BJTS&#dU_@lxU6>te2O+9 z@F{F{Nb!;{Cd`Gx+$G?11aB~S#wIH%D=*=7f7H@D@%B1)&bF$@t3JDq4l*%(wJTlh zo`?uMq{YilKUewPNaC)GuOr<8j9&ofqRU__BRUX^x8Cj3a;a$rXzgXqW>LR#CUn%~m)t zYC&ol(gAkbc^fd`xWU&bk5vT6KbFmsR=O78Bn%t7 znbw&=c+|T&#r+bls5rU6D#HMvqA<|;)BV%jOMonkm^p$7Vcel-Wwn$=uAJv&(8W>% z9))Fxpl*(%E#wFm_m!U~2HqgZs^2vaGeY(UfYKrSHV}w^D0N6!se5Ewy)Yy-!(2

aKj2hWG7>znxs|SE zN4rHtiSPqLskWp(?(_YYwgq+1@8v+~8As|(bC>$D(atG3ZE8-ZM3SVcg|vHQz$I=!(A`k`5= zOqR>&%G)$)k*QLz7MTB9wleWpv&N9Sta64wy}3Ytd?x!Ja8z>(z~(3UNFu^eFmn#6 zw!!gUxOuZi$PQIs*ixfZR3iLyADJ z5&s%tPfk>V!x|A-;oq%1!yk9H$UBP0ToA*EDtz(^!_AnF1bBQ7joj|? z5b)gSI8c8O$PYFE!vXJ<4gebg*9G9P2wcB{#kv0FItc5T@PDNo)}Rh4Us}L{e}xzW zhwt`)j`M)mP=G6H0;^&q=I0{jU%bIRkF#uLF;{vVC&H|_uc literal 0 HcmV?d00001 diff --git a/ui/android/app/src/main/res/drawable-land-xxxhdpi/splash.png b/ui/android/app/src/main/res/drawable-land-xxxhdpi/splash.png new file mode 100644 index 0000000000000000000000000000000000000000..244ca2506dbe0fd8f6a05520ac7d1a629ea81438 GIT binary patch literal 17683 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 literal 0 HcmV?d00001 diff --git a/ui/android/app/src/main/res/drawable-port-xxhdpi/splash.png b/ui/android/app/src/main/res/drawable-port-xxhdpi/splash.png new file mode 100644 index 0000000000000000000000000000000000000000..bfabe6871a17a5e95b78fb30d49b7d2b4d2fe4c0 GIT binary patch literal 13346 zcmeHtX;_kJ`#04zO^aDmjwzz0HD;w|?h8>vW;LZ_?k1X=Ywq9%s7(u2rcRUQj;W;? z?mObrqFADUxi4r+2(G9IiVOaMW}f$Xp8tG#kK;X#_lqCy1MZvqIbjq1vUA2JAITZDzbJ0jFM$PIA*mcNVJ z;mf|x9&Xp&oNt8(esVJc05qE}UpQ|WHZV==FL$$wcsoBbd4YA2bV*k$^@^gYO5yc; zKa3?@Xom{!>s@%ZBVys0UhavwM=&Xqu&2r=6VK;t+=sq7*rZbW`w7y+eb2JbU-(TX z?dxnhoY#*kcFxS5n1!>5l)Ns(5rP?NYM2eHVMt=0Eb^}0h|-R{uA}z@BV#o#XpM@y}tclg8zH4>c0g4yD0JN z|68lS2k#c^`1jqvFT#FvNt<5!D~3h!u^D*Za(XkD#1`0uhfNUwdyCtIhySz5Z^FYS zJZ#o@|4{*N!o&Y(czAojH#2JM9bW=7YxylVaQb)n@)0z@aV)|q#za8bNC8;C*iz+0 ziGo9i_~+z|AaQj+W4T@MGVF$cXuDQhGySLDLUf?Oe>qBO9~Iz}k5zCi0;^BrH_TD2 zwdFp150!)zSU+hzsb*M^wPlNthzO;rkUwFHCh<{6Wo1Pq=w=Mp!ETKTuGkpzWaVR5 zoep||sJoM3awdXH&}~~~?`Yak6zZH`Gu0Nh4>g>p2!dJ0;3%{eg@%~GIRU-a3xYj` zJ8l4Rk`L8wD%~LsagJG;wmw-yD@jG^j94r)GMifbpVW`GT09rf6%n@4-wW$Ck2hF0 zy5!;bLnNr0-BAu#H*unnDw!1m;9;xYOg5uruY{1LndV_3Xs8_O_`)?{w`9K`Yog(r zr2Ipr;T1~9`X8wfK(5WPDXNg`eMy+&r+sK(7MyMIbc8&6+?#GS zMRnqTnk;%(@Ad3r!!0avN+C3Gk9w-4c#csVvnhp30K|YWOl=%T^ff9uGP-#UI2~ zGR+++d~f6}!>pKIZ?S#;VxtA;F_r3@|ow{wHe0y zaN0+HjLP7;93yj=xw?7dbO8FQ*mFIU)k-FMghNeN8LZpSI9k)6wp(dXzut!hD}<^~ z@}G^^wGZ{x;qhcf&~sQNv^MHqe~8e6FL)&S{5xP?CG+gD7#am?ARSX<_tKg(y^z^V z=qHsHF#TH`pRdvx?E;rWOJOhjRXfc0uxi!<&||?3*X}6iMF@5ROy6~4f23>_PBeE( zEp>5=C!PiIM=Hou2^eZyYI&4~#D-lR6D--hqbS~0(r139vDO|nTg$Z>vZOTA{-7<^ z)Y?k^XeSNlf035tm}SyY--UfH+bR+8m{+?zeQiG0)!5}H$aTW&>Yx0>qSXeaG^{6h z<3UfjMv>gE@u05VllgebAf#vi$X%4VMv@3FTpYWukP6YJPKG4m2;tP z;{P+U*{uli#7NPtQ{d~%qXiZK@L)Gv8l6*uR~3X9rf15i8)EYJ*&-02HQNL zdXf)O%k#SX% zOtSeJu0oPT!2uvNDbuAdE_ zU7b%C+c_%Ko;eGF_U<9$FkW9xo)#D5jcy0nqZ-Z(-yG2txw>2;Lm}(>u?2(F!AEla z(YMsi)a8d1OyqBakam<2;8|b3j84Qra$0#uJIK62y?NEqc}8rf4$Q2_AY(U$uHOd( zk>I4ycD{L9r{r5Mw=-h75XK5TG7}z*9rO!(Z49oXhoYZ;8Js4LsJz?pK0~bVWve)JakPbq(zO_*afxQ-uAjn@JM1 zM8cy%{ZNe|X3`EstE6@t`+~zK;L3>gZAv-Z$mIvtYtx^mtKo>?ViRt6=fbazOS`yx zgx0Z+RlTyL80 zilZ5)T54~jT9>9U6AlfnUP7-y#_(qG)r|o$67`PJamc!hiDa&(xiqiha7LjVWL;&R zWWv<3rECwiVt3wNXrAyf{W!*Di*-L-%p@q-|Mc~wdVdg90j7-zSHF2nIkBR8UCJ2f zcA#ZwU%Vj4g`QCRF~kkg**jdKPbg+4;XH&PdAf_E+@Ju72zX4wsXYp<3m~ENXOAoU ze?{fsP`j80HLz0Cv~izXRv9hxS^-L^%#?aXoN6z-{*2=Wp}|7f1bq7&B^2UNHNCed zD-FJ@B@EoLUzt7`sI#y3SBBxsQ}1w6jE`qaeC9v0L2cH>(h4islVjW->=xljONyk# zy8Wzo7-KYSHKr=kY_uXhJvLlk{WZ>1ahe`BO&@LM5*e1Kbn=ofPx6=%h7XbJkDH%G zkTQVZB-COd;aZU^ziIGlQt4GQ!L0nOm=ua8?){8j+ywu~O3e0YqquVBRKG0$(u78i z5X29%8-4+A`@!>078X+Zni)N1I5&V9=0&n1)lAHZAHHJ=WUm(xKVLiIknWkhUU)zT!5Et9Ihsy5;!~M zXF$<3%onWJ>^yGvTBh<$OsJE5v4tqwUKBIUMkz2SHlb@t;z0)qB72EJ9 zJdCp}_iF8U*c>pN z0|CS<-JRW6Yd=~iF-^7PmZ@2~AE=@@cJh7{n`<9pZR*awASyf1KMzUJqVrJ*)dk)sTQOkc?; z52Lj^#;p{+TT8{o%J63}8c{LMrATnPTa5$CTI__-8P)j@PJ3qh+D+hu&kk~KKLTyw z)x%U1Ixy5-`VaNz{;8y=4B_WVP!}XXH14^yhk%Wre`MU znFTL*zC9mV>(gF=)F{L*ZlLI}dA!1@UqeqqQZ4E@ujU6lgc6_cPsd~qsYu1&u6_S{ zO5d96U>i}Dmnq#CmBrqF$HIBLY}gsX>S)dQb748dJ<<)sbsZr`w3oy+N*%o zo*p=I_x^j_S2~b^7D)vKTGsk}X>U_Gc5?7Lp}P_!B4*l2gq^q{ximeirLV!7zBIi?alCqXbHixk4jyVr}W&mfH%^T zNpA7hu5=f_vx{nEmA2k2QuJwvoI#?px@nR_re|0{W3XspCHO4Y5VJXqMHwe{U-wLl1;9W=FY(ObYu& zRy2GUXUvS&W`OW!4#i5si--1rjY{`Q2se#!;L5;_v0;sSQA`pw9^Q36zy|+Rctm4MxL$m#6>gE+w|CUYoTOwnO}JE z@Upq#jp*Sp>=?Dld^U2nZ1hNXEo#pJBegQ|eC|Nx0I8$h*XyCzD}0}~gD>xR^jK_h z|B4SG60*45oF;<~*Qkc-U&nSZ9

VwO4Hu8X}%XHUAz_J@50rzbkIsat>4oWtQt< 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 literal 0 HcmV?d00001 diff --git a/ui/android/app/src/main/res/drawable-port-xxxhdpi/splash.png b/ui/android/app/src/main/res/drawable-port-xxxhdpi/splash.png new file mode 100644 index 0000000000000000000000000000000000000000..6929071268eb03ee0f088142b6523566b78550e2 GIT binary patch literal 17489 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 KR&><$`~L^lv%S~= literal 0 HcmV?d00001 diff --git a/ui/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/ui/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000..c7bd21d --- /dev/null +++ b/ui/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + diff --git a/ui/android/app/src/main/res/drawable/ic_launcher_background.xml b/ui/android/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..d5fccc5 --- /dev/null +++ b/ui/android/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ui/android/app/src/main/res/drawable/splash.png b/ui/android/app/src/main/res/drawable/splash.png new file mode 100644 index 0000000000000000000000000000000000000000..f7a64923ea1a0565d25fa139c176d6bf42184e48 GIT binary patch literal 4040 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 XyOn+%7f`N3b2T^T3uj5+eShz7v)7qy literal 0 HcmV?d00001 diff --git a/ui/android/app/src/main/res/layout/activity_main.xml b/ui/android/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..b5ad138 --- /dev/null +++ b/ui/android/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,12 @@ + + + + + diff --git a/ui/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/ui/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..036d09b --- /dev/null +++ b/ui/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/ui/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/ui/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..036d09b --- /dev/null +++ b/ui/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/ui/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/ui/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..c023e50595074292c7361183a64de08cf9686c9c GIT binary patch literal 2786 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 literal 0 HcmV?d00001 diff --git a/ui/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/ui/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..2127973b2d318df7085734d236d0ec649a2b0292 GIT binary patch literal 3450 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 literal 0 HcmV?d00001 diff --git a/ui/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/ui/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..4d1e077104cd61e6a4c3707e87363b523077245a GIT binary patch literal 3981 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 nm0GElTB(&OnKI&V600000NkvXXu0mjff+~0a literal 0 HcmV?d00001 diff --git a/ui/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/ui/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..df0f15880bee46332dfc6622583215194f948b0f GIT binary patch literal 5036 zcmcIoi93{C+@3*W8A~-7Lt;iog~4QN;mz2xwi=8P@#wV-jb(@^`>qUSk9w8f&|oZ0 zBbo@K(M#EdEUziqlAV_C@m}Ab@O{^Hp66WGbIx_ndCs|i_wT+>$~k*W2{Cyw2m~Tw zb;j%hSP$(!A~5isqO7?9fgpmd%uFs_A6Xdl%f8fx5~jZLn3B17Cer-q>u4Pv`BlH` zyuxT=x>l^gr5rt(J%=hdsU#hy83JmP(4@05JT_bOx#)Q9pWVeaZpDi?bAJ4Gc%lK5 zOFFjlaq%Ym$qu7&uaL?AN6Gx1bU4E{%g?K+%3|7Xroieupzar?H%`69Xb54O_Rrl( z|9$znfwk5rtED#fR@2Z(!QV6W#UrBy*KcJs{W5I2b0P+7<9?jkZxmnITiYrlmaoak zkC&M{; z(N-1~d)ZOHWRu|eRm4I>z9tUhDa428^McPm?-9n~0OQ6tWGLD&+vH(3-h=wQd_Mn7ukQEUPS!NH*mY&e=6_*Z2Mu)>><()OiY_7*7 z-ef@G+a&3g5v01jQq{oXD3kp;HKRhpnL<9nbqb`xe6>fxCUHvzUoG^CL+WP&c8?9 z7-6)FOmgKhR|I!Y&dG3|xf0v{+M)e&_2kuUW)3Ay5gF}6-1oR1XbV7p{<<%Kyyb_# zuLe(0Uy=<7Lq0!1%{X5ccBJ=)U#CUk0PCufw+Z)a8R8In&N2N3g|0U#pxqj-?Z!YKPP{c`effDf3<=fPtNk`v)Vapx z%(FaQp!w*%BCcWJzf7?P4(4pol$Cah_2){MJ=NgR<3ZS#A39m$*Z9ybG zcv_a0r&4(RbbDZQ>@^^(*^`)%j*Z%CPN5{(2%~iM(qBg^&uJIix1>?DT__sME+5PR z6s|ZYE$94;313r~ou;{@Js=dj9z7wh#+(rv{vah-bHjTtQ>$6w`{dVe6TSqPoxFpY zBoO|*hlU?P;zwT3zu+Ng)XPt=4PY@bQQw|j*m%k4t8jbU>X0N}pvzl51|V*b8&-g3 z`aZ^IE%mi;H->4{n;1#w+jDAaOfWbcpPvKQhU$vT(9G<=Z;aXFoH}>x@%pRh67!Q` zUg(_(QtVuYKN-i3oE~YeLgBsfMc(=*1EFbzbfobuwBIhy zZQqIwRx|r)NL4VFvF@v?Cfj>I{*%3BVNvC?`1PDo!Nm2D%Yws4GIWMd{J{_w87%zB zDbIAs=zPoZZk}IRO0*_C=-lTNsFkwZj#Xzmlzo0{pcl2}mMV-2wh84&B+iW+)PhGc zxxMrJf6r|2q;E(-4Af)Ej!C&NSxm#C1#4=Kliq-)ox z9H>$o#VB`JZs*!>sZSypQKF2U@wW_2HJ;hXa}*tFQYBx=G|AqheP6TPL&b0Vt*FsE zbvG|gkqh1iIKs&O$nvE(o$t+($=t_~YJT?nRvUPFi5%PYB^&y)1k19OC)&&Kcmm=HcWMppMtr$X8KvD? z_Vw#L+79TtmBp#c;z*z2T0CPmP-n*Dzp*6(nqzG!Ms_a`ntz0WVw%VSTQ#jc zkD%$EE`NUFQmEmxID7ifjr9QX>J8n+k+2UEsGlg32u0x&H}%g5(~EHJe~fy6Di<0~ zem{=o(eK+(7tT_R^6D<{j0c+XQ+WnV3`oyV{&b&|JrE}}{9|yfg5RW~E>PjqX-|H4 zP>sCxIIgmseJ1<8(&gzJS}gj#K&X?TcFAXApmJ$KW5<5+SEow*N~$Q2U)@fr3|PRJ z-0+T=Rle~6hBEpmB~8Iu1_!CIO3p^QWho0cazro(8Rgfxq;`O86(qPKgFI1&+pRi@N{L}N4@}{))9Z@?fG#SEAMsLidRvnl5(v#xc0WnC3!Ogk zM^h^IA5n{|!&ycLP>u?C1Q~)AcS4~iBUDX-HX}nFFo=Py{K^(BmC}ww6Xm8?Q{fyT z0UmwK8pMvu?=#ey!SJ-4`O1k!52&0GR@4!dFM)#~#L~aNd-gDb?*Xfn9o{nf;M#Y3 zeNa_ZKSXj^ilA{L52C?(ModAn6eedG_No*SmLL&M@z*#bK{--u|hb zOP}GGp$k8|DQk%42GI6#;sq;CPW*_tO);rbg_Ab(hG@tQxH0vwrw^{AiWkH~T>Ot$ zPqMFs>4-7Io0qcN%m#=(XXrk~Oi??5=x4qMkH0a-?u7lwv6aV<`98$qz01#Vk3Awv zNWH5#kbS%ksDkFNoywI2zb99%+;9zCAT&I1+!SGl2JXM9a$k-W(gE~b>NQ`@=vtfj zuF&Pl+^abZ<%Q!x)CSJh0X==%u$6=^nOys@;j?6GBtc;mW=(q!?8L;aWLpC||K<5lc>EF8;$59#Xq=3a7f|zGZjT^Xe7b%w zv0~qF_!Z6JQ{5wN2ZpJ2C{X6;KudqHMrovO{>di{^|j4dld$E{aRM=*Gv{XJ^5xSA z!RnVYc+JVAw+SxRM$3V)`Q<%77laRfEX{u3?Mn3Za<#Z7P;emTUSmRd*!lg8PdESS zyC%l5CE?%qx25LHZ*}+0-_3V`x`uiOL5K$Ytk`*v*txKaxH~QS$ zEcZDU4}tlAzmtoJiat|%FyWEkrqzHE#gu;voAz>P3NFLiWmvd7yT8Q=jG}BLlQD@X zxum?(=bB!xItnkT7-$vtM8{!G-OC3c5F}kRN8c7EJxcK)YhOp&6a=$~I?Le|#pYGIN{HwRi9n3n~tgL!@AD7dm;C%7d^i%xJTQ1MSBz7Z>tkb){XREfA@b(*Mb}dY1@fi~9FS_((##WN z2odp#MW(xwivKPx!LnqZIHH_UPJ;MtJqM+Vpw@4fkV=+n_X4-fuC5dtObS#Nh$l|+ zt!?Qutm4a~qFu1zYzfv^5%N~QD1mkVml9?0Eo&N+N1?Soo#fpNl~bP9 zz#`C)7s*ZZ_ra&LwcX8uG<6iCG$e|x;N)pTBv{;OocdrAIy6;*i`V#QTDtUOBobZw zdXGCH=6p_oWPfdmU7%f6InnlsYUvifz+hT@BX9m^Rnig3+daM1P~C!RLnAq zty~(Q>iE0|$@Fyd*BVt6F&)sP!Tmv5pzQ7iiaZgdopn<3vQ^G+amB&D~7V(19iG&FQAHi-*D;SBphY*1kPy45icO69vJ1a zsOP=6{<&A!8sb6n_&Z^9o3Ct?9HTPI{qpPmQ$w=4aXGj%7BV{K?bYWc{6kw4Du$lT zhRmQ#r8G4i3l2Ba5{tNB#%X06cY+r@P$*rWoY}#X0hWlZ7QG!G4H4&kj>|enxT!1( zzta{R>Gi2Re;d9+?jgW|bqHP2GJ^n>x4mv*1MrY4L#L^r{aR+=!{tyWmfQ?>Z?l$k z1s(?at0?TT)c^RrXQDgNtSpWvjQ3`ekM<{~D>!yk-=%E#ub*RiDA&HYMFx57il&Dm zbBIO2)V`M4pU?X_eHvzWJ1vUG-6l{IKz++kO-cVX#@Ns@=T{?*b#*GsxE<_kt z!Zln{YHE0>iud+_SU6u^csf&mP>NyvDXCQ$R4SrcPB`FF^Aj2Qq8f9UojB)v4sX|l z;OqfoY9NNUnO?{yZ zkKyfc9{b4~Fxftxs44hTz)#&fPZ^%VgE^le>(Bgd*y(sNG$f7Eb%v-I3UNb=HS}=^ zU|NJ_n>joFhZa{?a&eb&*{tuQ0jFgVxsuF0R!C<4_^b0mKo0=vk_OYKD61gTiqjw8 zwf-y6Uib^R06X^vR(YmXi$j9#eugU-ySULU%wz`_KeQ6eQ)giC5uPWT9%jjH_k3{F zcr3GoUqLOqzo1;CU%9`s%~-g5`4^e`ulc>0W=Yud&gQmR9l5(G`cd;3D# zQ_`A!ihlq5_-aMErX# zJomYQc3? z=y@ZO?)fRa1iU_ZM?&5Kt66D(3f&H(VXXa+sbZw^H0M7+q<~XF<>ite4Ag2%} tf=pxua1X!R?<}Opz+?5+Aw4Dw`!)j~apUm+P>)}HA|Q&(;Q0w? zPG}?;42GH{Nuee}^LYKl>kEXv&YJpr^jOE?^<^H9{|P*oUPt)8^!Oyz|5ro%CA7bL ze1WEbAnJh)SWAMciL}WN095jL1Cr`>?Po*Ba=HBk&jF7nJSRQ()kfF%T?T$6v@~dC z2sZZQKtNOj&HxVT^=@tRdIRz?4Bih4q9{4tJ~4n#G!}x_K(A%wca8|Av#S3`LHl25 z9eC$}4RL#XL7zVmumZTYMUx|d9D2Tw`29kN5PGfvJ0B&YgI?PxjZ`LlYjs}re1ITG z>CjUhtmgqRqRZnG0DN1Z>op_+f}wS&rHT^afR>KetamTpmR_H%`v2F^ zs_@PP&|m0{0!o3~<0k+9NO0 zAaap=rznbX2cO9f9zTj>=4onc!2IH8diQ$C={@wiH#NOJr~o4pwd@20K?X^PBMEpc z+2MkfArZ11#b#-E?E&Vu1VQ*C++xBd6|J%QRf3Hh|1mQI7n6|IvnqhJoLRC9o4-xNre`elCKql^i6Y&EdvGi?@f_ zvIM6)I`|QJf<+Rrb2v4f1MgMN;60u^kfUoaDhaAEGYKvtTOWMpaIxp`$NN^~2mz6k zEJ3u9C-}L0zEi#)W53{ZI(L8k@yE#*B|1{az;IEYsbxpq^JVaT0iq5)d3!039EFZ) zBhC+%ElfyY78&I_p#Nc+NhIy<9bc%Tqr@KX{c!OMY059@g0BM%-VC=Tn8=aKg6u>u zTll$UCkhD?L`I~c;apmeS^@L+5DWhldwxJk^(6+9T6TH00&w4U4N&ro}bXw*)xPTCLMX652Z4hCN?bLOfRF z2$CO&@jIOH>-mx634YSn<);ppAAHR{fH(-Gv9WOjV3nxCEk3;;;@&4zwVkl?g3|ae z-ijQ#{SsMsMkJpWL)7Eznc`hdheZB-SR@B(MG_Fruic}6?Q+q`?RJy0va%U*u>$5$ z+S}XvgNap8=@G*mE0rBN+I3tnY?v}_?J0-IAYms;Y@ddxdC6NUO zCGzu45}CO}B1andWXB*Wl%=Sxt*vU?wrxL%*(uX6C%C=dKT+us)y`0>$5tFz_YLXG z5d!^p0DtB#iA>Ly$h4gb3CoM6xRKD%DUsLqN#wE33IW)rZc@W3@nl==1qV zWo6~Nh@EW$*cTlR$4EGFyPy=DawLR-zrIW&zsmv8fqy-yrQ21Fdu#yP*EXWal2E)zlYLPs>7YN9SLIRZ|e4cTJUyd5OB=TQh zO5|5tfPgJgNT71`ES$6OY#?l)pSNMah{@UM)2H9IFQ&M#fMbOd6%Zr!>h zvx;XzV`Iy&R0ADB(;-2Na^wJKiw>8EI3Jax=Zr|uP(M>=! z5}v2v3u62Rb<{F+@Zgs-5nJfoz0IPZM2Dku2`xKF+=JqrBw(DswMrm4wE_7#7ij{1 zN8*Z(Se`H!2>VTzLV%V8CP$2b=ipccjqw{#&`$L7dVQqu#L3mPNS72%Gv2Iev2!Oct zF;&@FvOY~DvdW24lL^i=6{3;Z0QyUZyGcj|LUz?zn57^pa`fyzJ~=WX;Uxh7L{mIx zWrvf%CI<_G;)pvtJIUU?d!I54N16V&x3|ARrxn_tudk9L*7IKm@aKG~5P%Y-CSfl8 z&939O1SG*sj?`rfEeW&tDNb69=b(AHSE6`%G3kG)D;_qR(z z7eqSSLFa#;2OvXFpL4{R1hj-b^%A#FU~**Wn0IL`ff6tWz(3I(U+~o=V3j~StcfLR zzu!-ai;LF)#>o-+fGS1q?RL9&$AbW+xaK1pt3;BTt60F?uP6yeCgLX!ds9Splo7Cb^X5_T*(N(7sCsdPUM_$=dP|KIDMtpD@G_Mn zDTW`HJ!H9sw?b~z4fqvP~0pMiO5;2q` zB;nOOeL0$~L&6>la^$0O^c-jH2;~S%*>;CF1L4t*akA#|$pkbvH##q-kJfKD$h9Uvlx%BazrHnTl zCPyYDVA*1q)v^Vr98FWrw$PFwgYUAvj7kneYierhAlDj=SclCOqKR1I`0?WhLM9xM zh^Z}sO{9wFEM<8jR+S=0Jjt5um>c+gf>GIGW|R;Wr$Ms0sDcgI(OHF0Dk>^YjTkXv z2x6^G#N=^cXxBI#jvT#G1grSPV{wELNazz%Ig_=xl`WzSZ+=z+!24*=7h+mUD;q&^ zaWR%6FcVHpOG^tYMI^urXcGM(R{cbe0J=t28CdV3Ee5JOCGw}^-TolL5)Ma}E%wB- zY@w;5;-ui6<^GsD90JdZad~-p8G!NCh;_u^JRKxR0WFK#nYzElfzj_Fe&8ms5;sML!)E4!T?}0(llr*iF$LkfASLb@=e% zCsjLENqPe;b|xyBf&aG>B|}clQwU%ryv&&~+bvuChk+a|IU$h_uWDq=J_&LJ)X~vF zKKbO6rx9b&|K3I;V!c23;Dad;inb}vN06r^>X~4?Ea99>BFi8XeeEa^a8w~cO9D@H z^zxV1s;EY@Es&7^DU?W;FZTFf9fF=cd$!}1S6;afF*X{KL`}jsuIuXR%9q!`y1Y`f zXvZBR3GHx`O9A}fA5#d3MuL?ps+F?EmdfzCsDA?=)aHrbVsci}DJdx_0&H(UjKdtT z`T=S3mGEZ(#H$}Gp=Lm`Gaky*n%xpvd|D!}=PLw+k&vfD0%x8ODqC<`0tOUW)gpNj zEMaL;WY4!#fYU74ki1?m$;rvV(Xas&WBo@~Ru;b5Z|BZkGgX`D1$juYVhN1^{)#e* z%*$5@&?P}-34exO`DvMP*i7qB%w}6?tC}q0<6UwaEjprpLg;WfL4NjR z0;Yp0w$UHJ5Qa$CW@cv2P&u0*KMDGB)C`VoWw}J&C{!9F!N?Nc0X;s`5jlIotZbp1 zC+N(!Fe)!top2m5DA2+GK`%(#`Nk&l{`>F0fS5+re~k>K+<4=SquScqPTLtD);eaC zoh2YU^FhnsI37vDJPiqdDV9jN!$R5OD{Ey7w$n;94R>0o^oHa}P+5}4FE45-Dk>_w z{`%{2v0jR){IJI}&pd-uCk7omcI+K$1(qjiDRLAb=UpOMQLcc`S~L>ghMr&BWj=4m zWwDAnhvo@xKVKB16dkR}k>X3_zrg?qx5MEe>({Sej95}k`5sh;u9-1o#$AvTG+CXf z%UXxaPd=*<$pUbs*vv>+RIJF3m60_ovn^hQ_r7ZIbC=PhO)@aDgm!t8D!=S}%gf7K z9)0xDA0w8tXV1RU%0fwbju8AET3A@P4EI2=I!~0D<%w32yj>!hlJIVcQjD`xMU6Jw zLQTTzuO&Iuw7Z1X)MDUsXf;TH!_i5=kA8+2QY@|Q8$lTxFn#*;e*sf!wqgb9-4L-p zQvzXRda*GH41Bv)*3fJVl^m(ZnDO~C)$9jl^`_tAVsc}jpx%;GUd%29Nm0q^3()(2 zf*8)4HR~!ni{%rhPMwNdyAL~b=+Jw(@R-L6jN;>C7gQvu2v`K*f87zE@dWK`3uXx) zL&n|i)vj3!aPMblwzq|w?wLVL&k`2i)~s3c5n@L%w6|*tm=5}afe;Z*XlQ6CHOmXk z7H6X+sO9LtPbm&JUR71}3F>K(NW`b5#slqk_O?*Vk=*mcqa}IZ1!TKo`0(MFcn#!= z{i9g{m=Q8~!^)K_UvN6*AGOf61fES;QI1ZwL4pM&{1tj-g(Lp6lu?d0LZ0wCk*o-}FFAox3a)22=Dwzjnq zx0inosnM1%@v;P?ja;qHVUp!YCr{AZ*NEwUZCwLdzI^5Thz-T4NA{CW0A1_Tw{KsZ z*K%uCc1}iTXP4}g>7L4_vSYTsN{q4R8(E@Y(Gs+Bq_-s}t@TT7&=EIm*su{XL2T$! z)E@h#jl|KTM_)sS)+XlW=I+MPesn-aB=C+C*d1fm%8uzIVjFU#-62fb8ZIc}%E#>N z?0ta6B*cVb)8oIekpzxL_6Nzy$&>T*^S?48!Rk&^9*aAY2qxRs$2yZ6Nx<5Uw&&x$ z;`Rf3_wGFk7)(JdC?*%>mo?2nuiK(Xl6lhUI{0&~hYL%aRJfde_1g3EhndVCV^ z)@H`r%=^t9Zou|rDN_>UiD;fPMgN5*JYnw%6DHs< z4B@ZP-IkS=wXXi`IpSA<5n}mO45KXoLbH@(o2zL!@)cU)sVX(;GD zhl^VdjHLJ8`SJ%#w^(-0)2wKTuL*H7!cy~n=@KD zk{zzsA1bWT&G+Q`PGx0fV9AoD7-~+$d!_gMje;L0M>pJX!$0-!-ycaBKY#xG-$7Pb zjatcmW56~EG*1v?lpP*RVDn#DuV;Ha96frpCN(t`ldSQ0k9e=&l&Cm4;ytLGc7aHqvYkzOmV>m?gEZrnO%%orTi z8i)6GEj%tY@YN(>7}j^xs8Kh<-!T{;r>Cc<78DeewzjsiUoe%F9eBkcFE|K{%hNNn zvPGrD90V)Fz(J1S@LHkQm!+kpy+&jFG4!7L(tEt5f6@>Wk*jXL`R2ic1`WbrCjH^S zfdhZ^`RAX1c$W-MMSUNi0WN#92BBQj^yPcY}f;G9QN zA|^r_f7il=3+HBLW^OJjDynO2Y?OBx>~wmFsHj4S6dKZs?19qZR(`{#`$Yw5bfTgf zY`XQnOmtIIGsw*GT5ztL@!W6?chep}7OxGjk!pRfZ#(dMz5z|SFKQ}{mQb3;0|>W` z9Xs|XZ@&3v>Y6nfUmQ7dq_C{4>_SshlRUtUze<5?tmw#72vkh?uuc=~CQAMcMqRi= z6;6z5X=#xvDk@rXb8`#VuV4Sgf(37;;<@mgcy7D~ycVkSed#qOUhy4%Fd|Ygo`yCI zVrym<6A&0^cRu*wgO5NyF?Z$4mG5oYvgIH9;gO%8e*(0+vb41HTvb(7b6s6sYk5Uw zYiU_|GZ1zT-^0%wIB;P9)~#DJKw92guwcO)JQg04f{weDjKy=}xoJ$F@_hi_$VbR) z5>Ru|>EWDI9N576It6PIR$Z~`h;jk%|M-qO?)cXS9(dppc>EhSe2%Zdd-vgI=w~NW zO`kxIH5!kN=b-xDkDfc}yCyYuh)ATGi-7cn-Z=mlG-K?I@<1(Q6qT&86i{sARP9#! z9)4yNeh0rxk1+&~NhRh=dalIpJMcV&V6CMO0*6^P&NLW0bm$ML4;i9v_!_>4pTW;k zu=~(sTn0QwLKrEDR5Fq%sOrXEPgH?@$pilXR@`CbaUM_;00000NkvXXu0mjfFgAy6 literal 0 HcmV?d00001 diff --git a/ui/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/ui/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..6cdf97c1196d48e9833487ff6de7c4cfc4e1232d GIT binary patch literal 6644 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 literal 0 HcmV?d00001 diff --git a/ui/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/ui/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..2960cbb6104b915c84760f889deed9bff2b3e17a GIT binary patch literal 9793 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 y3vD~Wi9;mL_v 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 literal 0 HcmV?d00001 diff --git a/ui/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/ui/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..a40d73e9c68ea638c28c7b13e4bcd1e179a3a102 GIT binary patch literal 15916 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 + + #FFFFFF + \ No newline at end of file diff --git a/ui/android/app/src/main/res/values/strings.xml b/ui/android/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..b20c99f --- /dev/null +++ b/ui/android/app/src/main/res/values/strings.xml @@ -0,0 +1,7 @@ + + + Эрудит + Эрудит + ru.eruditgame.app + ru.eruditgame.app + diff --git a/ui/android/app/src/main/res/values/styles.xml b/ui/android/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..be874e5 --- /dev/null +++ b/ui/android/app/src/main/res/values/styles.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/ui/android/app/src/main/res/xml/file_paths.xml b/ui/android/app/src/main/res/xml/file_paths.xml new file mode 100644 index 0000000..bd0c4d8 --- /dev/null +++ b/ui/android/app/src/main/res/xml/file_paths.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/ui/android/app/src/test/java/com/getcapacitor/myapp/ExampleUnitTest.java b/ui/android/app/src/test/java/com/getcapacitor/myapp/ExampleUnitTest.java new file mode 100644 index 0000000..0297327 --- /dev/null +++ b/ui/android/app/src/test/java/com/getcapacitor/myapp/ExampleUnitTest.java @@ -0,0 +1,18 @@ +package com.getcapacitor.myapp; + +import static org.junit.Assert.*; + +import org.junit.Test; + +/** + * Example local unit test, which will execute on the development machine (host). + * + * @see Testing documentation + */ +public class ExampleUnitTest { + + @Test + public void addition_isCorrect() throws Exception { + assertEquals(4, 2 + 2); + } +} diff --git a/ui/android/build.gradle b/ui/android/build.gradle new file mode 100644 index 0000000..f8f0e43 --- /dev/null +++ b/ui/android/build.gradle @@ -0,0 +1,29 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. + +buildscript { + + repositories { + google() + mavenCentral() + } + dependencies { + classpath 'com.android.tools.build:gradle:8.13.0' + classpath 'com.google.gms:google-services:4.4.4' + + // NOTE: Do not place your application dependencies here; they belong + // in the individual module build.gradle files + } +} + +apply from: "variables.gradle" + +allprojects { + repositories { + google() + mavenCentral() + } +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/ui/android/capacitor.settings.gradle b/ui/android/capacitor.settings.gradle new file mode 100644 index 0000000..df10e2f --- /dev/null +++ b/ui/android/capacitor.settings.gradle @@ -0,0 +1,6 @@ +// DO NOT EDIT THIS FILE! IT IS GENERATED EACH TIME "capacitor update" IS RUN +include ':capacitor-android' +project(':capacitor-android').projectDir = new File('../node_modules/.pnpm/@capacitor+android@8.4.1_@capacitor+core@8.4.1/node_modules/@capacitor/android/capacitor') + +include ':capacitor-app' +project(':capacitor-app').projectDir = new File('../node_modules/.pnpm/@capacitor+app@8.1.0_@capacitor+core@8.4.1/node_modules/@capacitor/app/android') diff --git a/ui/android/gradle.properties b/ui/android/gradle.properties new file mode 100644 index 0000000..2e87c52 --- /dev/null +++ b/ui/android/gradle.properties @@ -0,0 +1,22 @@ +# Project-wide Gradle settings. + +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. + +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html + +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +org.gradle.jvmargs=-Xmx1536m + +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true + +# AndroidX package structure to make it clearer which packages are bundled with the +# Android operating system, and which are packaged with your app's APK +# https://developer.android.com/topic/libraries/support-library/androidx-rn +android.useAndroidX=true diff --git a/ui/android/gradle/wrapper/gradle-wrapper.jar b/ui/android/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..1b33c55baabb587c669f562ae36f953de2481846 GIT binary patch literal 43764 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 '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH="\\\"\\\"" + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/ui/android/gradlew.bat b/ui/android/gradlew.bat new file mode 100644 index 0000000..db3a6ac --- /dev/null +++ b/ui/android/gradlew.bat @@ -0,0 +1,94 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH= + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/ui/android/settings.gradle b/ui/android/settings.gradle new file mode 100644 index 0000000..3b4431d --- /dev/null +++ b/ui/android/settings.gradle @@ -0,0 +1,5 @@ +include ':app' +include ':capacitor-cordova-android-plugins' +project(':capacitor-cordova-android-plugins').projectDir = new File('./capacitor-cordova-android-plugins/') + +apply from: 'capacitor.settings.gradle' \ No newline at end of file diff --git a/ui/android/variables.gradle b/ui/android/variables.gradle new file mode 100644 index 0000000..ee4ba41 --- /dev/null +++ b/ui/android/variables.gradle @@ -0,0 +1,16 @@ +ext { + minSdkVersion = 24 + compileSdkVersion = 36 + targetSdkVersion = 36 + androidxActivityVersion = '1.11.0' + androidxAppCompatVersion = '1.7.1' + androidxCoordinatorLayoutVersion = '1.3.0' + androidxCoreVersion = '1.17.0' + androidxFragmentVersion = '1.8.9' + coreSplashScreenVersion = '1.2.0' + androidxWebkitVersion = '1.14.0' + junitVersion = '4.13.2' + androidxJunitVersion = '1.3.0' + androidxEspressoCoreVersion = '3.7.0' + cordovaAndroidVersion = '14.0.1' +} \ No newline at end of file diff --git a/ui/capacitor.config.ts b/ui/capacitor.config.ts new file mode 100644 index 0000000..839931e --- /dev/null +++ b/ui/capacitor.config.ts @@ -0,0 +1,12 @@ +import type { CapacitorConfig } from '@capacitor/cli'; + +const config: CapacitorConfig = { + appId: 'ru.eruditgame.app', + appName: 'Эрудит', + webDir: 'dist', + // Bundle model: no server.url — the WebView loads the packaged dist/ from app assets. Updates + // ship through the store; the client-version gate turns away a build too old to speak the + // current wire contract (docs/ARCHITECTURE.md §2). +}; + +export default config; diff --git a/ui/package.json b/ui/package.json index 2af78a8..e400e7b 100644 --- a/ui/package.json +++ b/ui/package.json @@ -9,6 +9,8 @@ "start": "vite --mode mock", "build": "vite build", "preview": "vite preview", + "cap:sync": "cap sync android", + "android:assets": "capacitor-assets generate --android", "check": "svelte-check --tsconfig ./tsconfig.json", "codegen": "rm -rf src/gen && flatc --ts -o src/gen/fbs ../pkg/fbs/scrabble.fbs && buf generate ../gateway --template buf.gen.yaml", "test:unit": "vitest run", @@ -17,6 +19,9 @@ }, "dependencies": { "@bufbuild/protobuf": "^2.12.0", + "@capacitor/android": "^8.4.1", + "@capacitor/app": "^8.1.0", + "@capacitor/core": "^8.4.1", "@connectrpc/connect": "^2.1.0", "@connectrpc/connect-web": "^2.1.0", "@vkontakte/vk-bridge": "^3.0.2", @@ -24,6 +29,8 @@ }, "devDependencies": { "@bufbuild/protoc-gen-es": "^2.12.0", + "@capacitor/assets": "^3.0.5", + "@capacitor/cli": "^8.4.1", "@playwright/test": "^1.49.0", "@sveltejs/vite-plugin-svelte": "^5.0.0", "@types/node": "^22.10.0", diff --git a/ui/pnpm-lock.yaml b/ui/pnpm-lock.yaml index d819061..3c0d256 100644 --- a/ui/pnpm-lock.yaml +++ b/ui/pnpm-lock.yaml @@ -11,6 +11,15 @@ importers: '@bufbuild/protobuf': specifier: ^2.12.0 version: 2.12.0 + '@capacitor/android': + specifier: ^8.4.1 + version: 8.4.1(@capacitor/core@8.4.1) + '@capacitor/app': + specifier: ^8.1.0 + version: 8.1.0(@capacitor/core@8.4.1) + '@capacitor/core': + specifier: ^8.4.1 + version: 8.4.1 '@connectrpc/connect': specifier: ^2.1.0 version: 2.1.1(@bufbuild/protobuf@2.12.0) @@ -27,6 +36,12 @@ importers: '@bufbuild/protoc-gen-es': specifier: ^2.12.0 version: 2.12.0(@bufbuild/protobuf@2.12.0) + '@capacitor/assets': + specifier: ^3.0.5 + version: 3.0.5(@types/node@22.19.19)(typescript@5.9.3) + '@capacitor/cli': + specifier: ^8.4.1 + version: 8.4.1 '@playwright/test': specifier: ^1.49.0 version: 1.60.0 @@ -595,6 +610,34 @@ packages: '@bufbuild/protoplugin@2.12.0': resolution: {integrity: sha512-ORlDITp8AFUXzIhLRoMCG+ud+D3MPKWb5HQXBoskMMnjeyEjE1H1qLonVNPyOr8lkx3xSfYUo8a0dvOZJVAzow==} + '@capacitor/android@8.4.1': + resolution: {integrity: sha512-igtDCJ7QQn0P2qHFD9p4KXaa6V1b2PRNt+MxjVwtjTm/BJvqmiazOJq6rPjwFSZnfHm6iFoZk8TfzHd44pyBGw==} + peerDependencies: + '@capacitor/core': ^8.4.0 + + '@capacitor/app@8.1.0': + resolution: {integrity: sha512-MlmttTOWHDedr/G4SrhNRxsXMqY+R75S4MM4eIgzsgCzOYhb/MpCkA5Q3nuOCfL1oHm26xjUzqZ5aupbOwdfYg==} + peerDependencies: + '@capacitor/core': '>=8.0.0' + + '@capacitor/assets@3.0.5': + resolution: {integrity: sha512-ohz/OUq61Y1Fc6aVSt0uDrUdeOA7oTH4pkWDbv/8I3UrPjH7oPkzYhShuDRUjekNp9RBi198VSFdt0CetpEOzw==} + engines: {node: '>=10.3.0'} + hasBin: true + + '@capacitor/cli@5.7.8': + resolution: {integrity: sha512-qN8LDlREMhrYhOvVXahoJVNkP8LP55/YPRJrzTAFrMqlNJC18L3CzgWYIblFPnuwfbH/RxbfoZT/ydkwgVpMrw==} + engines: {node: '>=16.0.0'} + hasBin: true + + '@capacitor/cli@8.4.1': + resolution: {integrity: sha512-t7F2s7fFHCq113xgrggrmK6ctV0/8E5YfLNVLfPHp4GCTDO+tly9fZvWPf2/sOI8lMm18dLT43qbXLRTz/OZgw==} + engines: {node: '>=22.0.0'} + hasBin: true + + '@capacitor/core@8.4.1': + resolution: {integrity: sha512-xqhOGLbTAYeOWK+IDUNSjQJAPapQjRHrIcgk9PYp52or9zFTaaMko31uNi16N6W+CRJ8VrRram6fOYILkBG2Hg==} + '@connectrpc/connect-web@2.1.1': resolution: {integrity: sha512-J8317Q2MaFRCT1jzVR1o06bZhDIBmU0UAzWx6xOIXzOq8+k71/+k7MUF7AwcBUX+34WIvbm5syRgC5HXQA8fOg==} peerDependencies: @@ -606,6 +649,10 @@ packages: peerDependencies: '@bufbuild/protobuf': ^2.7.0 + '@cspotcode/source-map-support@0.8.1': + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + '@esbuild/aix-ppc64@0.25.12': resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} engines: {node: '>=18'} @@ -762,10 +809,66 @@ packages: cpu: [x64] os: [win32] + '@hutson/parse-repository-url@3.0.2': + resolution: {integrity: sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==} + engines: {node: '>=6.9.0'} + + '@ionic/cli-framework-output@2.2.8': + resolution: {integrity: sha512-TshtaFQsovB4NWRBydbNFawql6yul7d5bMiW1WYYf17hd99V6xdDdk3vtF51bw6sLkxON3bDQpWsnUc9/hVo3g==} + engines: {node: '>=16.0.0'} + + '@ionic/utils-array@2.1.6': + resolution: {integrity: sha512-0JZ1Zkp3wURnv8oq6Qt7fMPo5MpjbLoUoa9Bu2Q4PJuSDWM8H8gwF3dQO7VTeUj3/0o1IB1wGkFWZZYgUXZMUg==} + engines: {node: '>=16.0.0'} + + '@ionic/utils-fs@3.1.7': + resolution: {integrity: sha512-2EknRvMVfhnyhL1VhFkSLa5gOcycK91VnjfrTB0kbqkTFCOXyXgVLI5whzq7SLrgD9t1aqos3lMMQyVzaQ5gVA==} + engines: {node: '>=16.0.0'} + + '@ionic/utils-object@2.1.6': + resolution: {integrity: sha512-vCl7sl6JjBHFw99CuAqHljYJpcE88YaH2ZW4ELiC/Zwxl5tiwn4kbdP/gxi2OT3MQb1vOtgAmSNRtusvgxI8ww==} + engines: {node: '>=16.0.0'} + + '@ionic/utils-process@2.1.11': + resolution: {integrity: sha512-Uavxn+x8j3rDlZEk1X7YnaN6wCgbCwYQOeIjv/m94i1dzslqWhqIHEqxEyeE8HsT5Negboagg7GtQiABy+BLbA==} + engines: {node: '>=16.0.0'} + + '@ionic/utils-process@2.1.12': + resolution: {integrity: sha512-Jqkgyq7zBs/v/J3YvKtQQiIcxfJyplPgECMWgdO0E1fKrrH8EF0QGHNJ9mJCn6PYe2UtHNS8JJf5G21e09DfYg==} + engines: {node: '>=16.0.0'} + + '@ionic/utils-stream@3.1.6': + resolution: {integrity: sha512-4+Kitey1lTA1yGtnigeYNhV/0tggI3lWBMjC7tBs1K9GXa/q7q4CtOISppdh8QgtOhrhAXS2Igp8rbko/Cj+lA==} + engines: {node: '>=16.0.0'} + + '@ionic/utils-stream@3.1.7': + resolution: {integrity: sha512-eSELBE7NWNFIHTbTC2jiMvh1ABKGIpGdUIvARsNPMNQhxJB3wpwdiVnoBoTYp+5a6UUIww4Kpg7v6S7iTctH1w==} + engines: {node: '>=16.0.0'} + + '@ionic/utils-subprocess@2.1.14': + resolution: {integrity: sha512-nGYvyGVjU0kjPUcSRFr4ROTraT3w/7r502f5QJEsMRKTqa4eEzCshtwRk+/mpASm0kgBN5rrjYA5A/OZg8ahqg==} + engines: {node: '>=16.0.0'} + + '@ionic/utils-subprocess@3.0.1': + resolution: {integrity: sha512-cT4te3AQQPeIM9WCwIg8ohroJ8TjsYaMb2G4ZEgv9YzeDqHZ4JpeIKqG2SoaA3GmVQ3sOfhPM6Ox9sxphV/d1A==} + engines: {node: '>=16.0.0'} + + '@ionic/utils-terminal@2.3.4': + resolution: {integrity: sha512-cEiMFl3jklE0sW60r8JHH3ijFTwh/jkdEKWbylSyExQwZ8pPuwoXz7gpkWoJRLuoRHHSvg+wzNYyPJazIHfoJA==} + engines: {node: '>=16.0.0'} + + '@ionic/utils-terminal@2.3.5': + resolution: {integrity: sha512-3cKScz9Jx2/Pr9ijj1OzGlBDfcmx7OMVBt4+P1uRR0SSW4cm1/y3Mo4OY3lfkuaYifMNBW8Wz6lQHbs1bihr7A==} + engines: {node: '>=16.0.0'} + '@isaacs/cliui@9.0.0': resolution: {integrity: sha512-AokJm4tuBHillT+FpMtxQ60n8ObyXBatq7jD2/JA9dxbDDokKQm8KMht5ibGzLVU9IJDIKK4TPKgMHEYMn3lMg==} engines: {node: '>=18'} + '@isaacs/fs-minipass@4.0.1': + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} + engines: {node: '>=18.0.0'} + '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} @@ -785,11 +888,17 @@ packages: '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + '@jridgewell/trace-mapping@0.3.9': + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + '@playwright/test@1.60.0': resolution: {integrity: sha512-O71yZIbAh/PxDMNGns37GHBIfrVkEVyn+AXyIa5dOTfb4/xNvRWV+Vv/NMbNCtODB/pO7vLlF2OTmMVLhmr7Ag==} engines: {node: '>=18'} hasBin: true + '@prettier/plugin-xml@2.2.0': + resolution: {integrity: sha512-UWRmygBsyj4bVXvDiqSccwT1kmsorcwQwaIy30yVh8T+Gspx4OlC0shX1y+ZuwXZvgnafmpRYKks0bAu9urJew==} + '@rollup/plugin-babel@6.1.0': resolution: {integrity: sha512-dFZNuFD2YRcoomP4oYf+DvQNSUA9ih+A3vUqopQx5EdtPGo3WBnQcI/S8pwpz91UsGfL0HsMSOlaMld8HrbubA==} engines: {node: '>=14.0.0'} @@ -1000,10 +1109,28 @@ packages: '@swc/helpers@0.5.23': resolution: {integrity: sha512-5lSsMOTXURePglDfvuAQUqkGek9Hg2kksOYay2m0+XR++b2NWYL/4sWyuvVBIs8oKnJaxkdi9whaL/sqN13afw==} + '@trapezedev/gradle-parse@7.1.3': + resolution: {integrity: sha512-WQVF5pEJ5o/mUyvfGTG9nBKx9Te/ilKM3r2IT69GlbaooItT5ao7RyF1MUTBNjHLPk/xpGUY3c6PyVnjDlz0Vw==} + + '@trapezedev/project@7.1.4': + resolution: {integrity: sha512-b5rszBgT5XiRp/m4V2S2Ara2fdFXhPiduxhvCIVTSHq51PgLBjiTEStL6NbUz3V0K5bebF971O+SLRtyBxfCNA==} + '@trickfilm400/rollup-plugin-off-main-thread@3.0.0-pre1': resolution: {integrity: sha512-/67zpWDBLV+oYAEL682s1ktXL0HgqX76f6gaVGkGnVZlBbm1zd0v4Bz8MFF2GGhoX9rvfq3KSQHubFHwa6w6/Q==} engines: {node: '>=12'} + '@tsconfig/node10@1.0.12': + resolution: {integrity: sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==} + + '@tsconfig/node12@1.0.11': + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + + '@tsconfig/node14@1.0.3': + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + + '@tsconfig/node16@1.0.4': + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + '@types/chai@5.2.3': resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} @@ -1013,12 +1140,24 @@ packages: '@types/estree@1.0.9': resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + '@types/fs-extra@8.1.5': + resolution: {integrity: sha512-0dzKcwO+S8s2kuF5Z9oUWatQJj5Uq/iqphEtE3GQJVRRYm/tD1LglU2UnXi2A8jLq5umkGouOXOR9y0n613ZwQ==} + + '@types/minimist@1.2.5': + resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} + '@types/node@22.19.19': resolution: {integrity: sha512-dyh/xO2Fh5bYrfWaaqGrRQQGkNdmYw6AmaAUvYeUMNTWQtvb796ikLdmTchRmOlOiIJ1TDXfWgVx1QkUlQ6Hew==} + '@types/normalize-package-data@2.4.4': + resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + '@types/resolve@1.20.2': resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} + '@types/slice-ansi@4.0.0': + resolution: {integrity: sha512-+OpjSaq85gvlZAYINyzKpLeiFkSC4EsC6IIiT6v6TLSU5k5U83fHGj9Lel8oKEXM0HqgrMVCjXPDPVICtxF7EQ==} + '@types/trusted-types@2.0.7': resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} @@ -1059,14 +1198,47 @@ packages: '@vkontakte/vk-bridge@3.0.2': resolution: {integrity: sha512-MTp+nl0/jH4Sa2TXDyxNfy9VkhOhRQR1oQ4yhvthVDA4aWUa26npns7bRgfTuR3xDVGFiqW7zAwLnwcv3mL+dA==} + '@xml-tools/parser@1.0.11': + resolution: {integrity: sha512-aKqQ077XnR+oQtHJlrAflaZaL7qZsulWc/i/ZEooar5JiWj1eLt0+Wg28cpa+XLney107wXqneC+oG1IZvxkTA==} + + '@xmldom/xmldom@0.9.10': + resolution: {integrity: sha512-A9gOqLdi6cV4ibazAjcQufGj0B1y/vDqYrcuP6d/6x8P27gRS8643Dj9o1dEKtB6O7fwxb2FgBmJS2mX7gpvdw==} + engines: {node: '>=14.6'} + + JSONStream@1.3.5: + resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} + hasBin: true + + acorn-walk@8.3.5: + resolution: {integrity: sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==} + engines: {node: '>=0.4.0'} + acorn@8.16.0: resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} engines: {node: '>=0.4.0'} hasBin: true + add-stream@1.0.0: + resolution: {integrity: sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==} + ajv@8.20.0: resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + aria-query@5.3.1: resolution: {integrity: sha512-Z/ZeOgVl7bcSYZ/u/rh0fOpvEpq//LZmdbkXyc7syVzjPAhfOa9ebsdTSjEBDU4vs5nC98Kfduj1uFo0qyET3g==} engines: {node: '>= 0.4'} @@ -1075,14 +1247,25 @@ packages: resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} engines: {node: '>= 0.4'} + array-ify@1.0.0: + resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} + arraybuffer.prototype.slice@1.0.4: resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} engines: {node: '>= 0.4'} + arrify@1.0.1: + resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} + engines: {node: '>=0.10.0'} + assertion-error@2.0.1: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} + astral-regex@2.0.0: + resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} + engines: {node: '>=8'} + async-function@1.0.0: resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} engines: {node: '>= 0.4'} @@ -1102,6 +1285,14 @@ packages: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} engines: {node: '>= 0.4'} + b4a@1.8.1: + resolution: {integrity: sha512-aiqre1Nr0B/6DgE2N5vwTc+2/oQZ4Wh1t4NznYY4E00y8LCt6NqdRv81so00oo27D8MVKTpUa/MwUUtBLXCoDw==} + peerDependencies: + react-native-b4a: '*' + peerDependenciesMeta: + react-native-b4a: + optional: true + babel-plugin-polyfill-corejs2@0.4.17: resolution: {integrity: sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w==} peerDependencies: @@ -1124,11 +1315,75 @@ packages: resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} engines: {node: 18 || 20 || >=22} + bare-events@2.9.1: + resolution: {integrity: sha512-Z0oHEHAFDZkffN8Qc39zNZjQlMDkPJRyyyZieU1VH7u8c5S+qHZ2S8ixdKIAxEjfHO7FJxXmJWgteOghVanIsg==} + peerDependencies: + bare-abort-controller: '*' + peerDependenciesMeta: + bare-abort-controller: + optional: true + + bare-fs@4.7.4: + resolution: {integrity: sha512-y1kC+ffIx/tPLdTE693uNjHfzTfr+ravR5tvWlMXe25nELbkqV400S71qHDwbkAQ1FVEZobB1NFRzFbCCcyBCQ==} + engines: {bare: '>=1.16.0'} + peerDependencies: + bare-buffer: '*' + peerDependenciesMeta: + bare-buffer: + optional: true + + bare-path@3.1.1: + resolution: {integrity: sha512-JprUlveX3QjApC1cTpsUOiscADftCGVWkzitbHsRqv84hzYwYHw2mbluddsq5TvI8mH/8Ov1f4BiMAdcB0oYnQ==} + + bare-stream@2.13.3: + resolution: {integrity: sha512-Kc+brLqvEqGkjyfiwJmImAOqLZL7OsoLKuavx+hJjgVV3nLTOjloJyPMFxjUPerGGHrNH0fLU06jjykMLWrERQ==} + peerDependencies: + bare-abort-controller: '*' + bare-buffer: '*' + bare-events: '*' + peerDependenciesMeta: + bare-abort-controller: + optional: true + bare-buffer: + optional: true + bare-events: + optional: true + + bare-url@2.4.5: + resolution: {integrity: sha512-K+y9xF1tN+CdPu4qWwr0QiK1Al07eFPGYK5M2pDXcmHdMdgC/tT/bpmMe1hrmRHaidKLkXrC+cRNYf3XVDUhSQ==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + baseline-browser-mapping@2.10.42: resolution: {integrity: sha512-c/jurFrDLyui7o1J86yLkRu4LMsTYcBohveus7/I2Hzdn9KIP2bdJPTue/lR1KH46enoPbD77GKeSYNdyPoD3Q==} engines: {node: '>=6.0.0'} hasBin: true + big-integer@1.6.52: + resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} + engines: {node: '>=0.6'} + + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + bplist-creator@0.1.0: + resolution: {integrity: sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg==} + + bplist-parser@0.3.1: + resolution: {integrity: sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA==} + engines: {node: '>= 5.10.0'} + + bplist-parser@0.3.2: + resolution: {integrity: sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==} + engines: {node: '>= 5.10.0'} + + brace-expansion@1.1.16: + resolution: {integrity: sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==} + brace-expansion@2.1.1: resolution: {integrity: sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==} @@ -1141,9 +1396,15 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} @@ -1160,6 +1421,14 @@ packages: resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} engines: {node: '>= 0.4'} + camelcase-keys@6.2.2: + resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} + engines: {node: '>=8'} + + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + caniuse-lite@1.0.30001800: resolution: {integrity: sha512-MMHtuAz9Ys840zAY5F4k6fV5GaivZ9sPk+nz0mY+GYVzRBnYkN0mpqkSR92oWRQ19yQWo4HvBV/FnC16AJX8MA==} @@ -1167,25 +1436,161 @@ packages: resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} engines: {node: '>=18'} + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + check-error@2.1.3: resolution: {integrity: sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==} engines: {node: '>= 16'} + chevrotain@7.1.1: + resolution: {integrity: sha512-wy3mC1x4ye+O+QkEinVJkPf5u2vsrDIYW9G7ZuwFl6v/Yu0LwUuT2POsb+NUWApebyxfkQq6+yDfRExbnI5rcw==} + chokidar@4.0.3: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} + chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + + chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + + chownr@3.0.0: + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} + engines: {node: '>=18'} + + cliui@6.0.0: + resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + + cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + clsx@2.1.1: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + + color@4.2.3: + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} + + commander@12.1.0: + resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} + engines: {node: '>=18'} + commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + + commander@9.5.0: + resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} + engines: {node: ^12.20.0 || >=14} + common-tags@1.8.2: resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==} engines: {node: '>=4.0.0'} + compare-func@2.0.0: + resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + conventional-changelog-angular@5.0.13: + resolution: {integrity: sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==} + engines: {node: '>=10'} + + conventional-changelog-atom@2.0.8: + resolution: {integrity: sha512-xo6v46icsFTK3bb7dY/8m2qvc8sZemRgdqLb/bjpBsH2UyOS8rKNTgcb5025Hri6IpANPApbXMg15QLb1LJpBw==} + engines: {node: '>=10'} + deprecated: This preset is deprecated. Please use conventional-changelog-conventionalcommits or conventional-changelog-angular instead. + + conventional-changelog-codemirror@2.0.8: + resolution: {integrity: sha512-z5DAsn3uj1Vfp7po3gpt2Boc+Bdwmw2++ZHa5Ak9k0UKsYAO5mH1UBTN0qSCuJZREIhX6WU4E1p3IW2oRCNzQw==} + engines: {node: '>=10'} + deprecated: This preset is deprecated. Please use conventional-changelog-conventionalcommits or conventional-changelog-angular instead. + + conventional-changelog-conventionalcommits@4.6.3: + resolution: {integrity: sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==} + engines: {node: '>=10'} + + conventional-changelog-core@4.2.4: + resolution: {integrity: sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg==} + engines: {node: '>=10'} + deprecated: Deprecated and no longer maintained. Please use conventional-changelog instead. + + conventional-changelog-ember@2.0.9: + resolution: {integrity: sha512-ulzIReoZEvZCBDhcNYfDIsLTHzYHc7awh+eI44ZtV5cx6LVxLlVtEmcO+2/kGIHGtw+qVabJYjdI5cJOQgXh1A==} + engines: {node: '>=10'} + deprecated: This preset is deprecated. Please use conventional-changelog-conventionalcommits or conventional-changelog-angular instead. + + conventional-changelog-eslint@3.0.9: + resolution: {integrity: sha512-6NpUCMgU8qmWmyAMSZO5NrRd7rTgErjrm4VASam2u5jrZS0n38V7Y9CzTtLT2qwz5xEChDR4BduoWIr8TfwvXA==} + engines: {node: '>=10'} + deprecated: This preset is deprecated. Please use conventional-changelog-conventionalcommits or conventional-changelog-angular instead. + + conventional-changelog-express@2.0.6: + resolution: {integrity: sha512-SDez2f3iVJw6V563O3pRtNwXtQaSmEfTCaTBPCqn0oG0mfkq0rX4hHBq5P7De2MncoRixrALj3u3oQsNK+Q0pQ==} + engines: {node: '>=10'} + deprecated: This preset is deprecated. Please use conventional-changelog-conventionalcommits or conventional-changelog-angular instead. + + conventional-changelog-jquery@3.0.11: + resolution: {integrity: sha512-x8AWz5/Td55F7+o/9LQ6cQIPwrCjfJQ5Zmfqi8thwUEKHstEn4kTIofXub7plf1xvFA2TqhZlq7fy5OmV6BOMw==} + engines: {node: '>=10'} + deprecated: This preset is deprecated. Please use conventional-changelog-conventionalcommits or conventional-changelog-angular instead. + + conventional-changelog-jshint@2.0.9: + resolution: {integrity: sha512-wMLdaIzq6TNnMHMy31hql02OEQ8nCQfExw1SE0hYL5KvU+JCTuPaDO+7JiogGT2gJAxiUGATdtYYfh+nT+6riA==} + engines: {node: '>=10'} + deprecated: This preset is deprecated. Please use conventional-changelog-conventionalcommits or conventional-changelog-angular instead. + + conventional-changelog-preset-loader@2.3.4: + resolution: {integrity: sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==} + engines: {node: '>=10'} + + conventional-changelog-writer@5.0.1: + resolution: {integrity: sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==} + engines: {node: '>=10'} + hasBin: true + + conventional-changelog@3.1.25: + resolution: {integrity: sha512-ryhi3fd1mKf3fSjbLXOfK2D06YwKNic1nC9mWqybBHdObPd8KJ2vjaXZfYj1U23t+V8T8n0d7gwnc9XbIdFbyQ==} + engines: {node: '>=10'} + + conventional-commits-filter@2.0.7: + resolution: {integrity: sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==} + engines: {node: '>=10'} + + conventional-commits-parser@3.2.4: + resolution: {integrity: sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==} + engines: {node: '>=10'} + hasBin: true + convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} @@ -1195,6 +1600,12 @@ packages: core-js-compat@3.49.0: resolution: {integrity: sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA==} + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} @@ -1203,6 +1614,21 @@ packages: resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} engines: {node: '>=8'} + crypto-random-string@4.0.0: + resolution: {integrity: sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==} + engines: {node: '>=12'} + + css-select@4.3.0: + resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} + + css-what@6.2.2: + resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} + engines: {node: '>= 6'} + + dargs@7.0.0: + resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} + engines: {node: '>=8'} + data-view-buffer@1.0.2: resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} engines: {node: '>= 0.4'} @@ -1215,6 +1641,18 @@ packages: resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} engines: {node: '>= 0.4'} + dateformat@3.0.3: + resolution: {integrity: sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==} + + debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + debug@4.4.3: resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} @@ -1224,10 +1662,26 @@ packages: supports-color: optional: true + decamelize-keys@1.1.1: + resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} + engines: {node: '>=0.10.0'} + + decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + + decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + deep-eql@5.0.2: resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} + deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + deepmerge@4.3.1: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} @@ -1236,13 +1690,46 @@ packages: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} + define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + define-properties@1.2.1: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + devalue@5.8.1: resolution: {integrity: sha512-4CXDYRBGqN+57wVJkuXBYmpAVUSg3L6JAQa/DFqm238G73E1wuyc/JhGQJzN7vUf/CMphYau2zXbfWzDR5aTEw==} + diff@4.0.4: + resolution: {integrity: sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==} + engines: {node: '>=0.3.1'} + + diff@5.2.2: + resolution: {integrity: sha512-vtcDfH3TOjP8UekytvnHH1o1P4FcUdt4eQ1Y+Abap1tk/OB2MWQvcwS2ClCd1zuIhc3JKOx6p3kod8Vfys3E+A==} + engines: {node: '>=0.3.1'} + + dom-serializer@1.4.1: + resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@4.3.1: + resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} + engines: {node: '>= 4'} + + domutils@2.8.0: + resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} + + dot-prop@5.3.0: + resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} + engines: {node: '>=8'} + dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} @@ -1255,6 +1742,30 @@ packages: electron-to-chromium@1.5.387: resolution: {integrity: sha512-TaxwufTFDufvPEoXdhwVrA3UdFWBeWGkYoJ1K8ldF1xe6gKfth6iRNS5lTQ5JPNOHdGQm8PT1QYKUqFLCiUefQ==} + elementtree@0.1.7: + resolution: {integrity: sha512-wkgGT6kugeQk/P6VZ/f4T+4HB41BVgNBq5CDIZVbQ02nvTVqAiVTbskxxu3eA/X96lMlfYOwnLQpN2v5E1zDEg==} + engines: {node: '>= 0.4.0'} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + end-of-stream@1.4.5: + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} + + entities@2.2.0: + resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} + + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + env-paths@3.0.0: + resolution: {integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + error-ex@1.3.4: + resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} + es-abstract-get@1.0.0: resolution: {integrity: sha512-6PMWXpdhshVvFp+FoWYs1EvG1Nj0tvk0dZM+XcK0xMEM1czRVcP6ohqPWHy6qPagSpC8j4+p89WXlT+xXJs/fg==} engines: {node: '>= 0.4'} @@ -1295,6 +1806,10 @@ packages: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + esm-env@1.2.2: resolution: {integrity: sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==} @@ -1320,6 +1835,13 @@ packages: resolution: {integrity: sha512-lW6is4T1NFOYnmqGZIfvixqj7A7sSvScF+DN8EK6K58xI5MZ5UvYe0GjopxOXQtZvUn4eDdVuZ8XSoYWTMEKwA==} engines: {node: '>=20'} + events-universal@1.0.1: + resolution: {integrity: sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==} + + expand-template@2.0.3: + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + expect-type@1.3.0: resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} engines: {node: '>=12.0.0'} @@ -1327,12 +1849,18 @@ packages: fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + fast-fifo@1.3.2: + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} fast-uri@3.1.3: resolution: {integrity: sha512-i70LwGWUduXqzicKXWshooq+sWL1K3WUU5rKZNG/0i3a1OSoX3HqhH5WbWwTmqWfor4urUakGPiRQcleRZTwOg==} + fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} engines: {node: '>=12.0.0'} @@ -1345,6 +1873,14 @@ packages: filelist@1.0.6: resolution: {integrity: sha512-5giy2PkLYY1cP39p17Ech+2xlpTRL9HLspOfEgm0L6CwBXBTgsK5ou0JtzYuepxkaQ/tvhCFIJ5uXo0OrM2DxA==} + find-up@2.1.0: + resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} + engines: {node: '>=4'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + flatbuffers@25.9.23: resolution: {integrity: sha512-MI1qs7Lo4Syw0EOzUl0xjs2lsoeqFku44KpngfIduHBYvzm8h2+7K8YMQh1JtVVVrUvhLpNwqVi4DERegUJhPQ==} @@ -1356,10 +1892,28 @@ packages: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} + fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + + fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + + fs-extra@11.3.6: + resolution: {integrity: sha512-w8ZNZr2mKIc7qeNaQ9AVPT1+iFaI+Avd4xudVOvdDJ8VytREi1Ft5Ih7hd9jjehod8vAM5GMsfQ/TpPf4EyoEA==} + engines: {node: '>=14.14'} + fs-extra@9.1.0: resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} engines: {node: '>=10'} + fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + fsevents@2.3.2: resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -1388,6 +1942,10 @@ packages: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + get-intrinsic@1.3.0: resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} @@ -1395,6 +1953,11 @@ packages: get-own-enumerable-property-symbols@3.0.2: resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==} + get-pkg-repo@4.2.1: + resolution: {integrity: sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==} + engines: {node: '>=6.9.0'} + hasBin: true + get-proto@1.0.1: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} @@ -1403,12 +1966,43 @@ packages: resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} + git-raw-commits@2.0.11: + resolution: {integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==} + engines: {node: '>=10'} + deprecated: Deprecated and no longer maintained. Use @conventional-changelog/git-client instead. + hasBin: true + + git-remote-origin-url@2.0.0: + resolution: {integrity: sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==} + engines: {node: '>=4'} + + git-semver-tags@4.1.1: + resolution: {integrity: sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==} + engines: {node: '>=10'} + deprecated: Deprecated and no longer maintained. Use @conventional-changelog/git-client instead. + hasBin: true + + gitconfiglocal@1.0.0: + resolution: {integrity: sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==} + + github-from-package@0.0.0: + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + glob@11.1.0: resolution: {integrity: sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==} engines: {node: 20 || >=22} deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me hasBin: true + glob@13.0.6: + resolution: {integrity: sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==} + engines: {node: 18 || 20 || >=22} + + glob@9.3.5: + resolution: {integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==} + engines: {node: '>=16 || 14 >=14.17'} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + globalthis@1.0.4: resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} engines: {node: '>= 0.4'} @@ -1420,10 +2014,27 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + gradle-to-js@2.0.1: + resolution: {integrity: sha512-is3hDn9zb8XXnjbEeAEIqxTpLHUiGBqjegLmXPuyMBfKAggpadWFku4/AP8iYAGBX6qR9/5UIUIp47V0XI3aMw==} + hasBin: true + + handlebars@4.7.9: + resolution: {integrity: sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ==} + engines: {node: '>=0.4.7'} + hasBin: true + + hard-rejection@2.1.0: + resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} + engines: {node: '>=6'} + has-bigints@1.1.0: resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} engines: {node: '>= 0.4'} + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + has-property-descriptors@1.0.2: resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} @@ -1443,9 +2054,41 @@ packages: resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} engines: {node: '>= 0.4'} + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + + hosted-git-info@4.1.0: + resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} + engines: {node: '>=10'} + idb@7.1.1: resolution: {integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==} + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + ini@2.0.0: + resolution: {integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==} + engines: {node: '>=10'} + + ini@4.1.3: + resolution: {integrity: sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + internal-slot@1.1.0: resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} engines: {node: '>= 0.4'} @@ -1454,6 +2097,12 @@ packages: resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} engines: {node: '>= 0.4'} + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-arrayish@0.3.4: + resolution: {integrity: sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==} + is-async-function@2.1.1: resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} engines: {node: '>= 0.4'} @@ -1482,6 +2131,11 @@ packages: resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} engines: {node: '>= 0.4'} + is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + is-document.all@1.0.0: resolution: {integrity: sha512-+XSoyS05OdBbhFuELhgTCpFNHkpBOJqtsZfUFFpe5QTw+9Sjbh8zitxhQkYAo6wV7e1Vb8cAPvpCk9jGam/82g==} engines: {node: '>= 0.4'} @@ -1490,6 +2144,10 @@ packages: resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} engines: {node: '>= 0.4'} + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + is-generator-function@1.1.2: resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} engines: {node: '>= 0.4'} @@ -1513,6 +2171,14 @@ packages: resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==} engines: {node: '>=0.10.0'} + is-obj@2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} + + is-plain-obj@1.1.0: + resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} + engines: {node: '>=0.10.0'} + is-reference@3.0.3: resolution: {integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==} @@ -1536,6 +2202,10 @@ packages: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} + is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + is-string@1.1.1: resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} engines: {node: '>= 0.4'} @@ -1544,6 +2214,10 @@ packages: resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} engines: {node: '>= 0.4'} + is-text-path@1.0.1: + resolution: {integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==} + engines: {node: '>=0.10.0'} + is-typed-array@1.1.15: resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} engines: {node: '>= 0.4'} @@ -1560,6 +2234,13 @@ packages: resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} engines: {node: '>= 0.4'} + is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} @@ -1586,9 +2267,18 @@ packages: engines: {node: '>=6'} hasBin: true + json-parse-better-errors@1.0.2: + resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} @@ -1597,10 +2287,22 @@ packages: jsonfile@6.2.1: resolution: {integrity: sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==} + jsonparse@1.3.1: + resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} + engines: {'0': node >= 0.2.0} + jsonpointer@5.0.1: resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} engines: {node: '>=0.10.0'} + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + kleur@4.1.5: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} @@ -1609,18 +2311,45 @@ packages: resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} engines: {node: '>=6'} + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + load-json-file@4.0.0: + resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} + engines: {node: '>=4'} + locate-character@3.0.0: resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} + locate-path@2.0.0: + resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} + engines: {node: '>=4'} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + lodash.debounce@4.0.8: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + lodash.ismatch@4.4.0: + resolution: {integrity: sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + lodash.sortby@4.7.0: resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + lodash@4.18.1: + resolution: {integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==} + loupe@3.2.1: resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + lru-cache@11.5.1: resolution: {integrity: sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==} engines: {node: 20 || >=22} @@ -1628,9 +2357,24 @@ packages: lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + + map-obj@1.0.1: + resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} + engines: {node: '>=0.10.0'} + + map-obj@4.3.0: + resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} + engines: {node: '>=8'} + marked@18.0.5: resolution: {integrity: sha512-S6GcvALHg6K4ohtu4E7x0a1AqhAjp6cV8KhLSyN9qVapnzJkusVBxZRcIU9AeYsbe6P1hKDusSbEOzGyyuce6w==} engines: {node: '>= 20'} @@ -1640,22 +2384,83 @@ packages: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} + meow@8.1.2: + resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} + engines: {node: '>=10'} + + mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + + min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + minimatch@10.2.5: resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} engines: {node: 18 || 20 || >=22} + minimatch@3.0.5: + resolution: {integrity: sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==} + minimatch@5.1.9: resolution: {integrity: sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==} engines: {node: '>=10'} + minimatch@8.0.7: + resolution: {integrity: sha512-V+1uQNdzybxa14e/p00HZnQNNcTjnRJjDxg2V8wtkjFctq4M7hXFws4oekyTP0Jebeq7QYtpFyOeBAjc88zvYg==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist-options@4.1.0: + resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} + engines: {node: '>= 6'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + + minipass@4.2.8: + resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==} + engines: {node: '>=8'} + + minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + minipass@7.1.3: resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} engines: {node: '>=16 || 14 >=14.17'} + minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + + minizlib@3.1.0: + resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} + engines: {node: '>= 18'} + + mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + + modify-values@1.0.1: + resolution: {integrity: sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==} + engines: {node: '>=0.10.0'} + mri@1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -1664,10 +2469,50 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + napi-build-utils@2.0.0: + resolution: {integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==} + + native-run@2.0.3: + resolution: {integrity: sha512-U1PllBuzW5d1gfan+88L+Hky2eZx+9gv3Pf6rNBxKbORxi7boHzqiA6QFGSnqMem4j0A9tZ08NMIs5+0m/VS1Q==} + engines: {node: '>=16.0.0'} + hasBin: true + + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + node-abi@3.94.0: + resolution: {integrity: sha512-W5ZNO5KRPB5TkYmGVD9F6YqhsglXJzE6etpbmT+f6EQElhiX/UTG551cnsRGvLG3fyZEg9HwaDmNmj5nwJ4z9g==} + engines: {node: '>=10'} + + node-addon-api@6.1.0: + resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-html-parser@5.4.2: + resolution: {integrity: sha512-RaBPP3+51hPne/OolXxcz89iYvQvKOydaqoePpOgXcrOKZhjVIzmpKZz+Hd/RBO2/zN2q6CNJhQzucVz+u3Jyw==} + node-releases@2.0.50: resolution: {integrity: sha512-J6l92tKHX6w8Jy5nO1Vuc01NoIiRGi/d6qBKVxh+IQ8Cr3b6HbVNfKiF8ZpFKufTwpwxMmce2W3iQZ861ZRyTg==} engines: {node: '>=18'} + normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + + normalize-package-data@3.0.3: + resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} + engines: {node: '>=10'} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + object-inspect@1.13.4: resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} engines: {node: '>= 0.4'} @@ -1680,13 +2525,60 @@ packages: resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} engines: {node: '>= 0.4'} + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + own-keys@1.0.1: resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} engines: {node: '>= 0.4'} + p-limit@1.3.0: + resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} + engines: {node: '>=4'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-locate@2.0.0: + resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} + engines: {node: '>=4'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-try@1.0.0: + resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} + engines: {node: '>=4'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + parse-json@4.0.0: + resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} + engines: {node: '>=4'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + path-exists@3.0.0: + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: '>=4'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} @@ -1694,10 +2586,18 @@ packages: path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + path-scurry@2.0.2: resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==} engines: {node: 18 || 20 || >=22} + path-type@3.0.0: + resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} + engines: {node: '>=4'} + pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} @@ -1705,6 +2605,9 @@ packages: resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} engines: {node: '>= 14.16'} + pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -1712,6 +2615,14 @@ packages: resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} engines: {node: '>=12'} + pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + + pify@3.0.0: + resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} + engines: {node: '>=4'} + playwright-core@1.60.0: resolution: {integrity: sha512-9bW6zvX/m0lEbgTKJ6YppOKx8H3VOPBMOCFh2irXFOT4BbHgrx5hPjwJYLT40Lu+4qtD36qKc/Hn56StUW57IA==} engines: {node: '>=18'} @@ -1722,6 +2633,10 @@ packages: engines: {node: '>=18'} hasBin: true + plist@3.1.1: + resolution: {integrity: sha512-ZIfcLJC+7E7FBFnDxm9MPmt7D+DidyQ26lewieO75AdhA2ayMtsJSES0iWzqJQbcVRSrTufQoy0DR94xHue0oA==} + engines: {node: '>=10.4.0'} + possible-typed-array-names@1.1.0: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} @@ -1730,6 +2645,17 @@ packages: resolution: {integrity: sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==} engines: {node: ^10 || ^12 || >=14} + prebuild-install@7.1.3: + resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==} + engines: {node: '>=10'} + deprecated: No longer maintained. Please contact the author of the relevant native addon; alternatives are available. + hasBin: true + + prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + pretty-bytes@5.6.0: resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==} engines: {node: '>=6'} @@ -1738,14 +2664,67 @@ packages: resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==} engines: {node: ^14.13.1 || >=16.0.0} + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + + pump@3.0.4: + resolution: {integrity: sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==} + punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} + q@1.5.1: + resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==} + engines: {node: '>=0.6.0', teleport: '>=0.2.0'} + deprecated: |- + You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other. + + (For a CapTP with native promises, see @endo/eventual-send and @endo/captp) + + quick-lru@4.0.1: + resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} + engines: {node: '>=8'} + + rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + + read-pkg-up@3.0.0: + resolution: {integrity: sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==} + engines: {node: '>=4'} + + read-pkg-up@7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} + + read-pkg@3.0.0: + resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} + engines: {node: '>=4'} + + read-pkg@5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + readdirp@4.1.2: resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} engines: {node: '>= 14.18.0'} + redent@3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} + reflect.getprototypeof@1.0.10: resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'} @@ -1757,6 +2736,9 @@ packages: regenerate@1.4.2: resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + regexp-to-ast@0.5.0: + resolution: {integrity: sha512-tlbJqcMHnPKI9zSrystikWKwHkBqu2a/Sgw01h3zFjvYrMxEDYHzzoMZnUrbIfpTFEsoRnnviOXNCzFiSc54Qw==} + regexp.prototype.flags@1.5.4: resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} engines: {node: '>= 0.4'} @@ -1772,15 +2754,37 @@ packages: resolution: {integrity: sha512-NgRBy2Nx/bE+9F27nVHnqcN5HjyLmecqsqx2PJHu3/IEtADD4WuxuXIVExD5PoSDFVrl78dOonfcOe5O+5nbzQ==} hasBin: true + replace@1.2.2: + resolution: {integrity: sha512-C4EDifm22XZM2b2JOYe6Mhn+lBsLBAvLbK8drfUQLTfD1KYl/n3VaW/CDju0Ny4w3xTtegBpg8YNSpFJPUDSjA==} + engines: {node: '>= 6'} + hasBin: true + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + require-from-string@2.0.2: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} + require-main-filename@2.0.0: + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + resolve@1.22.12: resolution: {integrity: sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==} engines: {node: '>= 0.4'} hasBin: true + rimraf@4.4.1: + resolution: {integrity: sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==} + engines: {node: '>=14'} + hasBin: true + + rimraf@6.1.3: + resolution: {integrity: sha512-LKg+Cr2ZF61fkcaK1UdkH2yEBBKnYjTyWzTJT6KNPcSPaiT7HSdhtMXQuN5wkTX0Xu72KQ1l8S42rlmexS2hSA==} + engines: {node: 20 || >=22} + hasBin: true + rollup@4.61.0: resolution: {integrity: sha512-T9mWdbWfQtp0B5lv/HX+wrhYsmXRlcWnXXmJbXqKJhlRaoS6KMhq0gpyzW4UJfclcxrEdLnTgjT2NjruLONu0g==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -1794,6 +2798,12 @@ packages: resolution: {integrity: sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==} engines: {node: '>=0.4'} + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + safe-push-apply@1.0.0: resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} engines: {node: '>= 0.4'} @@ -1802,14 +2812,33 @@ packages: resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} engines: {node: '>= 0.4'} + sax@1.1.4: + resolution: {integrity: sha512-5f3k2PbGGp+YtKJjOItpg3P99IMD84E4HOvcfleTb5joCHNXYLsR9yWFPOYGgaeMPDubQILTCMdsFb2OMeOjtg==} + + sax@1.6.0: + resolution: {integrity: sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==} + engines: {node: '>=11.0.0'} + + semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true + semver@7.8.5: + resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} + engines: {node: '>=10'} + hasBin: true + serialize-javascript@7.0.7: resolution: {integrity: sha512-YAy8Od6KV+uuwUuU50np8fGB/Aues6Y0nAhA9y/hId74PlKUcme4pXcBD46NWKr1Q4osN/iseZ17YqO1XfmI8g==} engines: {node: '>=20.0.0'} + set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} @@ -1822,6 +2851,10 @@ packages: resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} engines: {node: '>= 0.4'} + sharp@0.32.6: + resolution: {integrity: sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==} + engines: {node: '>=14.15.0'} + shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -1849,10 +2882,32 @@ packages: siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + signal-exit@4.1.0: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + + simple-get@4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + + simple-plist@1.3.1: + resolution: {integrity: sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw==} + + simple-swizzle@0.2.4: + resolution: {integrity: sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==} + + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + slice-ansi@4.0.0: + resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} + engines: {node: '>=10'} + smob@1.6.2: resolution: {integrity: sha512-RQsvleCbF8cVHEv+xuDGaA4pOizFqJ0GgjtMSRo6oP8pnN7WsigHgVGey6aILRBKv4W2YOMHLqbKdnB6hpB9fw==} engines: {node: '>=20.0.0'} @@ -1873,6 +2928,28 @@ packages: engines: {node: '>= 8'} deprecated: The work that was done in this beta branch won't be included in future versions + spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + + spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + + spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + + spdx-license-ids@3.0.23: + resolution: {integrity: sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==} + + split2@3.2.2: + resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} + + split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + + split@1.0.1: + resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==} + stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} @@ -1883,6 +2960,17 @@ packages: resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} engines: {node: '>= 0.4'} + stream-buffers@2.2.0: + resolution: {integrity: sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==} + engines: {node: '>= 0.10.0'} + + streamx@2.28.0: + resolution: {integrity: sha512-1Yowhzjf0ivGMrTIkY9hav5TxobO9qIVqUE41fiCGMGgc3CLlf4MY+9AHmZqBWgDTue0fY9zWjYFVyf6Diuobw==} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + string.prototype.matchall@4.0.12: resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} engines: {node: '>= 0.4'} @@ -1899,17 +2987,43 @@ packages: resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} engines: {node: '>= 0.4'} + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + stringify-object@3.3.0: resolution: {integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==} engines: {node: '>=4'} + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + strip-comments@2.0.1: resolution: {integrity: sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==} engines: {node: '>=10'} + strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + + strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + strip-literal@3.1.0: resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==} + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} @@ -1926,19 +3040,68 @@ packages: resolution: {integrity: sha512-kTXr26t1bchFp28ROrb957LtbujpBmBDibmqMGziVpUs7awBi96TGgX6SovrA8BNoEUDVRK2Fb9FkeYlGspoVg==} engines: {node: '>=18'} + tar-fs@2.1.5: + resolution: {integrity: sha512-OboTd8mmMhZDNPV+UjQcK9yKAatXu2aJ+r1w4im1Otd4M4fl2hwvdoXUxIYHFTHWK/3y3FarBP70v3vwmGlOxw==} + + tar-fs@3.1.3: + resolution: {integrity: sha512-/hU4AXnIdZu+Gvl1pk0oI5f5HxWsCJRtY2aFaJdk9VvyL48DWU6iU5WAIPG+wIi1YvWA6eTJvIviP/tMAZZNwQ==} + + tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + + tar-stream@3.2.0: + resolution: {integrity: sha512-ojzvCvVaNp6aOTFmG7jaRD0meowIAuPc3cMMhSgKiVWws1GyHbGd/xvnyuRKcKlMpt3qvxx6r0hreCNITP9hIg==} + + tar@6.2.1: + resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} + engines: {node: '>=10'} + deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + + tar@7.5.19: + resolution: {integrity: sha512-4LeEWl96twnS2Q7Bz4MGqgazLqO+hJN63GZxXoIqh1T3VweYD997gbU1ItNsQafqqXTXd5WFyFdReLtwvRBNiw==} + engines: {node: '>=18'} + + teex@1.0.1: + resolution: {integrity: sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==} + temp-dir@2.0.0: resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} engines: {node: '>=8'} + temp-dir@3.0.0: + resolution: {integrity: sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==} + engines: {node: '>=14.16'} + tempy@0.6.0: resolution: {integrity: sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==} engines: {node: '>=10'} + tempy@3.2.0: + resolution: {integrity: sha512-d79HhZya5Djd7am0q+W4RTsSU+D/aJzM+4Y4AGJGuGlgM2L6sx5ZvOYTmZjqPhrDrV6xJTtRSm1JCLj6V6LHLQ==} + engines: {node: '>=14.16'} + terser@5.48.0: resolution: {integrity: sha512-J/9An6vs9Us6wKRriSFXBWdRZapREHqFzdNUKk0pmu804EMR6dr6winwo7e5JDxN4xahxQsuysyYFwlwj4XN/Q==} engines: {node: '>=10'} hasBin: true + text-decoder@1.2.7: + resolution: {integrity: sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==} + + text-extensions@1.9.0: + resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==} + engines: {node: '>=0.10'} + + through2@2.0.5: + resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + + through2@4.0.2: + resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} + + through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} @@ -1961,16 +3124,71 @@ packages: resolution: {integrity: sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==} engines: {node: '>=14.0.0'} + tmp@0.2.7: + resolution: {integrity: sha512-e0votIpp4Uo2AJYSzVHV6xCcawuiez3DzqDAbrTc3YxBkplN6e+dM13ZeIcZnDg/QpSuU2zfZ3rzwY8ukEnaXw==} + engines: {node: '>=14.14'} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + tr46@1.0.1: resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + + trim-newlines@3.0.1: + resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} + engines: {node: '>=8'} + + ts-node@10.9.2: + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + + tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + type-fest@0.16.0: resolution: {integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==} engines: {node: '>=10'} + type-fest@0.18.1: + resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} + engines: {node: '>=10'} + + type-fest@0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + + type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + + type-fest@1.4.0: + resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} + engines: {node: '>=10'} + + type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + typed-array-buffer@1.0.3: resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} engines: {node: '>= 0.4'} @@ -1997,6 +3215,11 @@ packages: engines: {node: '>=14.17'} hasBin: true + uglify-js@3.19.3: + resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} + engines: {node: '>=0.8.0'} + hasBin: true + unbox-primitive@1.1.0: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} @@ -2024,10 +3247,18 @@ packages: resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} engines: {node: '>=8'} + unique-string@3.0.0: + resolution: {integrity: sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==} + engines: {node: '>=12'} + universalify@2.0.1: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} + untildify@4.0.0: + resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} + engines: {node: '>=8'} + upath@1.2.0: resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==} engines: {node: '>=4'} @@ -2038,6 +3269,20 @@ packages: peerDependencies: browserslist: '>= 4.21.0' + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + uuid@7.0.3: + resolution: {integrity: sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==} + deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). + hasBin: true + + v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + + validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + vite-node@3.2.4: resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} @@ -2131,9 +3376,15 @@ packages: jsdom: optional: true + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + webidl-conversions@4.0.2: resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + whatwg-url@7.1.0: resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} @@ -2149,6 +3400,9 @@ packages: resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} engines: {node: '>= 0.4'} + which-module@2.0.1: + resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} + which-typed-array@1.1.22: resolution: {integrity: sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==} engines: {node: '>= 0.4'} @@ -2163,6 +3417,9 @@ packages: engines: {node: '>=8'} hasBin: true + wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + workbox-background-sync@7.4.1: resolution: {integrity: sha512-HhT7KE8tOWDm02wRNshXUnUPofMlhenF2DBdUnDPOubhizzPeItkYTmAB6td1Z2cjYPa98vzEiPLEuzn5hN66g==} @@ -2212,9 +3469,97 @@ packages: workbox-window@7.4.1: resolution: {integrity: sha512-notZDH2u8VXaqyuD7xaqIfEFi6SRM4SUSd7ewe9PDsVqADuepxX2ZMY3uvuZGxzY5ZOsGC/vD3A/3smFtJt4/A==} + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + xcode@3.0.1: + resolution: {integrity: sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA==} + engines: {node: '>=10.0.0'} + + xml-js@1.6.11: + resolution: {integrity: sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==} + hasBin: true + + xml2js@0.5.0: + resolution: {integrity: sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==} + engines: {node: '>=4.0.0'} + + xml2js@0.6.2: + resolution: {integrity: sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==} + engines: {node: '>=4.0.0'} + + xmlbuilder@11.0.1: + resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} + engines: {node: '>=4.0'} + + xmlbuilder@15.1.1: + resolution: {integrity: sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==} + engines: {node: '>=8.0'} + + xpath@0.0.32: + resolution: {integrity: sha512-rxMJhSIoiO8vXcWvSifKqhvV96GjiD5wYb8/QHdoRyQvraTpp4IEv944nhGausZZ3u7dhQXteZuZbaqfpB7uYw==} + engines: {node: '>=0.6.0'} + + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + + y18n@4.0.3: + resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yallist@5.0.0: + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} + engines: {node: '>=18'} + + yargs-parser@18.1.3: + resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} + engines: {node: '>=6'} + + yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@15.4.1: + resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} + engines: {node: '>=8'} + + yargs@16.2.2: + resolution: {integrity: sha512-Nt9ZJjXTv5R8MHbqby/wXQ6Gi0Bb3TcYZkR1bzuL4yB2OxWPkXknz513gEF0GoA6tn00UpbPvERW8rzCuWCA6w==} + engines: {node: '>=10'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + + yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + zimmerframe@1.1.4: resolution: {integrity: sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==} @@ -2907,6 +4252,87 @@ snapshots: transitivePeerDependencies: - supports-color + '@capacitor/android@8.4.1(@capacitor/core@8.4.1)': + dependencies: + '@capacitor/core': 8.4.1 + + '@capacitor/app@8.1.0(@capacitor/core@8.4.1)': + dependencies: + '@capacitor/core': 8.4.1 + + '@capacitor/assets@3.0.5(@types/node@22.19.19)(typescript@5.9.3)': + dependencies: + '@capacitor/cli': 5.7.8 + '@ionic/utils-array': 2.1.6 + '@ionic/utils-fs': 3.1.7 + '@trapezedev/project': 7.1.4(@types/node@22.19.19)(typescript@5.9.3) + commander: 8.3.0 + debug: 4.3.4 + fs-extra: 10.1.0 + node-fetch: 2.7.0 + node-html-parser: 5.4.2 + sharp: 0.32.6 + tslib: 2.6.2 + yargs: 17.7.2 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - bare-abort-controller + - bare-buffer + - encoding + - react-native-b4a + - supports-color + - typescript + + '@capacitor/cli@5.7.8': + dependencies: + '@ionic/cli-framework-output': 2.2.8 + '@ionic/utils-fs': 3.1.7 + '@ionic/utils-subprocess': 2.1.14 + '@ionic/utils-terminal': 2.3.5 + commander: 9.5.0 + debug: 4.4.3 + env-paths: 2.2.1 + kleur: 4.1.5 + native-run: 2.0.3 + open: 8.4.2 + plist: 3.1.1 + prompts: 2.4.2 + rimraf: 4.4.1 + semver: 7.8.5 + tar: 6.2.1 + tslib: 2.8.1 + xml2js: 0.5.0 + transitivePeerDependencies: + - supports-color + + '@capacitor/cli@8.4.1': + dependencies: + '@ionic/cli-framework-output': 2.2.8 + '@ionic/utils-subprocess': 3.0.1 + '@ionic/utils-terminal': 2.3.5 + commander: 12.1.0 + debug: 4.4.3 + env-paths: 2.2.1 + fs-extra: 11.3.6 + kleur: 4.1.5 + native-run: 2.0.3 + open: 8.4.2 + plist: 3.1.1 + prompts: 2.4.2 + rimraf: 6.1.3 + semver: 7.8.5 + tar: 7.5.19 + tslib: 2.8.1 + xml2js: 0.6.2 + transitivePeerDependencies: + - supports-color + + '@capacitor/core@8.4.1': + dependencies: + tslib: 2.8.1 + '@connectrpc/connect-web@2.1.1(@bufbuild/protobuf@2.12.0)(@connectrpc/connect@2.1.1(@bufbuild/protobuf@2.12.0))': dependencies: '@bufbuild/protobuf': 2.12.0 @@ -2916,6 +4342,10 @@ snapshots: dependencies: '@bufbuild/protobuf': 2.12.0 + '@cspotcode/source-map-support@0.8.1': + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + '@esbuild/aix-ppc64@0.25.12': optional: true @@ -2994,8 +4424,135 @@ snapshots: '@esbuild/win32-x64@0.25.12': optional: true + '@hutson/parse-repository-url@3.0.2': {} + + '@ionic/cli-framework-output@2.2.8': + dependencies: + '@ionic/utils-terminal': 2.3.5 + debug: 4.4.3 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + + '@ionic/utils-array@2.1.6': + dependencies: + debug: 4.4.3 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + + '@ionic/utils-fs@3.1.7': + dependencies: + '@types/fs-extra': 8.1.5 + debug: 4.4.3 + fs-extra: 9.1.0 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + + '@ionic/utils-object@2.1.6': + dependencies: + debug: 4.4.3 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + + '@ionic/utils-process@2.1.11': + dependencies: + '@ionic/utils-object': 2.1.6 + '@ionic/utils-terminal': 2.3.4 + debug: 4.4.3 + signal-exit: 3.0.7 + tree-kill: 1.2.2 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + + '@ionic/utils-process@2.1.12': + dependencies: + '@ionic/utils-object': 2.1.6 + '@ionic/utils-terminal': 2.3.5 + debug: 4.4.3 + signal-exit: 3.0.7 + tree-kill: 1.2.2 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + + '@ionic/utils-stream@3.1.6': + dependencies: + debug: 4.4.3 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + + '@ionic/utils-stream@3.1.7': + dependencies: + debug: 4.4.3 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + + '@ionic/utils-subprocess@2.1.14': + dependencies: + '@ionic/utils-array': 2.1.6 + '@ionic/utils-fs': 3.1.7 + '@ionic/utils-process': 2.1.11 + '@ionic/utils-stream': 3.1.6 + '@ionic/utils-terminal': 2.3.4 + cross-spawn: 7.0.6 + debug: 4.4.3 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + + '@ionic/utils-subprocess@3.0.1': + dependencies: + '@ionic/utils-array': 2.1.6 + '@ionic/utils-fs': 3.1.7 + '@ionic/utils-process': 2.1.12 + '@ionic/utils-stream': 3.1.7 + '@ionic/utils-terminal': 2.3.5 + cross-spawn: 7.0.6 + debug: 4.4.3 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + + '@ionic/utils-terminal@2.3.4': + dependencies: + '@types/slice-ansi': 4.0.0 + debug: 4.4.3 + signal-exit: 3.0.7 + slice-ansi: 4.0.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + tslib: 2.8.1 + untildify: 4.0.0 + wrap-ansi: 7.0.0 + transitivePeerDependencies: + - supports-color + + '@ionic/utils-terminal@2.3.5': + dependencies: + '@types/slice-ansi': 4.0.0 + debug: 4.4.3 + signal-exit: 3.0.7 + slice-ansi: 4.0.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + tslib: 2.8.1 + untildify: 4.0.0 + wrap-ansi: 7.0.0 + transitivePeerDependencies: + - supports-color + '@isaacs/cliui@9.0.0': {} + '@isaacs/fs-minipass@4.0.1': + dependencies: + minipass: 7.1.3 + '@jridgewell/gen-mapping@0.3.13': dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -3020,10 +4577,20 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping@0.3.9': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + '@playwright/test@1.60.0': dependencies: playwright: 1.60.0 + '@prettier/plugin-xml@2.2.0': + dependencies: + '@xml-tools/parser': 1.0.11 + prettier: 2.8.8 + '@rollup/plugin-babel@6.1.0(@babel/core@7.29.7)(rollup@4.61.0)': dependencies: '@babel/core': 7.29.7 @@ -3172,6 +4739,41 @@ snapshots: dependencies: tslib: 2.8.1 + '@trapezedev/gradle-parse@7.1.3': {} + + '@trapezedev/project@7.1.4(@types/node@22.19.19)(typescript@5.9.3)': + dependencies: + '@ionic/utils-fs': 3.1.7 + '@ionic/utils-subprocess': 2.1.14 + '@prettier/plugin-xml': 2.2.0 + '@trapezedev/gradle-parse': 7.1.3 + '@xmldom/xmldom': 0.9.10 + conventional-changelog: 3.1.25 + cross-spawn: 7.0.6 + diff: 5.2.2 + env-paths: 3.0.0 + gradle-to-js: 2.0.1 + ini: 2.0.0 + kleur: 4.1.5 + lodash: 4.18.1 + plist: 3.1.1 + prettier: 2.8.8 + prompts: 2.4.2 + replace: 1.2.2 + tempy: 3.2.0 + tmp: 0.2.7 + ts-node: 10.9.2(@types/node@22.19.19)(typescript@5.9.3) + xcode: 3.0.1 + xml-js: 1.6.11 + xpath: 0.0.32 + yargs: 17.7.2 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - supports-color + - typescript + '@trickfilm400/rollup-plugin-off-main-thread@3.0.0-pre1': dependencies: ejs: 3.1.10 @@ -3179,6 +4781,14 @@ snapshots: magic-string: 0.30.21 string.prototype.matchall: 4.0.12 + '@tsconfig/node10@1.0.12': {} + + '@tsconfig/node12@1.0.11': {} + + '@tsconfig/node14@1.0.3': {} + + '@tsconfig/node16@1.0.4': {} + '@types/chai@5.2.3': dependencies: '@types/deep-eql': 4.0.2 @@ -3188,12 +4798,22 @@ snapshots: '@types/estree@1.0.9': {} + '@types/fs-extra@8.1.5': + dependencies: + '@types/node': 22.19.19 + + '@types/minimist@1.2.5': {} + '@types/node@22.19.19': dependencies: undici-types: 6.21.0 + '@types/normalize-package-data@2.4.4': {} + '@types/resolve@1.20.2': {} + '@types/slice-ansi@4.0.0': {} + '@types/trusted-types@2.0.7': {} '@typescript/vfs@1.6.4(typescript@5.4.5)': @@ -3249,8 +4869,25 @@ snapshots: dependencies: '@swc/helpers': 0.5.23 + '@xml-tools/parser@1.0.11': + dependencies: + chevrotain: 7.1.1 + + '@xmldom/xmldom@0.9.10': {} + + JSONStream@1.3.5: + dependencies: + jsonparse: 1.3.1 + through: 2.3.8 + + acorn-walk@8.3.5: + dependencies: + acorn: 8.16.0 + acorn@8.16.0: {} + add-stream@1.0.0: {} + ajv@8.20.0: dependencies: fast-deep-equal: 3.1.3 @@ -3258,6 +4895,18 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 + ansi-regex@5.0.1: {} + + ansi-styles@3.2.1: + dependencies: + color-convert: 1.9.3 + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + arg@4.1.3: {} + aria-query@5.3.1: {} array-buffer-byte-length@1.0.2: @@ -3265,6 +4914,8 @@ snapshots: call-bound: 1.0.4 is-array-buffer: 3.0.5 + array-ify@1.0.0: {} + arraybuffer.prototype.slice@1.0.4: dependencies: array-buffer-byte-length: 1.0.2 @@ -3275,8 +4926,12 @@ snapshots: get-intrinsic: 1.3.0 is-array-buffer: 3.0.5 + arrify@1.0.1: {} + assertion-error@2.0.1: {} + astral-regex@2.0.0: {} + async-function@1.0.0: {} async@3.2.6: {} @@ -3289,6 +4944,8 @@ snapshots: axobject-query@4.1.0: {} + b4a@1.8.1: {} + babel-plugin-polyfill-corejs2@0.4.17(@babel/core@7.29.7): dependencies: '@babel/compat-data': 7.29.7 @@ -3317,8 +4974,66 @@ snapshots: balanced-match@4.0.4: {} + bare-events@2.9.1: {} + + bare-fs@4.7.4: + dependencies: + bare-events: 2.9.1 + bare-path: 3.1.1 + bare-stream: 2.13.3(bare-events@2.9.1) + bare-url: 2.4.5 + fast-fifo: 1.3.2 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + + bare-path@3.1.1: {} + + bare-stream@2.13.3(bare-events@2.9.1): + dependencies: + b4a: 1.8.1 + streamx: 2.28.0 + teex: 1.0.1 + optionalDependencies: + bare-events: 2.9.1 + transitivePeerDependencies: + - react-native-b4a + + bare-url@2.4.5: + dependencies: + bare-path: 3.1.1 + + base64-js@1.5.1: {} + baseline-browser-mapping@2.10.42: {} + big-integer@1.6.52: {} + + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + + boolbase@1.0.0: {} + + bplist-creator@0.1.0: + dependencies: + stream-buffers: 2.2.0 + + bplist-parser@0.3.1: + dependencies: + big-integer: 1.6.52 + + bplist-parser@0.3.2: + dependencies: + big-integer: 1.6.52 + + brace-expansion@1.1.16: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + brace-expansion@2.1.1: dependencies: balanced-match: 1.0.2 @@ -3335,8 +5050,15 @@ snapshots: node-releases: 2.0.50 update-browserslist-db: 1.2.3(browserslist@4.28.4) + buffer-crc32@0.2.13: {} + buffer-from@1.1.2: {} + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + cac@6.7.14: {} call-bind-apply-helpers@1.0.2: @@ -3356,6 +5078,14 @@ snapshots: call-bind-apply-helpers: 1.0.2 get-intrinsic: 1.3.0 + camelcase-keys@6.2.2: + dependencies: + camelcase: 5.3.1 + map-obj: 4.3.0 + quick-lru: 4.0.1 + + camelcase@5.3.1: {} + caniuse-lite@1.0.30001800: {} chai@5.3.3: @@ -3366,18 +5096,186 @@ snapshots: loupe: 3.2.1 pathval: 2.0.1 + chalk@2.4.2: + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + check-error@2.1.3: {} + chevrotain@7.1.1: + dependencies: + regexp-to-ast: 0.5.0 + chokidar@4.0.3: dependencies: readdirp: 4.1.2 + chownr@1.1.4: {} + + chownr@2.0.0: {} + + chownr@3.0.0: {} + + cliui@6.0.0: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + + cliui@7.0.4: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + clsx@2.1.1: {} + color-convert@1.9.3: + dependencies: + color-name: 1.1.3 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.3: {} + + color-name@1.1.4: {} + + color-string@1.9.1: + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.4 + + color@4.2.3: + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + + commander@12.1.0: {} + commander@2.20.3: {} + commander@8.3.0: {} + + commander@9.5.0: {} + common-tags@1.8.2: {} + compare-func@2.0.0: + dependencies: + array-ify: 1.0.0 + dot-prop: 5.3.0 + + concat-map@0.0.1: {} + + conventional-changelog-angular@5.0.13: + dependencies: + compare-func: 2.0.0 + q: 1.5.1 + + conventional-changelog-atom@2.0.8: + dependencies: + q: 1.5.1 + + conventional-changelog-codemirror@2.0.8: + dependencies: + q: 1.5.1 + + conventional-changelog-conventionalcommits@4.6.3: + dependencies: + compare-func: 2.0.0 + lodash: 4.18.1 + q: 1.5.1 + + conventional-changelog-core@4.2.4: + dependencies: + add-stream: 1.0.0 + conventional-changelog-writer: 5.0.1 + conventional-commits-parser: 3.2.4 + dateformat: 3.0.3 + get-pkg-repo: 4.2.1 + git-raw-commits: 2.0.11 + git-remote-origin-url: 2.0.0 + git-semver-tags: 4.1.1 + lodash: 4.18.1 + normalize-package-data: 3.0.3 + q: 1.5.1 + read-pkg: 3.0.0 + read-pkg-up: 3.0.0 + through2: 4.0.2 + + conventional-changelog-ember@2.0.9: + dependencies: + q: 1.5.1 + + conventional-changelog-eslint@3.0.9: + dependencies: + q: 1.5.1 + + conventional-changelog-express@2.0.6: + dependencies: + q: 1.5.1 + + conventional-changelog-jquery@3.0.11: + dependencies: + q: 1.5.1 + + conventional-changelog-jshint@2.0.9: + dependencies: + compare-func: 2.0.0 + q: 1.5.1 + + conventional-changelog-preset-loader@2.3.4: {} + + conventional-changelog-writer@5.0.1: + dependencies: + conventional-commits-filter: 2.0.7 + dateformat: 3.0.3 + handlebars: 4.7.9 + json-stringify-safe: 5.0.1 + lodash: 4.18.1 + meow: 8.1.2 + semver: 6.3.1 + split: 1.0.1 + through2: 4.0.2 + + conventional-changelog@3.1.25: + dependencies: + conventional-changelog-angular: 5.0.13 + conventional-changelog-atom: 2.0.8 + conventional-changelog-codemirror: 2.0.8 + conventional-changelog-conventionalcommits: 4.6.3 + conventional-changelog-core: 4.2.4 + conventional-changelog-ember: 2.0.9 + conventional-changelog-eslint: 3.0.9 + conventional-changelog-express: 2.0.6 + conventional-changelog-jquery: 3.0.11 + conventional-changelog-jshint: 2.0.9 + conventional-changelog-preset-loader: 2.3.4 + + conventional-commits-filter@2.0.7: + dependencies: + lodash.ismatch: 4.4.0 + modify-values: 1.0.1 + + conventional-commits-parser@3.2.4: + dependencies: + JSONStream: 1.3.5 + is-text-path: 1.0.1 + lodash: 4.18.1 + meow: 8.1.2 + split2: 3.2.2 + through2: 4.0.2 + convert-source-map@2.0.0: {} core-js-bundle@3.49.0: {} @@ -3386,6 +5284,10 @@ snapshots: dependencies: browserslist: 4.28.4 + core-util-is@1.0.3: {} + + create-require@1.1.1: {} + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 @@ -3394,6 +5296,22 @@ snapshots: crypto-random-string@2.0.0: {} + crypto-random-string@4.0.0: + dependencies: + type-fest: 1.4.0 + + css-select@4.3.0: + dependencies: + boolbase: 1.0.0 + css-what: 6.2.2 + domhandler: 4.3.1 + domutils: 2.8.0 + nth-check: 2.1.1 + + css-what@6.2.2: {} + + dargs@7.0.0: {} + data-view-buffer@1.0.2: dependencies: call-bound: 1.0.4 @@ -3412,12 +5330,31 @@ snapshots: es-errors: 1.3.0 is-data-view: 1.0.2 + dateformat@3.0.3: {} + + debug@4.3.4: + dependencies: + ms: 2.1.2 + debug@4.4.3: dependencies: ms: 2.1.3 + decamelize-keys@1.1.1: + dependencies: + decamelize: 1.2.0 + map-obj: 1.0.1 + + decamelize@1.2.0: {} + + decompress-response@6.0.0: + dependencies: + mimic-response: 3.1.0 + deep-eql@5.0.2: {} + deep-extend@0.6.0: {} + deepmerge@4.3.1: {} define-data-property@1.1.4: @@ -3426,14 +5363,44 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 + define-lazy-prop@2.0.0: {} + define-properties@1.2.1: dependencies: define-data-property: 1.1.4 has-property-descriptors: 1.0.2 object-keys: 1.1.1 + detect-libc@2.1.2: {} + devalue@5.8.1: {} + diff@4.0.4: {} + + diff@5.2.2: {} + + dom-serializer@1.4.1: + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + entities: 2.2.0 + + domelementtype@2.3.0: {} + + domhandler@4.3.1: + dependencies: + domelementtype: 2.3.0 + + domutils@2.8.0: + dependencies: + dom-serializer: 1.4.1 + domelementtype: 2.3.0 + domhandler: 4.3.1 + + dot-prop@5.3.0: + dependencies: + is-obj: 2.0.0 + dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.2 @@ -3446,6 +5413,26 @@ snapshots: electron-to-chromium@1.5.387: {} + elementtree@0.1.7: + dependencies: + sax: 1.1.4 + + emoji-regex@8.0.0: {} + + end-of-stream@1.4.5: + dependencies: + once: 1.4.0 + + entities@2.2.0: {} + + env-paths@2.2.1: {} + + env-paths@3.0.0: {} + + error-ex@1.3.4: + dependencies: + is-arrayish: 0.2.1 + es-abstract-get@1.0.0: dependencies: es-errors: 1.3.0 @@ -3567,6 +5554,8 @@ snapshots: escalade@3.2.0: {} + escape-string-regexp@1.0.5: {} + esm-env@1.2.2: {} esrap@2.2.9: @@ -3583,14 +5572,28 @@ snapshots: eta@4.6.0: {} + events-universal@1.0.1: + dependencies: + bare-events: 2.9.1 + transitivePeerDependencies: + - bare-abort-controller + + expand-template@2.0.3: {} + expect-type@1.3.0: {} fast-deep-equal@3.1.3: {} + fast-fifo@1.3.2: {} + fast-json-stable-stringify@2.1.0: {} fast-uri@3.1.3: {} + fd-slicer@1.1.0: + dependencies: + pend: 1.2.0 + fdir@6.5.0(picomatch@4.0.4): optionalDependencies: picomatch: 4.0.4 @@ -3599,6 +5602,15 @@ snapshots: dependencies: minimatch: 5.1.9 + find-up@2.1.0: + dependencies: + locate-path: 2.0.0 + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + flatbuffers@25.9.23: {} for-each@0.3.5: @@ -3610,6 +5622,20 @@ snapshots: cross-spawn: 7.0.6 signal-exit: 4.1.0 + fs-constants@1.0.0: {} + + fs-extra@10.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.1 + universalify: 2.0.1 + + fs-extra@11.3.6: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.1 + universalify: 2.0.1 + fs-extra@9.1.0: dependencies: at-least-node: 1.0.0 @@ -3617,6 +5643,12 @@ snapshots: jsonfile: 6.2.1 universalify: 2.0.1 + fs-minipass@2.1.0: + dependencies: + minipass: 3.3.6 + + fs.realpath@1.0.0: {} + fsevents@2.3.2: optional: true @@ -3643,6 +5675,8 @@ snapshots: gensync@1.0.0-beta.2: {} + get-caller-file@2.0.5: {} + get-intrinsic@1.3.0: dependencies: call-bind-apply-helpers: 1.0.2 @@ -3658,6 +5692,13 @@ snapshots: get-own-enumerable-property-symbols@3.0.2: {} + get-pkg-repo@4.2.1: + dependencies: + '@hutson/parse-repository-url': 3.0.2 + hosted-git-info: 4.1.0 + through2: 2.0.5 + yargs: 16.2.2 + get-proto@1.0.1: dependencies: dunder-proto: 1.0.1 @@ -3669,6 +5710,30 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.3.0 + git-raw-commits@2.0.11: + dependencies: + dargs: 7.0.0 + lodash: 4.18.1 + meow: 8.1.2 + split2: 3.2.2 + through2: 4.0.2 + + git-remote-origin-url@2.0.0: + dependencies: + gitconfiglocal: 1.0.0 + pify: 2.3.0 + + git-semver-tags@4.1.1: + dependencies: + meow: 8.1.2 + semver: 6.3.1 + + gitconfiglocal@1.0.0: + dependencies: + ini: 1.3.8 + + github-from-package@0.0.0: {} + glob@11.1.0: dependencies: foreground-child: 3.3.1 @@ -3678,6 +5743,19 @@ snapshots: package-json-from-dist: 1.0.1 path-scurry: 2.0.2 + glob@13.0.6: + dependencies: + minimatch: 10.2.5 + minipass: 7.1.3 + path-scurry: 2.0.2 + + glob@9.3.5: + dependencies: + fs.realpath: 1.0.0 + minimatch: 8.0.7 + minipass: 4.2.8 + path-scurry: 1.11.1 + globalthis@1.0.4: dependencies: define-properties: 1.2.1 @@ -3687,8 +5765,25 @@ snapshots: graceful-fs@4.2.11: {} + gradle-to-js@2.0.1: + dependencies: + lodash.merge: 4.6.2 + + handlebars@4.7.9: + dependencies: + minimist: 1.2.8 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.19.3 + + hard-rejection@2.1.0: {} + has-bigints@1.1.0: {} + has-flag@3.0.0: {} + has-property-descriptors@1.0.2: dependencies: es-define-property: 1.0.1 @@ -3707,8 +5802,28 @@ snapshots: dependencies: function-bind: 1.1.2 + he@1.2.0: {} + + hosted-git-info@2.8.9: {} + + hosted-git-info@4.1.0: + dependencies: + lru-cache: 6.0.0 + idb@7.1.1: {} + ieee754@1.2.1: {} + + indent-string@4.0.0: {} + + inherits@2.0.4: {} + + ini@1.3.8: {} + + ini@2.0.0: {} + + ini@4.1.3: {} + internal-slot@1.1.0: dependencies: es-errors: 1.3.0 @@ -3721,6 +5836,10 @@ snapshots: call-bound: 1.0.4 get-intrinsic: 1.3.0 + is-arrayish@0.2.1: {} + + is-arrayish@0.3.4: {} + is-async-function@2.1.1: dependencies: async-function: 1.0.0 @@ -3755,6 +5874,8 @@ snapshots: call-bound: 1.0.4 has-tostringtag: 1.0.2 + is-docker@2.2.1: {} + is-document.all@1.0.0: dependencies: call-bound: 1.0.4 @@ -3763,6 +5884,8 @@ snapshots: dependencies: call-bound: 1.0.4 + is-fullwidth-code-point@3.0.0: {} + is-generator-function@1.1.2: dependencies: call-bound: 1.0.4 @@ -3784,6 +5907,10 @@ snapshots: is-obj@1.0.1: {} + is-obj@2.0.0: {} + + is-plain-obj@1.1.0: {} + is-reference@3.0.3: dependencies: '@types/estree': 1.0.9 @@ -3805,6 +5932,8 @@ snapshots: is-stream@2.0.1: {} + is-stream@3.0.0: {} + is-string@1.1.1: dependencies: call-bound: 1.0.4 @@ -3816,6 +5945,10 @@ snapshots: has-symbols: 1.1.0 safe-regex-test: 1.1.0 + is-text-path@1.0.1: + dependencies: + text-extensions: 1.9.0 + is-typed-array@1.1.15: dependencies: which-typed-array: 1.1.22 @@ -3831,6 +5964,12 @@ snapshots: call-bound: 1.0.4 get-intrinsic: 1.3.0 + is-wsl@2.2.0: + dependencies: + is-docker: 2.2.1 + + isarray@1.0.0: {} + isarray@2.0.5: {} isexe@2.0.0: {} @@ -3851,8 +5990,14 @@ snapshots: jsesc@3.1.0: {} + json-parse-better-errors@1.0.2: {} + + json-parse-even-better-errors@2.3.1: {} + json-schema-traverse@1.0.0: {} + json-stringify-safe@5.0.1: {} + json5@2.2.3: {} jsonfile@6.2.1: @@ -3861,52 +6006,206 @@ snapshots: optionalDependencies: graceful-fs: 4.2.11 + jsonparse@1.3.1: {} + jsonpointer@5.0.1: {} + kind-of@6.0.3: {} + + kleur@3.0.3: {} + kleur@4.1.5: {} leven@3.1.0: {} + lines-and-columns@1.2.4: {} + + load-json-file@4.0.0: + dependencies: + graceful-fs: 4.2.11 + parse-json: 4.0.0 + pify: 3.0.0 + strip-bom: 3.0.0 + locate-character@3.0.0: {} + locate-path@2.0.0: + dependencies: + p-locate: 2.0.0 + path-exists: 3.0.0 + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + lodash.debounce@4.0.8: {} + lodash.ismatch@4.4.0: {} + + lodash.merge@4.6.2: {} + lodash.sortby@4.7.0: {} + lodash@4.18.1: {} + loupe@3.2.1: {} + lru-cache@10.4.3: {} + lru-cache@11.5.1: {} lru-cache@5.1.1: dependencies: yallist: 3.1.1 + lru-cache@6.0.0: + dependencies: + yallist: 4.0.0 + magic-string@0.30.21: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 + make-error@1.3.6: {} + + map-obj@1.0.1: {} + + map-obj@4.3.0: {} + marked@18.0.5: {} math-intrinsics@1.1.0: {} + meow@8.1.2: + dependencies: + '@types/minimist': 1.2.5 + camelcase-keys: 6.2.2 + decamelize-keys: 1.1.1 + hard-rejection: 2.1.0 + minimist-options: 4.1.0 + normalize-package-data: 3.0.3 + read-pkg-up: 7.0.1 + redent: 3.0.0 + trim-newlines: 3.0.1 + type-fest: 0.18.1 + yargs-parser: 20.2.9 + + mimic-response@3.1.0: {} + + min-indent@1.0.1: {} + minimatch@10.2.5: dependencies: brace-expansion: 5.0.7 + minimatch@3.0.5: + dependencies: + brace-expansion: 1.1.16 + minimatch@5.1.9: dependencies: brace-expansion: 2.1.1 + minimatch@8.0.7: + dependencies: + brace-expansion: 2.1.1 + + minimist-options@4.1.0: + dependencies: + arrify: 1.0.1 + is-plain-obj: 1.1.0 + kind-of: 6.0.3 + + minimist@1.2.8: {} + + minipass@3.3.6: + dependencies: + yallist: 4.0.0 + + minipass@4.2.8: {} + + minipass@5.0.0: {} + minipass@7.1.3: {} + minizlib@2.1.2: + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + + minizlib@3.1.0: + dependencies: + minipass: 7.1.3 + + mkdirp-classic@0.5.3: {} + + mkdirp@1.0.4: {} + + modify-values@1.0.1: {} + mri@1.2.0: {} + ms@2.1.2: {} + ms@2.1.3: {} nanoid@3.3.12: {} + napi-build-utils@2.0.0: {} + + native-run@2.0.3: + dependencies: + '@ionic/utils-fs': 3.1.7 + '@ionic/utils-terminal': 2.3.5 + bplist-parser: 0.3.2 + debug: 4.4.3 + elementtree: 0.1.7 + ini: 4.1.3 + plist: 3.1.1 + split2: 4.2.0 + through2: 4.0.2 + tslib: 2.8.1 + yauzl: 2.10.0 + transitivePeerDependencies: + - supports-color + + neo-async@2.6.2: {} + + node-abi@3.94.0: + dependencies: + semver: 7.8.5 + + node-addon-api@6.1.0: {} + + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + + node-html-parser@5.4.2: + dependencies: + css-select: 4.3.0 + he: 1.2.0 + node-releases@2.0.50: {} + normalize-package-data@2.5.0: + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.12 + semver: 5.7.2 + validate-npm-package-license: 3.0.4 + + normalize-package-data@3.0.3: + dependencies: + hosted-git-info: 4.1.0 + is-core-module: 2.16.2 + semver: 7.8.5 + validate-npm-package-license: 3.0.4 + + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + object-inspect@1.13.4: {} object-keys@1.1.1: {} @@ -3920,31 +6219,92 @@ snapshots: has-symbols: 1.1.0 object-keys: 1.1.1 + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + open@8.4.2: + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + own-keys@1.0.1: dependencies: get-intrinsic: 1.3.0 object-keys: 1.1.1 safe-push-apply: 1.0.0 + p-limit@1.3.0: + dependencies: + p-try: 1.0.0 + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-locate@2.0.0: + dependencies: + p-limit: 1.3.0 + + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + + p-try@1.0.0: {} + + p-try@2.2.0: {} + package-json-from-dist@1.0.1: {} + parse-json@4.0.0: + dependencies: + error-ex: 1.3.4 + json-parse-better-errors: 1.0.2 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.29.7 + error-ex: 1.3.4 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + path-exists@3.0.0: {} + + path-exists@4.0.0: {} + path-key@3.1.1: {} path-parse@1.0.7: {} + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.3 + path-scurry@2.0.2: dependencies: lru-cache: 11.5.1 minipass: 7.1.3 + path-type@3.0.0: + dependencies: + pify: 3.0.0 + pathe@2.0.3: {} pathval@2.0.1: {} + pend@1.2.0: {} + picocolors@1.1.1: {} picomatch@4.0.4: {} + pify@2.3.0: {} + + pify@3.0.0: {} + playwright-core@1.60.0: {} playwright@1.60.0: @@ -3953,6 +6313,12 @@ snapshots: optionalDependencies: fsevents: 2.3.2 + plist@3.1.1: + dependencies: + '@xmldom/xmldom': 0.9.10 + base64-js: 1.5.1 + xmlbuilder: 15.1.1 + possible-typed-array-names@1.1.0: {} postcss@8.5.15: @@ -3961,14 +6327,99 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 + prebuild-install@7.1.3: + dependencies: + detect-libc: 2.1.2 + expand-template: 2.0.3 + github-from-package: 0.0.0 + minimist: 1.2.8 + mkdirp-classic: 0.5.3 + napi-build-utils: 2.0.0 + node-abi: 3.94.0 + pump: 3.0.4 + rc: 1.2.8 + simple-get: 4.0.1 + tar-fs: 2.1.5 + tunnel-agent: 0.6.0 + + prettier@2.8.8: {} + pretty-bytes@5.6.0: {} pretty-bytes@6.1.1: {} + process-nextick-args@2.0.1: {} + + prompts@2.4.2: + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + + pump@3.0.4: + dependencies: + end-of-stream: 1.4.5 + once: 1.4.0 + punycode@2.3.1: {} + q@1.5.1: {} + + quick-lru@4.0.1: {} + + rc@1.2.8: + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + + read-pkg-up@3.0.0: + dependencies: + find-up: 2.1.0 + read-pkg: 3.0.0 + + read-pkg-up@7.0.1: + dependencies: + find-up: 4.1.0 + read-pkg: 5.2.0 + type-fest: 0.8.1 + + read-pkg@3.0.0: + dependencies: + load-json-file: 4.0.0 + normalize-package-data: 2.5.0 + path-type: 3.0.0 + + read-pkg@5.2.0: + dependencies: + '@types/normalize-package-data': 2.4.4 + normalize-package-data: 2.5.0 + parse-json: 5.2.0 + type-fest: 0.6.0 + + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + readdirp@4.1.2: {} + redent@3.0.0: + dependencies: + indent-string: 4.0.0 + strip-indent: 3.0.0 + reflect.getprototypeof@1.0.10: dependencies: call-bind: 1.0.9 @@ -3986,6 +6437,8 @@ snapshots: regenerate@1.4.2: {} + regexp-to-ast@0.5.0: {} + regexp.prototype.flags@1.5.4: dependencies: call-bind: 1.0.9 @@ -4010,8 +6463,18 @@ snapshots: dependencies: jsesc: 3.1.0 + replace@1.2.2: + dependencies: + chalk: 2.4.2 + minimatch: 3.0.5 + yargs: 15.4.1 + + require-directory@2.1.1: {} + require-from-string@2.0.2: {} + require-main-filename@2.0.0: {} + resolve@1.22.12: dependencies: es-errors: 1.3.0 @@ -4019,6 +6482,15 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + rimraf@4.4.1: + dependencies: + glob: 9.3.5 + + rimraf@6.1.3: + dependencies: + glob: 13.0.6 + package-json-from-dist: 1.0.1 + rollup@4.61.0: dependencies: '@types/estree': 1.0.9 @@ -4062,6 +6534,10 @@ snapshots: has-symbols: 1.1.0 isarray: 2.0.5 + safe-buffer@5.1.2: {} + + safe-buffer@5.2.1: {} + safe-push-apply@1.0.0: dependencies: es-errors: 1.3.0 @@ -4073,10 +6549,20 @@ snapshots: es-errors: 1.3.0 is-regex: 1.2.1 + sax@1.1.4: {} + + sax@1.6.0: {} + + semver@5.7.2: {} + semver@6.3.1: {} + semver@7.8.5: {} + serialize-javascript@7.0.7: {} + set-blocking@2.0.0: {} + set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 @@ -4099,6 +6585,21 @@ snapshots: es-errors: 1.3.0 es-object-atoms: 1.1.2 + sharp@0.32.6: + dependencies: + color: 4.2.3 + detect-libc: 2.1.2 + node-addon-api: 6.1.0 + prebuild-install: 7.1.3 + semver: 7.8.5 + simple-get: 4.0.1 + tar-fs: 3.1.3 + tunnel-agent: 0.6.0 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - react-native-b4a + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 @@ -4135,8 +6636,36 @@ snapshots: siginfo@2.0.0: {} + signal-exit@3.0.7: {} + signal-exit@4.1.0: {} + simple-concat@1.0.1: {} + + simple-get@4.0.1: + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + + simple-plist@1.3.1: + dependencies: + bplist-creator: 0.1.0 + bplist-parser: 0.3.1 + plist: 3.1.1 + + simple-swizzle@0.2.4: + dependencies: + is-arrayish: 0.3.4 + + sisteransi@1.0.5: {} + + slice-ansi@4.0.0: + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + smob@1.6.2: {} source-map-js@1.2.1: {} @@ -4152,6 +6681,30 @@ snapshots: dependencies: whatwg-url: 7.1.0 + spdx-correct@3.2.0: + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.23 + + spdx-exceptions@2.5.0: {} + + spdx-expression-parse@3.0.1: + dependencies: + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.23 + + spdx-license-ids@3.0.23: {} + + split2@3.2.2: + dependencies: + readable-stream: 3.6.2 + + split2@4.2.0: {} + + split@1.0.1: + dependencies: + through: 2.3.8 + stackback@0.0.2: {} std-env@3.10.0: {} @@ -4161,6 +6714,23 @@ snapshots: es-errors: 1.3.0 internal-slot: 1.1.0 + stream-buffers@2.2.0: {} + + streamx@2.28.0: + dependencies: + events-universal: 1.0.1 + fast-fifo: 1.3.2 + text-decoder: 1.2.7 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + string.prototype.matchall@4.0.12: dependencies: call-bind: 1.0.9 @@ -4201,18 +6771,42 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.1.2 + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + stringify-object@3.3.0: dependencies: get-own-enumerable-property-symbols: 3.0.2 is-obj: 1.0.1 is-regexp: 1.0.0 + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-bom@3.0.0: {} + strip-comments@2.0.1: {} + strip-indent@3.0.0: + dependencies: + min-indent: 1.0.1 + + strip-json-comments@2.0.1: {} + strip-literal@3.1.0: dependencies: js-tokens: 9.0.1 + supports-color@5.5.0: + dependencies: + has-flag: 3.0.0 + supports-preserve-symlinks-flag@1.0.0: {} svelte-check@4.5.0(picomatch@4.0.4)(svelte@5.56.0)(typescript@5.9.3): @@ -4248,8 +6842,72 @@ snapshots: transitivePeerDependencies: - '@typescript-eslint/types' + tar-fs@2.1.5: + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.4 + tar-stream: 2.2.0 + + tar-fs@3.1.3: + dependencies: + pump: 3.0.4 + tar-stream: 3.2.0 + optionalDependencies: + bare-fs: 4.7.4 + bare-path: 3.1.1 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - react-native-b4a + + tar-stream@2.2.0: + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.5 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + + tar-stream@3.2.0: + dependencies: + b4a: 1.8.1 + bare-fs: 4.7.4 + fast-fifo: 1.3.2 + streamx: 2.28.0 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - react-native-b4a + + tar@6.2.1: + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + + tar@7.5.19: + dependencies: + '@isaacs/fs-minipass': 4.0.1 + chownr: 3.0.0 + minipass: 7.1.3 + minizlib: 3.1.0 + yallist: 5.0.0 + + teex@1.0.1: + dependencies: + streamx: 2.28.0 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + temp-dir@2.0.0: {} + temp-dir@3.0.0: {} + tempy@0.6.0: dependencies: is-stream: 2.0.1 @@ -4257,6 +6915,13 @@ snapshots: type-fest: 0.16.0 unique-string: 2.0.0 + tempy@3.2.0: + dependencies: + is-stream: 3.0.0 + temp-dir: 3.0.0 + type-fest: 2.19.0 + unique-string: 3.0.0 + terser@5.48.0: dependencies: '@jridgewell/source-map': 0.3.11 @@ -4264,6 +6929,25 @@ snapshots: commander: 2.20.3 source-map-support: 0.5.21 + text-decoder@1.2.7: + dependencies: + b4a: 1.8.1 + transitivePeerDependencies: + - react-native-b4a + + text-extensions@1.9.0: {} + + through2@2.0.5: + dependencies: + readable-stream: 2.3.8 + xtend: 4.0.2 + + through2@4.0.2: + dependencies: + readable-stream: 3.6.2 + + through@2.3.8: {} + tinybench@2.9.0: {} tinyexec@0.3.2: {} @@ -4279,14 +6963,56 @@ snapshots: tinyspy@4.0.4: {} + tmp@0.2.7: {} + + tr46@0.0.3: {} + tr46@1.0.1: dependencies: punycode: 2.3.1 + tree-kill@1.2.2: {} + + trim-newlines@3.0.1: {} + + ts-node@10.9.2(@types/node@22.19.19)(typescript@5.9.3): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.12 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 22.19.19 + acorn: 8.16.0 + acorn-walk: 8.3.5 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.4 + make-error: 1.3.6 + typescript: 5.9.3 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + + tslib@2.6.2: {} + tslib@2.8.1: {} + tunnel-agent@0.6.0: + dependencies: + safe-buffer: 5.2.1 + type-fest@0.16.0: {} + type-fest@0.18.1: {} + + type-fest@0.6.0: {} + + type-fest@0.8.1: {} + + type-fest@1.4.0: {} + + type-fest@2.19.0: {} + typed-array-buffer@1.0.3: dependencies: call-bound: 1.0.4 @@ -4324,6 +7050,9 @@ snapshots: typescript@5.9.3: {} + uglify-js@3.19.3: + optional: true + unbox-primitive@1.1.0: dependencies: call-bound: 1.0.4 @@ -4348,8 +7077,14 @@ snapshots: dependencies: crypto-random-string: 2.0.0 + unique-string@3.0.0: + dependencies: + crypto-random-string: 4.0.0 + universalify@2.0.1: {} + untildify@4.0.0: {} + upath@1.2.0: {} update-browserslist-db@1.2.3(browserslist@4.28.4): @@ -4358,6 +7093,17 @@ snapshots: escalade: 3.2.0 picocolors: 1.1.1 + util-deprecate@1.0.2: {} + + uuid@7.0.3: {} + + v8-compile-cache-lib@3.0.1: {} + + validate-npm-package-license@3.0.4: + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + vite-node@3.2.4(@types/node@22.19.19)(terser@5.48.0): dependencies: cac: 6.7.14 @@ -4448,8 +7194,15 @@ snapshots: - tsx - yaml + webidl-conversions@3.0.1: {} + webidl-conversions@4.0.2: {} + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + whatwg-url@7.1.0: dependencies: lodash.sortby: 4.7.0 @@ -4487,6 +7240,8 @@ snapshots: is-weakmap: 2.0.2 is-weakset: 2.0.4 + which-module@2.0.1: {} + which-typed-array@1.1.22: dependencies: available-typed-arrays: 1.0.7 @@ -4506,6 +7261,8 @@ snapshots: siginfo: 2.0.0 stackback: 0.0.2 + wordwrap@1.0.0: {} + workbox-background-sync@7.4.1: dependencies: idb: 7.1.1 @@ -4619,6 +7376,105 @@ snapshots: '@types/trusted-types': 2.0.7 workbox-core: 7.4.1 + wrap-ansi@6.2.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrappy@1.0.2: {} + + xcode@3.0.1: + dependencies: + simple-plist: 1.3.1 + uuid: 7.0.3 + + xml-js@1.6.11: + dependencies: + sax: 1.6.0 + + xml2js@0.5.0: + dependencies: + sax: 1.6.0 + xmlbuilder: 11.0.1 + + xml2js@0.6.2: + dependencies: + sax: 1.6.0 + xmlbuilder: 11.0.1 + + xmlbuilder@11.0.1: {} + + xmlbuilder@15.1.1: {} + + xpath@0.0.32: {} + + xtend@4.0.2: {} + + y18n@4.0.3: {} + + y18n@5.0.8: {} + yallist@3.1.1: {} + yallist@4.0.0: {} + + yallist@5.0.0: {} + + yargs-parser@18.1.3: + dependencies: + camelcase: 5.3.1 + decamelize: 1.2.0 + + yargs-parser@20.2.9: {} + + yargs-parser@21.1.1: {} + + yargs@15.4.1: + dependencies: + cliui: 6.0.0 + decamelize: 1.2.0 + find-up: 4.1.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + require-main-filename: 2.0.0 + set-blocking: 2.0.0 + string-width: 4.2.3 + which-module: 2.0.1 + y18n: 4.0.3 + yargs-parser: 18.1.3 + + yargs@16.2.2: + dependencies: + cliui: 7.0.4 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.9 + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yauzl@2.10.0: + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + + yn@3.1.1: {} + zimmerframe@1.1.4: {} diff --git a/ui/pnpm-workspace.yaml b/ui/pnpm-workspace.yaml index 14571e3..e1b253c 100644 --- a/ui/pnpm-workspace.yaml +++ b/ui/pnpm-workspace.yaml @@ -6,3 +6,7 @@ allowBuilds: core-js-bundle: false esbuild: true + # sharp (via @capacitor/assets) rasterises the launcher icon/splash for the + # `android:assets` script. It installs a prebuilt binary via prebuild-install — + # no native toolchain needed — so allow its install script to materialise it. + sharp: true diff --git a/ui/src/App.svelte b/ui/src/App.svelte index c4cbeb6..ad9fe2c 100644 --- a/ui/src/App.svelte +++ b/ui/src/App.svelte @@ -4,6 +4,7 @@ import { app, bootstrap, resolveOfflinePrompt } from './lib/app.svelte'; import { router, type RouteName } from './lib/router.svelte'; import { t } from './lib/i18n/index.svelte'; + import { initNativeShell } from './lib/native'; import Toast from './components/Toast.svelte'; import Splash from './components/Splash.svelte'; import StaleInviteModal from './components/StaleInviteModal.svelte'; @@ -32,6 +33,10 @@ void bootstrap().then(() => { (window as unknown as { __booted?: boolean }).__booted = true; }); + // Native shell only: wire the Android hardware Back button. No-op — and pulls no + // @capacitor/app — on web/Telegram/VK, where initNativeShell early-returns. At the + // navigation root (lobby/login) Back exits the app; otherwise it steps history back. + void initNativeShell(() => routeDepth(router.route.name) === 0); }); // The lobby is the cold-start landing (an empty hash and Telegram launch params both parse diff --git a/ui/src/lib/native.ts b/ui/src/lib/native.ts new file mode 100644 index 0000000..df77896 --- /dev/null +++ b/ui/src/lib/native.ts @@ -0,0 +1,25 @@ +// Native shell integration for the Capacitor Android/iOS builds. Kept in its own +// module behind a dynamic import so the web / Telegram / VK / mock bundles never load +// @capacitor/app: initNativeShell early-returns off the native channels, so the import +// statement is only ever reached inside the packaged native app. + +import { clientChannel } from './channel'; + +/** + * initNativeShell wires native-shell behaviour that only applies inside the packaged + * Capacitor app. Currently it binds the Android hardware Back button: at the navigation + * root it exits the app, otherwise it steps the in-app (hash) history back. It is a + * no-op on the web/Telegram/VK channels and never loads @capacitor/app there. + * + * atNavigationRoot reports whether the current route is a navigation root (the lobby or + * login screen) — mirror App.svelte's routeDepth(...) === 0. + */ +export async function initNativeShell(atNavigationRoot: () => boolean): Promise { + const ch = clientChannel(); + if (ch !== 'android' && ch !== 'ios') return; + const { App } = await import('@capacitor/app'); + App.addListener('backButton', () => { + if (atNavigationRoot()) void App.exitApp(); + else history.back(); + }); +} From aaf2825260a56b95a57c69867e406c73dcf293f7 Mon Sep 17 00:00:00 2001 From: Ilia Denisov Date: Sun, 12 Jul 2026 02:05:46 +0200 Subject: [PATCH 03/18] =?UTF-8?q?feat(android):=20add=20temporary=20=C2=AB?= =?UTF-8?q?=D0=AD=C2=BB=20launcher=20icon=20(pending=20full=20rebrand)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Generate the Android launcher/adaptive icons + splashes with capacitor-assets from ui/assets/icon.png (the existing maskable brand mark upscaled 512→1024) as a placeholder until the mandatory single-vector icon rebrand recorded in ANDROID_PLAN.md. The adaptive icon insets the foreground 16.7% into the safe zone; the AndroidManifest is untouched (its icon refs already point at @mipmap). Co-Authored-By: Claude Opus 4.8 --- ANDROID_PLAN.md | 12 +++++++++--- .../main/res/drawable-land-hdpi/splash.png | Bin 7705 -> 9825 bytes .../main/res/drawable-land-ldpi/splash.png | Bin 0 -> 3548 bytes .../main/res/drawable-land-mdpi/splash.png | Bin 4040 -> 5498 bytes .../res/drawable-land-night-hdpi/splash.png | Bin 0 -> 16201 bytes .../res/drawable-land-night-ldpi/splash.png | Bin 0 -> 4628 bytes .../res/drawable-land-night-mdpi/splash.png | Bin 0 -> 8238 bytes .../res/drawable-land-night-xhdpi/splash.png | Bin 0 -> 30660 bytes .../res/drawable-land-night-xxhdpi/splash.png | Bin 0 -> 46880 bytes .../drawable-land-night-xxxhdpi/splash.png | Bin 0 -> 67325 bytes .../main/res/drawable-land-xhdpi/splash.png | Bin 9251 -> 16782 bytes .../main/res/drawable-land-xxhdpi/splash.png | Bin 13984 -> 23872 bytes .../main/res/drawable-land-xxxhdpi/splash.png | Bin 17683 -> 30813 bytes .../src/main/res/drawable-night/splash.png | Bin 0 -> 4628 bytes .../main/res/drawable-port-hdpi/splash.png | Bin 7934 -> 7456 bytes .../main/res/drawable-port-ldpi/splash.png | Bin 0 -> 2989 bytes .../main/res/drawable-port-mdpi/splash.png | Bin 4096 -> 4397 bytes .../res/drawable-port-night-hdpi/splash.png | Bin 0 -> 14367 bytes .../res/drawable-port-night-ldpi/splash.png | Bin 0 -> 4186 bytes .../res/drawable-port-night-mdpi/splash.png | Bin 0 -> 6612 bytes .../res/drawable-port-night-xhdpi/splash.png | Bin 0 -> 29003 bytes .../res/drawable-port-night-xxhdpi/splash.png | Bin 0 -> 42062 bytes .../drawable-port-night-xxxhdpi/splash.png | Bin 0 -> 63112 bytes .../main/res/drawable-port-xhdpi/splash.png | Bin 9875 -> 12740 bytes .../main/res/drawable-port-xxhdpi/splash.png | Bin 13346 -> 18201 bytes .../main/res/drawable-port-xxxhdpi/splash.png | Bin 17489 -> 25463 bytes .../app/src/main/res/drawable/splash.png | Bin 4040 -> 4397 bytes .../res/mipmap-anydpi-v26/ic_launcher.xml | 8 ++++++-- .../mipmap-anydpi-v26/ic_launcher_round.xml | 8 ++++++-- .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 2786 -> 2248 bytes .../mipmap-hdpi/ic_launcher_background.png | Bin 0 -> 913 bytes .../mipmap-hdpi/ic_launcher_foreground.png | Bin 3450 -> 5669 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 4341 -> 3251 bytes .../src/main/res/mipmap-ldpi/ic_launcher.png | Bin 0 -> 754 bytes .../mipmap-ldpi/ic_launcher_background.png | Bin 0 -> 333 bytes .../mipmap-ldpi/ic_launcher_foreground.png | Bin 0 -> 2878 bytes .../res/mipmap-ldpi/ic_launcher_round.png | Bin 0 -> 1546 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 1869 -> 1195 bytes .../mipmap-mdpi/ic_launcher_background.png | Bin 0 -> 564 bytes .../mipmap-mdpi/ic_launcher_foreground.png | Bin 2110 -> 3824 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 2725 -> 2119 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 3981 -> 3445 bytes .../mipmap-xhdpi/ic_launcher_background.png | Bin 0 -> 1518 bytes .../mipmap-xhdpi/ic_launcher_foreground.png | Bin 5036 -> 7898 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 6593 -> 4349 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 6644 -> 5691 bytes .../mipmap-xxhdpi/ic_launcher_background.png | Bin 0 -> 2933 bytes .../mipmap-xxhdpi/ic_launcher_foreground.png | Bin 9793 -> 12572 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 10455 -> 6430 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 9441 -> 8074 bytes .../mipmap-xxxhdpi/ic_launcher_background.png | Bin 0 -> 4738 bytes .../mipmap-xxxhdpi/ic_launcher_foreground.png | Bin 15529 -> 18807 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 15916 -> 8807 bytes ui/assets/icon.png | Bin 0 -> 46671 bytes 54 files changed, 21 insertions(+), 7 deletions(-) create mode 100644 ui/android/app/src/main/res/drawable-land-ldpi/splash.png create mode 100644 ui/android/app/src/main/res/drawable-land-night-hdpi/splash.png create mode 100644 ui/android/app/src/main/res/drawable-land-night-ldpi/splash.png create mode 100644 ui/android/app/src/main/res/drawable-land-night-mdpi/splash.png create mode 100644 ui/android/app/src/main/res/drawable-land-night-xhdpi/splash.png create mode 100644 ui/android/app/src/main/res/drawable-land-night-xxhdpi/splash.png create mode 100644 ui/android/app/src/main/res/drawable-land-night-xxxhdpi/splash.png create mode 100644 ui/android/app/src/main/res/drawable-night/splash.png create mode 100644 ui/android/app/src/main/res/drawable-port-ldpi/splash.png create mode 100644 ui/android/app/src/main/res/drawable-port-night-hdpi/splash.png create mode 100644 ui/android/app/src/main/res/drawable-port-night-ldpi/splash.png create mode 100644 ui/android/app/src/main/res/drawable-port-night-mdpi/splash.png create mode 100644 ui/android/app/src/main/res/drawable-port-night-xhdpi/splash.png create mode 100644 ui/android/app/src/main/res/drawable-port-night-xxhdpi/splash.png create mode 100644 ui/android/app/src/main/res/drawable-port-night-xxxhdpi/splash.png create mode 100644 ui/android/app/src/main/res/mipmap-hdpi/ic_launcher_background.png create mode 100644 ui/android/app/src/main/res/mipmap-ldpi/ic_launcher.png create mode 100644 ui/android/app/src/main/res/mipmap-ldpi/ic_launcher_background.png create mode 100644 ui/android/app/src/main/res/mipmap-ldpi/ic_launcher_foreground.png create mode 100644 ui/android/app/src/main/res/mipmap-ldpi/ic_launcher_round.png create mode 100644 ui/android/app/src/main/res/mipmap-mdpi/ic_launcher_background.png create mode 100644 ui/android/app/src/main/res/mipmap-xhdpi/ic_launcher_background.png create mode 100644 ui/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_background.png create mode 100644 ui/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png create mode 100644 ui/assets/icon.png diff --git a/ANDROID_PLAN.md b/ANDROID_PLAN.md index 7bc9c99..4876a05 100644 --- a/ANDROID_PLAN.md +++ b/ANDROID_PLAN.md @@ -68,11 +68,17 @@ Kept current as parts land so a fresh session resumes without re-deriving. Verif builds a debug APK that installs and **cold-launches to the Login screen** on the Pixel_10 emulator. `svelte-check` 0 errors, `vitest` 584 passed. Build recipe + toolchain gotchas live in `.claude/CLAUDE.md` → "Native Android build (Capacitor)". - **Remaining sub-item:** owner-supplied launcher icon (`ui/assets/icon.png`) → `pnpm android:assets`. + **Launcher icon:** a **temporary** placeholder is in place — `ui/assets/icon.png` (the maskable «Э» + brand mark upscaled 512→1024) → `pnpm android:assets` regenerated the Android launcher/adaptive + icons + splashes. Superseded by the icon rebrand below. - **B–G — pending.** -Open logistics (not code): the launcher icon (above); `~/.claude/bin/gitea-ci-watch.py` must exist -before the first push/PR; RuStore publication prerequisites gate release only. +Open logistics (not code): **mandatory icon rebrand (future)** — author ONE vector master and generate +*every* icon from it (web `favicon.svg` / PWA `icon-*` / maskable, Android adaptive, future iOS). Today +the formats drift — `favicon.svg` is a rounded bordered tile, `icon-maskable-512.png` a full-bleed +square, visibly different — and the Android launcher icon is only a temporary upscale of the maskable +(`capacitor-assets` insets it 16.7% into the adaptive safe zone). `~/.claude/bin/gitea-ci-watch.py` is present. +RuStore publication prerequisites gate release only. --- diff --git a/ui/android/app/src/main/res/drawable-land-hdpi/splash.png b/ui/android/app/src/main/res/drawable-land-hdpi/splash.png index e31573b4fc93e60d171f4046c0220e1463075d9e..40cdea710bab2194026a85a966230a05e11a5ef5 100644 GIT binary patch literal 9825 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 wKmFJ0_JHhk1&0B>;%YXATM diff --git a/ui/android/app/src/main/res/drawable-land-ldpi/splash.png b/ui/android/app/src/main/res/drawable-land-ldpi/splash.png new file mode 100644 index 0000000000000000000000000000000000000000..970a548b6f5cdc5cb1c6c511005203af65b710f3 GIT binary patch literal 3548 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 HLFxYiEffp% literal 4040 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 XyOn+%7f`N3b2T^T3uj5+eShz7v)7qy diff --git a/ui/android/app/src/main/res/drawable-land-night-hdpi/splash.png b/ui/android/app/src/main/res/drawable-land-night-hdpi/splash.png new file mode 100644 index 0000000000000000000000000000000000000000..77a91743d9cd62f90890e25e2a816981ca160685 GIT binary patch literal 16201 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 Xdm5JZG8Z@-zv8&1)#2xd+^_r>gu{#e literal 0 HcmV?d00001 diff --git a/ui/android/app/src/main/res/drawable-land-night-ldpi/splash.png b/ui/android/app/src/main/res/drawable-land-night-ldpi/splash.png new file mode 100644 index 0000000000000000000000000000000000000000..7ca9963c8a35f3747195ce9b046e3d51c5e0a8e2 GIT binary patch literal 4628 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 WzTPc!33%xb0vTO0y;!R69P!^CR$l=C literal 0 HcmV?d00001 diff --git a/ui/android/app/src/main/res/drawable-land-night-xhdpi/splash.png b/ui/android/app/src/main/res/drawable-land-night-xhdpi/splash.png new file mode 100644 index 0000000000000000000000000000000000000000..cbbf9ac5b66cd7fd0c7d24cfa7272d58e00186d5 GIT binary patch literal 30660 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 BSoi<{ literal 0 HcmV?d00001 diff --git a/ui/android/app/src/main/res/drawable-land-night-xxhdpi/splash.png b/ui/android/app/src/main/res/drawable-land-night-xxhdpi/splash.png new file mode 100644 index 0000000000000000000000000000000000000000..6b333a2593afd224b32e337232db9d08b140411d GIT binary patch literal 46880 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 literal 0 HcmV?d00001 diff --git a/ui/android/app/src/main/res/drawable-land-night-xxxhdpi/splash.png b/ui/android/app/src/main/res/drawable-land-night-xxxhdpi/splash.png new file mode 100644 index 0000000000000000000000000000000000000000..2073804207f1f05481f033831f66c91ba0e94f77 GIT binary patch literal 67325 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 literal 0 HcmV?d00001 diff --git a/ui/android/app/src/main/res/drawable-land-xhdpi/splash.png b/ui/android/app/src/main/res/drawable-land-xhdpi/splash.png index 807725501bdd92e94e51e7b2b0006f69e0083a0b..6034cb586a98dac485c3c1449c52e766f43de4c4 100644 GIT binary patch literal 16782 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 diff --git a/ui/android/app/src/main/res/drawable-land-xxhdpi/splash.png b/ui/android/app/src/main/res/drawable-land-xxhdpi/splash.png index 14c6c8fe39fcd51a0414866ad28cbe8ff3acb060..ffa80f4ba2f4af7111eb82e55d3230b6f19fffd5 100644 GIT binary patch literal 23872 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®q@N z14_H8ofW)l{|J8q+a)eH)I0r)>WXdzV%7J>PA~6_J)KLT90iYa^K=Wz7D!OybzqSru=f4?|KFl;Y)gP_H6V4x`~kZ6fE(xM1&;?72-TZNk+0 zr+Crr5yl%Iy@vfmt3eYFl!jIvPGFz^8Ek+2`48O1_pCX3xNWh-zBa{rIcc%+=|XVj zANYTg&s}TKb#OztQrCW(Xk?V^i{`q~%HtcveTxq(_HKeC9GzrtguMT4Nvs@KakPTA z9>*8bBZmLz`lK5=l)=b|=dT3a5ag^a1^znZyx5QKfUb1b9yacArRp%3@QWo(hrsCU z-K!-=jDmv!zb7XT>)r|-Z0Ry}lk2;dk-ECqMwr_nKN#x*X6~B5hVIN>6$1HwBz3Of z=Pk){AL5*=d90f17_qZEJLm;Q%WMdX=*N&!ki@E&cy7?>{1ssAH(tACtp*r@d^til z)x(1#6(kPD+joSF&J3sxJU@{-sWCS+pZq{Gsx=?z4wP;>?)1yHv0?X?VP{}cX4~aH zxeBPKw_rgW8rvewS1W2#^y+c>-183iMbJCqc38RN_o~__9-n|jcd&oA`m7*&Fqqpc z;Tev*0LS-ZK47Sq1unfvP1S43uA12P?PJmI8BeTYPr~R*tYUm^0;U%Hmu?bSZHEK6 zPjsW=E67Kq-&trmf;)UkmRABH2U)V)-eRT$j(%G12lLMsThSsU10iP#{)ZnvjzN$d z*K%P3`}oqyvpWP~venr>3viH8^`)Ma*=B31hw*Q+tqE>i2y7w!(o^lI^Yss^=tHW( z;cnCT(%B1gLz+TRGW9roFjI1EQTu-u`(f#RmZ8;FSN(bsC1J;+(i_R6mrW=yYx$cy z#%QKVrEx~kVMg~yo?^N28Wnk6x%L;J8i|*|ANEiNjq(Vhzuzl3ikpA*G!Z}kLAzAI z9qnySo%D|AuJj12%h;Otqjs(>LPj?rNdeU8so>P(C>XMzlho94ZD#w=cCOOU;=3&^ zsqAG!i{~lY271D|m>ztPV`)X@FO_;`wPjppYNQpM+ncvtz1lZjN>!Q^*I}T%uP78Z7tbV2$q3W_)14=kLFyJ z1GqL6T>ClgeZorL!}xP4f%OB_EsmJ`uw7dGWNV9OLlhb|UMpVhc{4@Bhh`tO!ZqzD zhusd<=K^ah!L@gQ?6dOpI-ge^e>S5W9eII57Zu16eU?GRbgKTeVk9yS{iK|O(zLR> zheb?;jwGCHS80NCn=jKxgJ>}qu4l%5NPihjzazGv#J?Jcyl;<#IW&x4mm>nrW8>}C z3U@aeD~)*F(0o^2{GnKVm$Jr#aZE ztl~TOkM^SdzJapQ((!-i8b!RkVQBKkL`2ZCBuy!qI1L{3Er526plVols~68U-^9Px zR(3{j;Z9RHX^muc0dUywJ|`yyZFf=k&-Gb#m4u73Lm5Ks%BfHj%2|gjn#i> zLC5pO$2Em9H;qoKQmMtl<@wgtPF1%2HariD5O~u>8=^*J&au~JH%Ih@&2Uging3U_ z0bzfKucW$ZHSx}!#buB?+-J)%RQbbXM-!BJTS&#dU_@lxU6>te2O+9 z@F{F{Nb!;{Cd`Gx+$G?11aB~S#wIH%D=*=7f7H@D@%B1)&bF$@t3JDq4l*%(wJTlh zo`?uMq{YilKUewPNaC)GuOr<8j9&ofqRU__BRUX^x8Cj3a;a$rXzgXqW>LR#CUn%~m)t zYC&ol(gAkbc^fd`xWU&bk5vT6KbFmsR=O78Bn%t7 znbw&=c+|T&#r+bls5rU6D#HMvqA<|;)BV%jOMonkm^p$7Vcel-Wwn$=uAJv&(8W>% z9))Fxpl*(%E#wFm_m!U~2HqgZs^2vaGeY(UfYKrSHV}w^D0N6!se5Ewy)Yy-!(2

aKj2hWG7>znxs|SE zN4rHtiSPqLskWp(?(_YYwgq+1@8v+~8As|(bC>$D(atG3ZE8-ZM3SVcg|vHQz$I=!(A`k`5= zOqR>&%G)$)k*QLz7MTB9wleWpv&N9Sta64wy}3Ytd?x!Ja8z>(z~(3UNFu^eFmn#6 zw!!gUxOuZi$PQIs*ixfZR3iLyADJ z5&s%tPfk>V!x|A-;oq%1!yk9H$UBP0ToA*EDtz(^!_AnF1bBQ7joj|? z5b)gSI8c8O$PYFE!vXJ<4gebg*9G9P2wcB{#kv0FItc5T@PDNo)}Rh4Us}L{e}xzW zhwt`)j`M)mP=G6H0;^&q=I0{jU%bIRkF#uLF;{vVC&H|_uc diff --git a/ui/android/app/src/main/res/drawable-land-xxxhdpi/splash.png b/ui/android/app/src/main/res/drawable-land-xxxhdpi/splash.png index 244ca2506dbe0fd8f6a05520ac7d1a629ea81438..af23dbbda0125f65f14bb6fe68c6ceb4bbc3be98 100644 GIT binary patch literal 30813 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 Xk?02{Nm`2kH{hb9+j-*I-xL1^A+URX literal 0 HcmV?d00001 diff --git a/ui/android/app/src/main/res/drawable-port-mdpi/splash.png b/ui/android/app/src/main/res/drawable-port-mdpi/splash.png index e944f4ad4e1ca1c8cf9a87b366acc01c4e5c1616..34c86a4aef5af93796783bb30abaf572f7eb331c 100644 GIT binary patch literal 4397 zcmeHLYgE$N7Duzt#z###lbNr)O?P@ojpJLihm*B5oiepThBQ+X0Uv=Sf|{e1O=6Ry z`HC9Ld?ffn3lua-gWQC`{mv*_pa54v;JrO&tB)Ov-fZR z_HUnCKL+`mZQQ;Q005YsIPP~E05CYDAEU+_^ncjDwD{>iCW*(-r2qiy{bv$8&lm$c2bu8Kn8*ckm#o6&Q5WC{y9JoLCitr=0eUIW|q_L@42 z)tB&TljSUB`ruTknLWF%M`Hol_O*dgl!^VO06^ARL*rLp9D4$CcT%n)Bak}zfJ8;q zjE^BS&J3)oNWOZ}i_fyF-G*#5iaDjf*PpDF)+H+;ir8LrBSBG7#^2pq@s8xJJ1K3s zM@V4qpf@5SGJb@#VbFHgZadidKIs>|G#?z*u|6*}!qzEL9eQ1B#Ye99B6_l_bq4K-mll7mHc4dII<^Uhn(Dg}Pm{6EG^Z0;g(3OgCAA zV=Q0rcqO(JUP*~-Xjj?&gubHSrBe$MVu@9H%VZ;PATQ!S_ zal%vj>+SLLc_9J?1}e}>YRc667Q$(53P|Kk(S4;LY6f#ZFAg_(L-CW?r(G$Eo^|BsgXc-R$19 z+gll#SifrlOr$>(?{PMkT!DCi@0-l2`aeo@m^WY>@2&ZfW<-K1glM#SrKnjT7)ic@ z?QSH)b$A(Cv(Or8cUe6hVI)NNudK?UIpb?_WCYjh-^x?$zzmTbsR`QBHKW(++xJj>vOIHC)~_S3%hT>O`< z;QX9!6)V8CL0@nuv;tCsZs~<$$!1dd^k}?ew1z({Rl~&I>|@4j(1~J_V~~`eajL!C zr3=HFbV^}G2K6H97y{ofwm8e$$Q_)20D`)(LmbwwrT#t>9@aLEUm6}&j&#^qGHg4i zJp&SJ?JAbv*vK-bjV>ERqx3X|+uZ5NZh0WC4}r!jFuhrQs^)I2S3HlF>~tNpejZ~G zJ*Gc<9GD2t*z*CV9m|%AraEe%$%D6~Ln*=M-@1PorDPkEB6!7}@Gw^EZhAV};+d8G z7Y=$V^~%h6{zZEVnYoC?w2HldV#Z11c6VqCT9=-jEa=4>aT(f)8!E_T!u5ttdMCry zCypr$)>!%qBqKY*CMWc1KsW&IwzBMRC&Z`g?q~uJw{`u)^l_i)_07p_i0ToLrd55S z&q`@;^n4NGF!dm*JT}WJPmhBEG`%YU!Dbn7tF10{gkNQb#Xv84Pa&A)x9G+?xXW;yBa`Z$-IUt*gbWnrl>WQE?w5F)J9qymHPU+ zm3e=B)h)D`{!NfrOBXp-*=ugF95m zS3S+BBpCv$v&vSOa);W)0I&#^Nh*mEeKX+~m#dFVF24d773=$K^oc)PCD{uMzMQUg zoKhGMiU*tA#1JBxsF~fLAs>>sOc5PO?~&A%LhX^NQ~R3NNI3VF|N82pM-XwU>cR~S zCh-nZi}@`r__*lhX;AP?WLd`k$!?IfhH^h!t(lQYnkkJ7e_FF<#Lg}r?yC=DGMAH= zJPjp4@qLE!9Kb4HAE_Bnk&vvf#T^wXJxSo}6mOe;qo*p!xRbZ~mHa(4e7U+~g*~8Y zq;%c>6If|`uddrP-uYwBZe%=7CS*IgFPh<)sZ_?g=uM2Y{O5FqBqQYq;jI0!efS<{eROq8GI$~d+ywNUxsJwC$Dg8@b>fPBInjSjP0?bWy~ z5!LdFGL;(aGhYTCbqEU~$Sx*bzeVq?_-WR8mPV8G_i#M_&H(_R(M+2Gzy0LASjk+$(RA4qnmbWGGUTPE^-o+E?}Rr-oft%o$% zvbGXD^x9@(z@M@g&!H+MKT;BMLkCv&?wN-24pSi(wuA(lQ)%tZ`9&qGPfF-w!P0%zCM~An>JP4 zfR+SEx3dUTO~_b^2gH8fNRGN&j_opL8C zK8~7|Pikv|D58;>N70nj6oJqbQ4x@U5P@s6Pj}9}bMDODckaxc`^PtHX3e*Luk~B& zH{abeK3?m;+y0$_fx&w36UWXO7_9nn1s_aSuk3^_*qW~_+Y&v45}|RI6Vd0dMjHHd zDegk#PVdrut0?Q52w-7VsNZ_NI@%@cV47RysHXdO9@9Uhs;BBHST8HCaUw82 z9mCFY&TcwbJ!IvY=B60cRCP_jOasBKe*L_~SSR})bhbn14xn$6DX~FS-$lC&b^6c( z+xR`FBm;=fXWBWgW$}E$5ksUdf57Ypse6tT>S}bL|(ZL-U(C z!JV8d*$Um-LumzP-NGf~{v(`I+$CS9A4r2^X<@#i&S~j&%w$6j1@Pd4bg62eTau=6 z#mTkL1^Mm0I(Ff!=D9BD!Lh0!y7&-MN8*)MbY z-q9&Ecfv5RD>(Ok6M%fuE2CpeQo+~&`~{o39G^GIggHb>7)f#$1!+dT)?c#adKZP^ zft%b5Hecl=+|Z_&oh|-d5UC+lSbPj5jMNjNj(CJ2-SngNM>>jj+~d!{sr!%E7{GWEwUE@ z#XhZ7o#bQ8^P$SNRMSAtV3iHC3iuxC++}g@VM5HbG(#cP`o8AsBLJi>5=-m6kjG}7 z3LxJIc9{xk3^oH($-ecVL38avPAe&OG?iMra+@u&lLLp)&z|~-B{#2%wPlEj;@QoP z_DR@~Z=E!$)W%r+tLV}MU{K>;%)rB5_Dc?8Fwa(}R#V3=g*7ZWHzhpD+ zke#DFDsj&OZr3&IDjw|cT~%+<=@wWjtc6bve_`tS$TAnMP*-9nygZCi)HNkW5}zT& zYA5-;cD&^Ch(whxTgsfw+c%xhOksSAFPgqv*mbo9wzr@2PC`cNSxefh5KTHcll0|K z&pbWK7duyg-0H`D&*ay6U?sh4=#uIfTXh+-Gyuc%JA9UN3mLI}=E#1NLWGg7Mh1`}x4)oFyful~xF)`*n9B7yUha_t`i^Q0#P4MGY1Y zuT8`M7CU-oO5IE!vKILzW(qDm69M5E#PLtcUxu34tA+3>pu3P=x64Qf*($cu2}aB= znio#F#@z`eKOJGh8&93)?#`B-QzGQ`1ah{eL+JCyY~_QBR_p8zZKb}usc}v31r$|O zUG$pme3W}3Icq`bmSdKqgpl)@>c4k*YrCg)gVWE}^zK3(fxRUfX)2-CEYB8wRS~na z6vg+th{@-!NK-P5ZN_{2b!L zinyeU=S?z0(Sa)VY|c6_e24URz**fz?hhVKqq6g)x4kXa5e--{6t`P&iTZ<&j6#?O z`y!x>brEX!M>7sT^r?tV)~;#6mrTKocRnvg(os*=w`OeQ9mwdP{dG>Ht-gr5gx6!q1+o*ys8?~R+ z4#FEB0>_7U@HQ!zGKKE}biY@0eQ+s&E4H5l;DTh&9xgh8n_WGY8xpvG#qD=3D`1&r z4;f>O(G@+04dBj03d)nvd8{ZBO@pL6wHpCoJ8XFBd!=_zM_-n|VaukpLj$AU=*jGN zabEs5rxv;Hv=-1-c$vJCqzQS9RQco1KxWPMJk;CZWG`b@uk>5Ntad_&12#1i{X?F! zsiR)SvN!t>H_y*qYGKMA8j5eQT8MU@`ZF)X zLK2A%Q!O8z(-Spix2C1KCjCHo1ypfwkk1I9+c`G$@|X#HG|l$8__rOB+K}eM`_?0= z2alv61a9ujG)DYSSidi{&l*Xmp)n1y#E$N?=u^q3CbJo$jJxTZBcM(Goa0bo+Xqb4fS%Rf(#ZfC8b4^oMbFPm0NSu(dmNV)1Va z?m{e~*soDCo(NxFR40g=#YqtOXu%*C`BCS4os%U-MNl3^tn{v5TnSx#(R}e2Bd8wx z_P86EpW+>cKCd~CYWqaTOsGXO9c2|!SThg(i}WEcR2|`aM}WwtaFn#tp9hu<8Ct_{ z=GH$sG>8t{J`(PjdJAilvvn?3>bUsM6B8rq#$YQe0ES zI-jB4U}#@236Mnzi@!MnpOy|UMYyYn15*5pUT4mlpn}?KU(a)|J;l?|k90S0IUjjS zvX^rJZVB|B>G)CUqn2@S=gjzYlVB;$OkVQj){SjLn)WhWLCB*i;)aiAnWjs7(tel-9rxTm{HiA^__(Hk5@sP`{NA?5Im(0)2Rq+yEzVhJ0v6E@2s>V^ z9ctVkHOZ2{vsCK_5d?;r5u=p|a;Dx9W(Ra(p08omBFBOha+d96?3lpy+*TgPAsYt5 zFO1lLRF22dg5Ybnhb>p$P;%^b<5O3Dc51o0nvdSumT<|Lpt*QL;UT2N-h-tmCRTna zawHm?{CQb`9T?1$PoxJbR4nE^&JlzG5(n6q@pn5I^Zq@JdPPH!Z2rtEYpSV zr)csTzO*_9KukUTYe0%A5yYofD@=vb;Z)N&w~@RC7e@fos^oYPWg)VPQo!tb{9Mya zopM>3r>hVv!szeBq+AHK+syj z1&A%ROhJei*(4;Wm7u`{MT{6ozz{AH$U?|QmiyhrnQ^}P1HNbKOz#lK#mh^bhwR~?WeV})LjdAl^Vs5E$-6aRpj|4 zBh`XZ`8ZjLp4ZNg)&HeBr;ePWA~sbKnPv_*_}&VSh;G;ASw*m+&)uZ3_F@Lif7Hc2 z;`E-h)S>{=a)iCf|G4X4j;wTbx8GU1+#|`=`>#7UI_}Ez@W?vy`a+ofuEV@;7iYt1 z=aM*s!3hH=44gU9Sq&nbFmS@a2?Hk#oDBK@kv8ZTy26q!FT4c_r_mkHHf`))^ubG& z^=km^zqSG8?o@hCjq8;C4#VT?To0SRyy@Jk&7&L{s?67CbiumguF84%g5i8i-6jXh zH+44zz6+a<$O$}YcTa8|in=!CIu*$4l*N?!wlCQ5@zM4LSltT0RNl|pk3BXnsal-m z%A)xsyGAdsJ|$aveqqAG%$+RSUq_DS`A2#4Lce)E;x&?|vG;^*NK@70!FGdEjK)u0 zU()Xa{i5WnqWIBWquWLYy=p_CE{TLB*R$Oxy3@NG;2*SI4k!`aB`muL^@)Wcv!9dl z5YQ-Db{~iB#-3WcwVM$O{OptJcmzpzXL9LN!eo*^ru*%zx72>>sgg&b-`M*cJ_^m` zh^VN%DxxMpc(@Ph9?ESjS60Dd&ug-N@?YKT!^Xm}){Qq8IEKB-J~6f%b;dZ=2NxtY zkK^@VyPlX%rw`($-n@YuG(~0Zga$gAGSyx0KACl)cs{%hyG6;7UzGDAZ)gEfNfec_ zqoSZbl0=y$JA?cIZO!@{6tC3%t<^7$;4Xh-aO-i@T z6NHtSe$o!bgj__QDUuQy+Irp-m*^+e3dcHs{9-Aoa1A(iDx5)4wv#QoP)xayZTL~c z5AVuKB4|GAAu??+nWh{`M9f|t=y~B4c^EPNcqQ*}T~)h<)Dw%|PqVRkRoiOlw<2XH zD^Uk6vwOmPn5HsJ7^dGaOcCt%R)59&1-I!R;WEcwfQ3uQ=c4gJbW1hMr!qOm z7GW?8e9Zcp0G@wahJWt#6T&n>+*8pQ-P1Y~-J=hP<}qNK!2+?qnlDA^+h=5d$F-K? znlq+HI@5e-B1hqLQAkgCW+%;8rW1=B0+oJF*g$Jlo@dkf1 z{rM11)RZin#I-Rp#CfI3oq1tFH}R?(Ij@VNFOB&y5B?WuUrm5vCYkm?ncP|N33BRu zBMuNG%Pyd4k4eJB6t=}|8(S96;CASy&Xu!5MhDGd`_{vtK>Mz6MW%lA9n58V1m07M z$SjnulMSKf3T5q$;y8wQd!9(q}gJvj)q+bL9_T)TA6n?+Vej2XN58=F$PB>7of ziY^)~kbH|>t(f7nE};(b_3|fk>;f!UIKhgZGwg>ebaZJV7MzxkHL>W*o984yPW%h{ zy=PF}+Vyf)q5h`4F_zUeX_4nXBd3$BOLdp84>xZ=FK$!$^S)MeVR+>c+8dguM4OB> zD+@%{kZrX+12yVi%`u|TFAX()gK%48?ja<$mg5*BQLUL`0=E_k7V;aF-vxNv)E%-A zCg7 zFOQ^^bnZs5J}ST0N)Qaym8aa)ERyk=q&r4^Wo8nVWqsnEnS{*2apH`UPo$t(DDI_$ zrqvbnOymp8Ibl+a1Y8yt;Ei}Oef^+9FOPq52kWU4HzVeBSA$XC`bs0G74Z23MFEw9 z4>#G96ltTEdfsT85OTjJH|7~^!IfSCQu1JQ%1YbsAvG;YX9R1L>4kZwjb$)o!R+M* z1uAM(w%!0XYriyD@&$=}6-`lI)+~rP*x`p9UJU2vtFqTwR-y_do1eQq)l5{acH~0R zwG>z3^{SvK{A)rl{$A{*n6DQCDMI}L`zz|c^EzJ3wYkq*D8VRiahr{ImA8jC@= zmdUKiy=5xj-_+z~zNnS7gpB1Uffo5d+XO3j(X^4coDpJAy@JOJy(8=#t&*>wjEy64-b26_ zN9)E{_IM-J&*UGFnz3Ga)MySACZeKcKdouNT{|G_q;A)G%7`j%P8Ic$hF^?!mlV{1 z6dog4HomeP-Uel{gH&*S%WCbIkM?99xp(SGdWGow%C@%xHs2=x1e|^79Rm{haTus@ zUD1B(C|rT1Fhm?)BIueLM6U+*Qh4X^p&EEVBx^hH^g&;6wUl7hR)_`K4|0Q8TLEU8 z&HWY}tmN}9)G_}+oX>5qy9S(7^CYH|Ew4$AB|c=}dHH@@vKB!FZeKugnO_CjoR9R# z<++Eg#&h*#zW3j%@}^E0XrvzYI_q38GMijRY7V4c3_^jmqse&k!&&%31zb%~f1z$A zjFneKb299avgeMAz0mB8=vG{iiYdbC@GuNB-zHJ?usEjOvN)#oJmLO5Ub(?K{5@af zo;eYVCQbw53lnLv!0E(?+E$|g%4vxcDaMf&(b4dE)N+3*L$&qL=+gEbOa6#*yR?a< zzz6N`A(7E4PZ^gseo}6|sr?(dxhMaSaiY@%~&RG>NLb|`|^xQg#@pAr64)8-Ow;jk|b}@=g$hT zO+SUtn~Pul@DZ-aD^RAQ{Wy3i%@)@klP}pSnePEgag3P0j7fQDytK=+>kN7qQL16~ zIB3kTQWw@{;>SQ-qM!}cSh#TF84wF6twKoa=W3XRnruEbi21{-Ga^56jb$&XmzU3{jy%m<30xU*af8$I_U-!Rq>Izs= zMiG!PX)m=XqYmSn%KJO<<#YEZyGn_?2eNHp~88V~Hup!8@1IS8=Z%1|~8obo+ z(YCx^S1o#U{z!GMSNjFtjwmOV5(LUB9Bz0$7uXvY+r)aKf>b+4KTHx(x+Y%yZ zs`i<-umI_^Zeej=U-Sf&aQ^YwJLT#Ye%f|AAh=Z7Fy_8lYJ0Rt262Q&8BRsLTgZ9s zu!JVLjsr-Ohl3f>s2tNQ_G^4>c2yMGF`mnJR;ddn(pmZV9X24X2^-i{V9phG3WEA%e&}DdjOiCX&uS_oNrd zxEtFu3^tR8dMeQU+!j3DQc*G@e%Pj zuu3!1cD3+0kKNdX_^1VZGW)Ffi}bcml@-vVURbI-C2V$u`4M0ng_5Hg9}P!v6kgbX z+`cD-5j1wAvO_kp2mEQnzY*vT7@M{`iZ_QwX5S?}z61Zma58(Ai2*s8wk&xVTB;Kdf zw=M)BQfjRYsP=C=bd=$W8UD&g>BZ#U!71C?nzrBaXXqbKwKqmr;5S~3%v3yMja(-J zT^L~r?Z)^Kbd(SdB$g#a%a6&eJgBgg@tKFekfj#|m=6maZu7i{dNZjF+sqzJLuxEF zZ5$Grss4nQnT-4;+jrRP`%r$LBzz`KflsuE?{%v3bAUBMO%0|;8~VN$w+Tq+E0|jL zef+`A-3;qi=r{~Sp}X8jhh|Ppv>29v@?e%fD)(-4&ycodEL5xv;749nU|JMy^?-0B zJRQeIwrg2X{SHlR4a2atK+4?JxNCjP%-H?($xCk(h??lDnd2fTrox) z;WH65({J7kq4f!R1Li3|@jQ~Nr#+Wf5RZUdHRh_zO%qvzE{6 zbp{t9)7*d}4H%otyJ%$b!)mVKru^^}sDCI5YrCf6=%(adJ;ZK+bs-2z7lKUmV`%O7 z0KYj>C`9*QB_vZ$Ln7C_eyJ(jhsKo|Ss%^R}*jtGa71$km|3I0L`04alQcJd`E!o(bdwt5or zhJC9SKz7;xw)yOS*~d2*%|zsEU?ldxwA{|D)u~AbP51KPTDIq+=chkhcrYd+VyBG06^X^FHjx%*Khzp>h9mW`*3`| zq+lWai2Unj_uSsvk{=KP-5;Op`g*RaAg(QSE)yMbuDyS2_v>{;h_j(#GAP{UzGYWM zXt+(NPi;t9or{6(aVMMY&CHTZ;rcA*es%Ic^QCRN_v`r7XO7bR4g}8oc(m-Nj@Ux7 zlq@}g*`JK3Y8}qjohwrqJ6ZD~>-afT=Ucz&hKK;HlQk054BZO87wiPlG6Y{ZuWh{% zufN#@Vr0ihB6astw}DcfJ{WfLLCI9S8Tg8hH}pUYbtT*y3Wez7f99_{xO1gVH1%6E z!%ILg*x>xDZMV)tbU}}tpoXifv@_E{dMLcM_R7y9&wLU2_X2D7FUy|&0`uPs^Z!7| zM4!tQT_w7G^zocIbowP9ngf(6%)S!s^z70*04Y0-K#Bk}ooM;itb?dMtMTyLp68G{ z(FLU+vCDkDmUc974a!cud0;dAwvKg5XX&m>P_~Ess7Y(2Kj%q6U=2Iach_z1&_Dxe zn`Sp@3~C3kH-qL5Cb|y!v7Rs)fhVO=@2e4sWHIe(n?#^lv;Z&Mf-0`?Xg_+Akq;Tb zBU3twC_Lg$$}3vK31Ts$iBh4GF~1?T=?&F7d%4%;js0AGuP2`nM|5X-V)6-Ajt)ai zOdzaYOD*rXb-iq?cw`-)Xo!!(A#T}Dq^3V-X-=QWNTcITB$Dpl-iWJ$Tz72V@5wg< z5v==T26@(z<^E?UFV9VIPWEv+NCTV>Vz#*x)iXh(`VC;QzC!(JP;r8Uo4>eYQuLC9 z7g&dz4hC6RFwCp4$vd(-;o(LBi$p<{ELJTw@_~I?amw^m6Cxncs1H#RitoA?B5Ht5 z1r0E{0|tHxE;^BJZmGmGwMS{W5wj2A_LSCYW_0@+&bgO19P)>Yq_(T$eZoI7BqOWg z78b(S4nmi-2o}URSNwg-mFkux(meu&d#V!aw;f}?7F2NuSR9^AX>ue@Xs%@^+w?z8 zBZU)8jtP8yBp=;yb#h)k6JI&<>8 z^rp*Dp5R02!guxB(FM?6D?62{KGHW8&Ag6 zCpv^HHY^Iq5nEFPNfqRdhpA$EUX&$hD_uVMR@g^Vb|3N|eYcU9(`8+2@D`%c==X&2 z?uwI$s*B5(EjmB3fnQ-u_X(OXWjEvxDQ-{A)}*oG=>B28ZSF>7uC{X3Y--uq02}L) z4f9O`i602yObmwGIhd4)xA+S+auw6D$3IubDCUT*a9hh&OF)Nj69d!Fe!O$s!(#1Y zWzo$*23N}bW7L{#HvV`yT=YddS4CSqv6tSJArZ3^i|xg#157%OC9zANGYi}vE2ARr z{M-8sMC!;9oc-Rx0%m!I$!WFx^2Hs~Y@N}w{gtltnAYo%CDYQ+eu@&|GAO8#wH(qW z-Zi-t^Cl?!=REJo*^p2|-5t37(}0ACN7Q!O=XYrv_@-+;W9AHg;2%@Q|`m`M5Np4i-#~r=RIkX8J+nkt=#Jn+neep#$nv zz5C4@jf;+PGU@Y*f};ci!JMCDDdfl+WC=fjj*Jd(;6DS4UwlAYEf8*u!WqL1PL{f! z$<&8>cahHno8VP#(z}XxR%5-bXup$)H}>Rg8D{2F$GD~~X~{LpYxDOHG_`NtQJLHE zZSBW>s67Z~s`pZ3C5F#4Zekt#LpAXaX`k~cbYNuJtntpYpJYg~9AO)y@7AT20U+K2 z+3B?IBn2UZtk`yg_vqc|zO|Y5Rjt9vS6`6YZPS=6`ZUa&ywr5~1@4(Mq~{lEI6~Ir z(_LqaK+j$j(jjx$P>M${Jxm7knX$q&IW)bVpMq%A0-5udF+7YYAKERSO1EUWS>+th zGnJ*E4a1q~ZQ%QMpSdXrQQId!D1r9Ulp@FMzBxVNff9gg#;0xO*G*Yg^Bn6R2;+xS z8W$BSsaFkUE*1t3XHEfr6Z2yJ|45j z6YUCixC9Z?XSlNWVEeb7v^G7%rGq@y^t^qsgzflnkunH-GapWY_o5X;jbVlEh4JwT z*M{gT=B5gNT6pkkiX6L}5teko(unN=7E-1|vFWPGO}kK9^m*5RPOD?4+2 z$k}rcCXvzx*^STv-dI;l)RxL@6HH{p!c4G|fV%o()IH1iNPt)Wxu}32egBh#dMur~ z2A@xt*<05AvVOoVLow5sG;w?%Ij`VczZYRRzl1dY7ABso_`p;uVq1@~D1IYRq7VYX zVl6{yf!c>kyvC5vACn03zWXbFmXMl!((I@jS>Kj*97C78%*_Oy+k=gJil|o=Wu^3@ z(fKh;`{!P*x6Lfhj%So_L97FLtPydMhJZExWaiHLoAth(v&@QC!c5};>HH4Uv|U|C6G$wyW$JpP!`Qe6BlM8 zriCTUkoGkb+`018lZyl7Qv+>0UNy=xYN)C_Upg5cuT!NRO_GFDTL(7AH3qd{#p5k# zg3mEDujDDyF2}2lHE1LMbAk0F(q8dPg%C|Obp`u5x|y#@>4fHBLp;%Y!G6W13gj|B z2?C>l4WNp`dtd#I4FNy@wzgD*2^?7c=yOv&MYa2Fxn2PEQ_&aCU5UX#LT2F7>9xh6eBxybifc?%Mdn@+fFZ>Bd8LUA7 literal 0 HcmV?d00001 diff --git a/ui/android/app/src/main/res/drawable-port-night-mdpi/splash.png b/ui/android/app/src/main/res/drawable-port-night-mdpi/splash.png new file mode 100644 index 0000000000000000000000000000000000000000..f9b61024d075dad1c9cdb9a9da339b039346df67 GIT binary patch literal 6612 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 z�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

6t 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 literal 9875 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 diff --git a/ui/android/app/src/main/res/drawable-port-xxhdpi/splash.png b/ui/android/app/src/main/res/drawable-port-xxhdpi/splash.png index bfabe6871a17a5e95b78fb30d49b7d2b4d2fe4c0..3adf6de4b3c0189d9c4ab1bc7adba3da6a35303d 100644 GIT binary patch literal 18201 zcmeHveLR!<|No?@lT!Jd3gL7*)hVG!!kA7sPKQW$lG~Gz7;-l=Hl>p~g*wF&wn{~X zk(k>pDPl3X8_hP-jLkMS+wA^#sW_kie!s`>@%`ibhdR5j(9>MtrkkCXoEJzypd4W3qEgMblRArcg1V0YH(m2!(QYXMl;R4k ze1f8JHbHCA`jqi4z)hDO)wr)%IL`l*cdX*TXIf;}%M}(k^VL2QzCCo_rHKwvCSJsP za5O_8m~<<+$_<2^@i1mozXX?uo`gpW*)O3aw%|*4FY_6qQ}W|_AoBjJSzI+u zTFDM`zY1*rl{|Z$$Kyy9OAyuW@$PU#{6_Wj7q!`^&=q~wWZ4eVe zM8!x4VA3M{9GOfuV`40PPC6zCIo@NKM8#_6&|h-&!-uym z5gkrBy*5Yvz;(pwcKu&t~aEN8QD zhjMBSOU5bWn}oUCLWyaHq;)D)iCIEs^0-UeWodz#TZl-64=^$?-d0dh5TsIk6f@ZO zh{-(+6Qg|mjlgMlV#nBdxq&FG7iU`+`QSsY4Q_)(u%Far>Sh5OjQ5bfquE4cPM3@6 zEs~AP|3su{%*1?!jQX?AyZca%lFs|_>w9U~nnymOs^e|9Z>)o6k}q{ZcAhvi+D={l zOz)C+YHVbNI4=J0&oW~+;@Li*kZb4-gd!ir)QdJ4B>5oxY^verN?FG3rDEVay&&sLzXk zvpPte*I3m9KdX+Qc-S*@hPhU~G1}~hXHvNb*maI^@Z1&1=` zsKn}#h)#p~E1t)%5$35HjSz`-EBhTBOb2aX4{qN4V9HMtwlcTE=$$LY21L8VOLH}} z-fspllKGZD)A~LR@V~piM}~v!R{XV|x5c59##)<@D;$XbAjLle9R8=YOPkThTT`l? zJYX2UY`4>PAWXJzMsl9Lw?;x93C8m5jM^#G706 ztV;LqZ-VOb@@i7KJo>tJc4Xln6ff3w4-_r~h;-FRW8-kuFNm{J!P~}D2=lfUe;l$s z#tr2qowC7Mki(5`WCVP>jgZ80+s!MuFzGgIq%*Tn){?jy}U-q!Ak@rbBl-+VbOpxh-fVviZFtLOd5 zoC#cMnr2d4HbG=KK0yUkzl%;TNnCMUc?NMIGa6B{MCcuBQj_p!4c`P8p?%Jw-rVZ4 z#@CA2-aq3DfGXkQ$s0okMC)JIeZUf_E|{%vV9wLx6?c{5eE*KUL5FL^pFOiOixUHD z!z{e6-xT^TbNOYJaJURT}PZ1-0G%t>EXZBaRdpC&V$m-HowQ-!l2bys&_~NstyUyg+}b7mg)m_s)Qf%4`2R~)zEP#m!14B(5w`N zl%z8&@PsFM$Sx1)sRZy9SY&8y@*a^>nL#6DMv=w+yXY~qb1p+~IXGO{+jqJiDuqL< zVqw9Dsr$SNgr6)~b|Z2+$70%jf5&5U5WZX^k z`h`J9jP}(}I2@9?Er>*+)863Cp>%jQ%nrgh5JmB)NRFXTqj<_lGiNiuo}ZIpr5+cw z1Kah_r^WZ;re>P65Y`j^ziR$_hmo?5TdL0po2-J&y+vl6{I-+MdWbNNh9@p*;2|^D zr0x|ry@Zr!GC=Uh%gJ`gH*w0icFsNB;EJ^tLz&@u1kT_eQ1tCDH3!T41sp^~DB`+AY{{bO#}Om)vr75G<0$#l z`1E7x>SyNHOV$3#NR#R*5wu3+>i@%vISx9oX>|g?J3eTJwc#C+;~9vU!Zkz@Hb$1# z_B@Py!RmqN9LsO-s^=YlP>z;pM=K|Vp4m;h4rL#>CV9seQ&>lJ6`x=XX^;})XEh?x z)STm~@vv8$Yq@O&S=^&ViI#$MXpsBcNZ;QS51FjWoG;hQCS<}R!99pH4t;2rfC#!a z=|+&M3oZ2=%NN)4w2?_oZBs18qM0N_;5<=^x0h8}BomUE(vd>POgFO`+33pbN($Cj z#cCNLA^nS7Flx5&G`<)te0>@|)qq_7dbkiG-2YvUt6o9iifEjZHPk><7K=-eEu@O=$S`ipQo0l ze!4w&=ZBHpxKA4c9Ax`15qHmX@H*6F?P`+evH~dyk`g! z3sHs9UJ3>QA|`>rf^vVv$rHEM+0=Gyps*5Yn+q!)`m8Qm?3{P@^MZ~p$ErVrmN$43 z6rJ%iz2~xJRZW{BygiHASRDN6pgkTj@jC1+&z)!k*KrwJSU z>k|(dUt2Qg>l}8`##87WC}jcqRdsH!P1(reF}n&mCD^_NXK(N;-rND7kMWUo#4B^e z%|%w9+-Z+?XNZ}1Kgy0YfG%c<`uko8mrZY(;>TyX$&6BM`t*f;wH+NLX zWG-qaUzNS_Md;0ru!?4X*$_2&dRdFT$=@d-tTfMt^1sw4f-m_G+8oXHyC|Cpm+Bh-{{Ls506GuB&; z2BZjVN5~1a^vlze%n!%WuS~I9^uFT$1`Auo1Hp~D$Z#_J>4vphUk`BM>0k6sdb{dF zgY5gCcdS&8VuF}dY;}Em048eU&!E1%OM;K(%Y&!s3|6Mh6+^3iI(U)#E+`^*HMZ^g zfaWZI!Vk4Cn$IV3Uy;>ayeqp;t(l95(j7UAJwLXPD%ZiqD7B9uM)hxE2 zn*|_cxwtLz>=EnQuG5iTCs(SFE{2df>(btVmLZ!_)d{seRP^XC>966qQ4rFl;a%Ps~ z`=G`{fmRmtZ9^Y|Iz|6sAqWX4Z!i*Th39bl?O4<3ENE^E+DRhF`h9+>KpA%5ioTXT z#lPy}yid7-#buUwRGDw&t1y=b&a)kZSM=L`v+Y&4nDaOhrvJUf0zLJZ*lj3`j=Yf5 zOMyHK>fA&{|3;CgUE!hedm$B+P_<58YEk**oWUY>}5~z z)pDtv1SOGkdk%NT;U*_1e;+^*mjrbiQL-6OFIolcU&|#rAW_k*6-<7_-ooMr)r5c` z5%--&C^>BmhC(J7jq&r)(n|aEfoING0=9J2Q_#phAG`m1fn@cBFSfS69YZ)DkIJ#G zBbsgIJ(+ssrF?>V(9Hi*`rG~WFy!Z#;thZ}(s1CbBJ&HvE@hURJy^c>LnJ8;5$75_ z3S$LzTIUfJy6dt+@TIE(EC1)Km2XW*L8|E=k7FFTOb>|g^-vT5oj?fEHvu^jXY@~l zU6*FUXY(O4T{bEhObw$x>+)6Sy9Uiyz{I%6+EERb&v+YE{ryXrL=!;anO^&S?cR+k zEt)eUfbT&K&foVIw=_UQ$BF+<2x|2+TGS6Tp^50PD%0;BS3sERKZ;;!`^!M@fBwD& zlh#kEun)&C235j!C22!1-2Uik`K z9|4!9dDD-MelQAmsex@nvf52IZQ2xsT_Pko_*Xwy{`5fQ^ngRu1u9SJx3k>xGtTT= zN-ui^F25M$o*~m$@reXnaSg9B=oI61srKYpy(JiYY-N8W_N6oZ#Q+W6Z! zZ(IG@GsAf|<4V^&n`M-48<|66tHgD*HsU!bIhZTk#^t zq1qF*<~c~Yp`RCKd|2~ajDaD4RBaIs%GkM%3U?` zJQRK!K!m_KL;$WvoQFz>+HsK;HFdRW7;AGU7NPcT1EitZNZl}p2e}$Z*`@O6RzvrD zJsPL=0?(cElhQ*NUKn`5huI*?_^KKTf37z^b5a-geCu9fQtL*bMJvjmsDH85Nq6N6 z^g9dNGR1VMVVhoVqU49icJn-`c^Z=H+-G6o&VZaE2%nj@O-_ChtNZReVtp{$QHYH_ zQKvfpa}h$sU;QuQRjBdCej?QqR<>929je;?;-cwUxr6M`Pt^_p^h}@c`Xo>r?%gXX zsld5EM^Yn|f+|{eV~UuGXWw}Z2Q=V4@{v32T_8ar>#N!mO4Ws7 zZ9sGehFsq2h630q?Sx-^Ph(I(6vZ7yhpYLYBzd%-Ybg?S-@i+ky5!^2B54J+%rL$= zrD5bGbeyNZ)#N15`4<-r>3(F;R|ncGzYZT96oVO}F8sHmc(v)sR!10@Zpgzmf8?qm{aS<8mLl`o&W z+=s!XLIuMDg-M9dB!C>rym{&IJ;sM!A2Y+lJ0v+DYDV+=QeLCe)i-XjeZNnk1*Qs0)XXiH;A6D!?rR|cBgIW>fihVPE zcW$VobU99NhKMRDD<$1qQVRK{2!TS0nsP}~EgSYc0T~YMCj z!v=|lu3+S&?I>Z%s=?M~t^xM;?dTy5dG-;Q54BYD{oFsU8@r9EF+3=^nIf^v2Sxc)rEge;L86ZVdt24HWXzz3ZfR|Mpx~>@FstWtd8mhMym%h1Ln5 zb;iXD-+JyaC(4G+f~cb>t+ zpa^vj+L7WVqF~}<0eSuTl)hx$YZkS8{>(4y3jA7+>%wJBNyPS95k*JG4Otb_czLQn z_u5e6n^=oOQ4N%taqZ?dcY=~0{b`wV)c{vEu*HxV2Z?KNyFg4{2PnY9&*T4|c6Inw zXAZ+&wq*YX+4&WzsRTOw4tP}<_%aKx|HaD9@i~B#Pq-pB$MI936%ir>K;fUJb(JqL zTkH)9LfyrFyI&BClPF$LlPOmp8F<$`lp-#GUn1dk1@Thr5Vz26({H24Y?b?&*P7O5 z1JuxqDmjBz5pIP*IEWV`D5QcAZxQX#^MXgsZ~MT1+r_d4fbq-7%1DZ9``c7pyz#$w zO|+S8&SKscnYO)f2S>MAJ+KC8Yo}2yhja%MBJ5q+tw&yb5_~R&j0l~R-9-((lf=03 z8fdE^z+v*j-&RD?xryQ1w_oxdm$w1wNOP1gw^d2LcObwMu8CHUKrYPt6k408!bDHL zQMSDv>g-vWVqj#pX_N4i@uwRd_5_83XGlFZv^L*Jd$_>9AzhfWy>pCndDaU?i zPd3Wk8mXS?VC2BrLg9aDB$)=#xI@!nCP-(mohan;0lNy@tkee=mQt8K&gOn690{Xu z1b}$Mt>i>=WN~Z_pKehNo04}gy`<2O@}w1LgbQ~dTQ6}PGCEB1yI6xjY~PS;wb?VG zqwN=m+d;h1|Hg{Vq4aJ$ds(Zb;n|1Mi+k;iUmgFUiRDPuCJe|&=-egDG6o>Eg(f#-d-m|%fT2&n3lEHC}&L1w>YJn0fBe%I&KpOJk z?0=&BH)`KiU6NUAwRMWS^Cbsn`a;Ucmp`uUVdbe_3b1C#ieTi{fBj?kb2TqCS*9u% zH0CmZe(O+M=OmAxOM{2Tu4ub{w4|a*O>C%>R~8rR?p5jbEPC^LgI0_Fi3i*F?ccP- z$it;zAN19uH9Av&X>I@gQL;w9zH86!j|m^AAH7BUE#1XESn$iqU2k?4C477wdS{Qv zw)2eyrJ=j9*eWFWm;0|S4svuDOLoX)$59Ah!5yPXZ~DhQ6SgK` z`S?i2OnOX*iA{s(K6B>82oM&r0PiZQ)I4{5HJHB)V;Gn`Y-M9XuE}?~&RR2MwK|LX zC!F0jndGn^acHXEQ<4`W+2K;g`cO@i!u&4fOMb+n8V{0!PsOybHy^dIt@wzL{lltx zNWnO)OV6Z<5hTkgEcjEpzlKgHK*JyPt-RHKa8k_cj2WM@A;!uRXx6y(7JFfG!jOJ` zh~;iPZY8$%H!$lUF~IFFUQQ;Bg+xo?LiY5JXrm1hlx#FeUo4Iw(`JAe@&(x91uke{ zS}``vO)pnTA42p^s>eH{v*KAEzY#l@`UZ;g6K;0<{NaGxLzK!q(_4(IV-#dvNBCL2 zQjyv?Oc!+I+ZtY5FY~?PeKDDbWnEZ?WoaUll)bstdtIbiV|9Er=K6rw-wrn8vJ#So z5mq)vMf*O(+9JHmYR-vMSB$2Bg{ksO)=Lbc1U>e#fX@&&5DN(5^ zNnOJ==Mp0Ruuc_tCWm)zDHV6{YhYoVb2D_AHqMA46L3k<{2G!_;XrZhtGfs~53pm8 zFzxpd_u!iov_4m~WZn!hf!Gm{YUoHd%*SS>aX+NPR&qJ0W$cdO8SX#p=>ukoDlm~T zIK=KsmAn7Nhw;6UX!tuAFQq}ei(aDX1PnD?J7ez@-~Hiq-YzhI1tv!E0+!wcqwg&x z^4iK-ZyH8y$kdGClJ3%4bNjuK0ii-gUVeT7zN#vlwZwu{De(obRCbuQ+^&n*z)-TC z-H@iIdwbqWINZ8M{fYY3vz1 zn5Z>Ao@t-R8%f957d{eC4@g`XBaa%qNfnn_tb7~XG;lJcr1RtmhROgN*Q%@TWWo|h z%QumF{UlNqL){13{WaVJWAGh!tgg84NXOtY()LpEep?{oeO5+=4IwVjMhJ^SGGELrbQKB8Oo}Wyu95IVb5LJ(| zO`Aud_DnEkjM9K5pLXPp(k}X*c(J`tG4e(XvLkHa-nt?97-m-A*MS zz%p^lUg*emVhv)MKz~RW1H^NJ)YzUe-s&55v!ic59z%pry{sIuiC;!Y$Hw&wWAp_& zJ^Js3Y9+@;6|U&skE$Qcm5+JyHq7Q0SdgWg8JRRCX0r07X+-(h44SC!W=iYbA+^at z5+b%AN#y$G;Te%gx?)f&4Kqn)kwBfm^vf(TRKPJ{E_*W5EjRzkdv}Q7`qXrJ(@0^a zk-i$4gb3b2rscr=$kNvGCYKqo&tmfRy-tL_pi8%tuBObuCPBvKsbpLB$YMk9L zJK*yah??199TE#P2N}CEX6JjlfvaX`b(k@rl-ZG>%J`J^Ex>qB86ZpkG&`yzum#N} z&&@!f1o!U-u9}_Hk!}FZ;YRZ=V7MpzK9FL-pw6qLm2(zZHL@NU&e#J?@EicJ8wHVapb+2Z2%+Yv=&)8M_Pu-pBUSK9D8|bPKRP2=x2csjy!FyMjP#fLK_# ze8DmcL9mb>3rMhlkqhNup-?Vxg8yH(MEB^t1blKp#q8$-ED)^)3cA3y7y6KemTRFI i{a@a9A8J%DGLw6`xLzIH2Q-49!w20Cl>QcQ`Tqb|mvnak literal 13346 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

VwO4Hu8X}%XHUAz_J@50rzbkIsat>4oWtQt< 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 diff --git a/ui/android/app/src/main/res/drawable-port-xxxhdpi/splash.png b/ui/android/app/src/main/res/drawable-port-xxxhdpi/splash.png index 6929071268eb03ee0f088142b6523566b78550e2..d6fdec7244a8e16778b01600c4b0d147457e6642 100644 GIT binary patch literal 25463 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 OaQv9v(Y&ACum2C6veV80 literal 17489 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 KR&><$`~L^lv%S~= diff --git a/ui/android/app/src/main/res/drawable/splash.png b/ui/android/app/src/main/res/drawable/splash.png index f7a64923ea1a0565d25fa139c176d6bf42184e48..34c86a4aef5af93796783bb30abaf572f7eb331c 100644 GIT binary patch literal 4397 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 XyOn+%7f`N3b2T^T3uj5+eShz7v)7qy diff --git a/ui/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/ui/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml index 036d09b..0aa82aa 100644 --- a/ui/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ b/ui/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -1,5 +1,9 @@ - - + + + + + + \ No newline at end of file diff --git a/ui/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/ui/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml index 036d09b..0aa82aa 100644 --- a/ui/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ b/ui/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -1,5 +1,9 @@ - - + + + + + + \ No newline at end of file diff --git a/ui/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/ui/android/app/src/main/res/mipmap-hdpi/ic_launcher.png index c023e50595074292c7361183a64de08cf9686c9c..261f759f2810eb3d6c4a2cb7468ab478de7514d2 100644 GIT binary patch delta 2237 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 diff --git a/ui/android/app/src/main/res/mipmap-hdpi/ic_launcher_background.png b/ui/android/app/src/main/res/mipmap-hdpi/ic_launcher_background.png new file mode 100644 index 0000000000000000000000000000000000000000..2744ee04c8c8ef7c0ec54e46fcb4a30e5149c5b2 GIT binary patch literal 913 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 literal 3450 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 literal 0 HcmV?d00001 diff --git a/ui/android/app/src/main/res/mipmap-ldpi/ic_launcher_background.png b/ui/android/app/src/main/res/mipmap-ldpi/ic_launcher_background.png new file mode 100644 index 0000000000000000000000000000000000000000..f4a4ecca2243c0fa046c68bc0f584b196ae57b72 GIT binary patch literal 333 zcmeAS@N?(olHy`uVBq!ia0vp^fgsGm1|(PYdzk?#&H|6fVg?507a+{IwK^ypDEQyg z#WAE}&fCj|f=3tx4j(wcXX;pKQYD~yu9Zvp#>DyZ>)-xO`M~m{u1~|ospO&ORF96h z@QBWq7p09L=Jjw8vl1){W)^})!$6{$U{NqL5iA-C5{(3lf|-F}(GZ}hsgtVEB5n>K pUr!-KNpV+008o&L=7Qfl>NBIx=}ud0y$u)?44$rjF6*2UngCjEdmR7( literal 0 HcmV?d00001 diff --git a/ui/android/app/src/main/res/mipmap-ldpi/ic_launcher_foreground.png b/ui/android/app/src/main/res/mipmap-ldpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..ea6bd7ca43ca01c36d411162471ba2c861e18cf7 GIT binary patch literal 2878 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 literal 0 HcmV?d00001 diff --git a/ui/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/ui/android/app/src/main/res/mipmap-mdpi/ic_launcher.png index 72905b854cb4d39e8717090424302e370239a08e..f53c9b914c52648dae0b0e4c633621f6c32494d5 100644 GIT binary patch delta 1176 zcmV;J1ZVrr4yy@}BYyx1a7bBm000XU000XU0RWnu7ytkST}ebiRCt{2Sp83vR}^kG z2}mhWp!9<&Wwtn1Dj|ysC;~>enGD&MO~q+8P*|MXfL17dYb%(=-?k+zCX4aMeMCq2 zhzx8gjKUahQ#4@%N`Z-tWxD+j&vH&%Que{fOnsSoPjYhKkAJ4U&%Mui&T}i1Ng;(4 zQb-}i3gLG*LClmrXh;Cu(hfXW{FfD+x@N;9Wp8kty7oV*fr*|*O!U|=?XhFlD`2kQ z!Q-^s9(>npTblqTLo2;7#A9VZSKV}I9n6E++4$jaP+&BiS3+-5@c;bMM&XYdSvezhQE(FDMg_X@b(WyPVg zd?-`XA&W_bA}I~VO_|8eF(BKZM`CgsWHAbU|LP0*xY=&OPXmrsQ7UQxs89oab_6_4 z*k785IJpvPjTXlb?MCOvCvdaFg7K>j80)m4`(h2=I)AnYTCEnb@?;cl+k#u2R?K(> zrj#fEX!VHKr;hD`>~RIOIvqZAyn=h9&6p>ecm)Ld1k8Hve1GqoW?VX70e$8MtWQv) zqP&2g{~MK}xC2d?=@an2{blTUW(%+I{n2Jtn;&}`d17HXC1v{I%Le@Z?K!m6mLWMs zg>R)AfwkjynSmE>s%B*R*55U2oxuuZv4UX`va@V#{dcZqOL;*fG{& zf$!6|G5q;E%X09OQ@GV-h5h7y#3!V{{PZS#-+x}u_3}^M`k?`!B%1s>(hSS-eTY{m zk&%%BjYhjH)fx?SIvunc9T)V-<##bR;9%N`4uF+u$c6LPa^#t_QCwg~(T<#@+_gQ2 zpXKHlp-R^vOTQ5#muoRMAczNmww?<#f&$bZNaO#URK!#R?^zEZR<1;@$-wUvRv0Q?qSIYpq?Hh`;B)axpQ|t9 ziIap@9xP%yiE1Tiyz6tafuqi&rkRPi~0==EJ&J-%qIM8$!8q^i_dFIS?Z z(2Vi!(_HMLnYl29Xe58%Q1cwLIxW*lu1JN^pvP8|0fr|t`Tnt(M5L+IcWk>;}d+aDatpY=12*yw7$U(lq|)XIMDbbKv3b* zX^Xf{>O`t^qrIN31F6!|kuqfNR`b37huw+8u9L1w-{<;+MNIx^O&{w0kILUF{wSnO q0^pW*0HRVz3Mr(JLW)N^{s6{DZ4tKnx0N3N0000xSd#Lfy~3D{sKwzH9i;2=l{N}m08$9`|7XWGqI z)35z{dV1z9Msf}rz0&LH>8Y--x~jUWXWqPP*HwH8AzDE5=YN=5ni2eZqN_-e^~<9V zM0*kFPS725L^Sszn{0`~k*Mf-?+-_Ls5GrA|TjiqtEUz;a~ z4B)YeWU2{5J;V#2LwErO0uu?Bc|lu|tq<=A*A4d(QJ;rrdLP5P%&YxA00w>ZUnms5 zfN0mn0#ME}F@G^}E0~Q}n7a7qn2FK#&m(>cOzrX)ppw7{Rq~#>jp$WHv-HC!sf6xo}_K3q8Od$WXTDv06x$h0CPg6`8c1@K_CRju1vsF6IR)L zXf-NkOn)oT5CEGKSD1wyHYvoi3MKkQMG;OVRO-UZ)u<{l4<~471xzO$VDPDL7 z!grnI;?W&ktit$0IV!vkplKf4bEDHh<%Zl|OUw{I^`ReFG5RaWP~8QD##3 z)?NVEDM76J31%|ILc-4)0EIBpyiH)UkL*2l#TT8!T)c3g3gYDo2qjnv!hd;+i>G&U z@pumxj}ZaH*5h1EInlJEX#iw4w5=y;UG=FrPkomrx!7QUc;$O84gtiJ%SHETE|%|w z_J4PA@kFm&h0Vw0s@S4aQveua`O1dE&6sY2IG6Lp*kssYF9Ss9P#DCkKXCE!2-^F( zcxn$9Pwtkhu=%)LmADYA02B(v`T-!}3he`NAkG!Icn5-h0wGdU;c+Q|_`m?M9Kt`l zkBeva%2n8M0;|G!;yw{1b}&CmC7RyIY=0om7k%+AOy#v-xLDC|2QiNO_YZOLq5qd7JpfK-e6i**Lguew5Mu_2Oo@y43=l7&-FJ~kB2Hu;k5U$g`;Dd& z;vRLWPeFnr4FKFC=6nQ1qAto>DaW{={q(v62e(+WK;&y zO1Lb!k|G;D1`zA(0FknUSV}u+C2TAF|D+O*td5c#j$--Nvs}C}5H%;$CoWqyyH!X* za+AzfVm1%Jt%NXJ#%U&IyDxCD8h@I7b1({Gqa`}&o81Z|bEnc#^O+R@CQYYW)cbZ2 zB>bL#kc>g2Z^N12f}^ekt+s^Nlm*16M|^Q&JiaK>i~5FkVscnB3Yj2W#PNNI=N(5N zFaWHAM%RG8{tGre9(8OJ1PObk>?KxqdQsm%7>(b^6bJ_4_x}sWg^jNTfPXc}bJl@& z{EfuSla6f*u?mDPWKwxL>!RLf^Td2G<%#vkB0B(J-4VG8JI_nu%@AvDcAHL0&DW~z z)J{C>qCR5xh)h?I$9#5H0wC(W5Eb4Aq67b@v$ZQbRn)r-frK?v)cbw}fLZcQB6MyZ zg%e+t&YToxPXNS+Sg}9ywSOx+I@D5UqVm|W*`nUli+cOfN3q02$*EnylNPCDWHl-~ zbuy=F@TTg4Xi;B1F|(~kT!^)$2P~noQ)UzJ)RMVb?ZmFyiOoYN)D(bRg#mYDQK6m8MTL(8k#uItLZ^L_r#k2|#?2Hobsg>w41WyVCyRP%LQ3=U zpv#XHK5{Zw&z0HOeWK#T*vPuOyB|yf5PUS)zJ2@cs0T7Gqa4T!K5(dy4-}K> zqeI+>jF}G_03K9QHO5tWvdH_DQ$f0SA)Cl%bJ@<$&bvv*g9i`JPx{1k)9C2vS71u- z39>)@0iI_2vUKUv z#lyqHz3Fs1m&@miS5%?Z)m5912J_ z5M(;cFMY#djdX;%puD2NpAC(?M|L%q3Vj@v7^FdRLtJNdkowB64`hMKfWgz%&t;uc GLK6TjFw)lm literal 0 HcmV?d00001 diff --git a/ui/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/ui/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png index 8ed0605c27c764f865674ab0b14c859a1ba29ce6..a33aadafe7e9fe2dd8ae278f6e428b7e52843c77 100644 GIT binary patch literal 3824 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 PA}l~x(@>-49wP2P8;>;; delta 2098 zcmaKrYd8}O8^?iy8p}St@3vcll}lY+S_`@jxA1{ zk5oh{0zUjg*#ebb{Fnv8^yF{$Zzp5FNbg3$wOa}Sj?LO0K>F*>ilAg|ofO}gU>MKZ z($bOeZX$A{f%;WkR8?6Ht;~N6o4BM^ zbx!4hWfbg6Ng_zXMvW*(r_5@+r=|X4ia1B=fI+wBQEk;V!-5A>59B{6v8~Q&Xh0*)Jt%$3F|8*=oIL93^`kJ zHE4~*EalQ<&8FeycBkN-h1@Xtec7_K6kEH{#t%zJZq$LL8rO&0SmxNh4`snS`Ff;~ zB#gc8HXwEr+|GGva;(NcP9oQTcQea_JXmri1nqsMJna5|xg~srOR9J*55P+RoUqO% z7US9^)mj0|?{6gT=M4}WaRThZLZhQ+WWLbAPCSNZ(y1td1Bd(Hx@gniG@0eOy6N<#DiVCC)-W@E8S#HC-_A{W%=|e0-Ie z`cN&`6!P4tH!;%K^kFwLI4(AuGY?4Y)(sU}r zSKyfy81~!10p4T$CtEwtOD;^#M^1JQ?riV50N>9fGG4R6X-1UFWKnVqCV=yc^VzQ; zQ-f~DJ(D_M@fjcHIXZx^j9KFxY4{U!u1ZtnEcEKrtW8;^|5u(Vg zWg@SGH3;}1+lWOjS7hqfpSHT{m*^)M>uR?-+q6X!9b-)w{aQo{jT+K-Iisn{xI>d8 zz=OM0{R@w!Rjhm>m|*PFq+~t`;$)xAf$QXIH)%;gRb4F-E%4Rd>vGk)ew0#;!j85c z(1J+>{7G_s$Xin#Eu;k2YK}mbx?6%tw^jG?4ET|^+U2C+Vos>+FSQin$=LM)2QV@E zyfKEU*B9m1ub1~(ML?I+$YI;)mZ9S5+!Sq5f^eCkx zGLP@N1tK82i-V{u3m^Zo0URMnSW^zDsrutW)i%u32l4&;A@$Y@ToI4aHHe~qfvFb9 zKal1kf=wI8v)T^_|CB2xT6k*tPwWF z1xVU)BlDn!Ud$CU2N3#3ako@BwtRqaS+aXMhYsJ>gDATV$ij;w5eDY0bw|MO%&k1d9 zM$fI6iH1jcBB<5_yIKh4QpKSvGj)RniBa?_YX;e?Xv z$Y{D``qQpwfG68Er>L-55*(@wgscxN*M*GF((I6~2JzUYXFgC75$8a#-XZ@Y5wZXe#bnlwR{&02UxjAaEbmfW^UJ{S2)%+v2;@N0=|i|SKZ zKc-(S&bQTSC0jw}m@Ld6d)usy;>MVwML=Vp@8OI~M&78b%cn`@rS5CIx;eboJy4wH z%-MLCP4l(SvxYa-3h!B=e;4N>;85(Nkn8DcuJG}-`TlAAosE@(iYXxt$>u}j-x69W)lhz`(j&d$N$W-2blslQ9rLS<+BIhFe4Q+hq5E)IWyj%3L1{*qb^oN@I zxryoi#hoJj$&BrbA|5vjV#?3`nx?9;ttN_Q$jUmn3F^sjx*v*^=WDbkM^?7q$yae) zjxJI5%6Kug`=SC|M@D*>O5p|3${JV*MnQkdx?qNchiaMb6f394INCfMxmul!XKaRl zm%RY>@gN|47Gu_Fi@$ZK9axhJ2c?aq{GNnDFrNt#EP>O)eGYvbOnQ^3gmbxuig#0z zp-w>tg{7d-mzHD2Gs(*AWW4l3mh!Peh%)ebd-wBnc8_OAgbLzT8c#v?Ukv^o{-?S4 Z%xwT8ERBvBmtFwu;D|bFUuzeT{12Z`{Ja1F diff --git a/ui/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/ui/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png index 9502e47a2c575c50c925b987f397bc5244c57b90..fd3b881095ef95248d80a7902427d774100eb08d 100644 GIT binary patch delta 2107 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 Y55J6*RCt{2T#0j(^%-WS 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 VZctu{6DI%w002ovPDHLkV1hl;b}0Y= literal 3981 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 nm0GElTB(&OnKI&V600000NkvXXu0mjff+~0a diff --git a/ui/android/app/src/main/res/mipmap-xhdpi/ic_launcher_background.png b/ui/android/app/src/main/res/mipmap-xhdpi/ic_launcher_background.png new file mode 100644 index 0000000000000000000000000000000000000000..cde65557791bd21ebc0844b5bd5a7166d73507e3 GIT binary patch literal 1518 zcmeAS@N?(olHy`uVBq!ia0vp^H$a$!4M=t>=)MI~oCO|{#S9G0FF=@aYjsdI0|V;< zPZ!6KiaBquI`SSc5IKC|Am3I;$yt0ym*`Zn3m5FW{d#Bdfkx>Q>U?@hN1w8Nn#tVA z>65VifJ|figFhD=<<}&zq+Dw}z~$zUCd)C(8S-IpU>$R#Xivi#D}jiE94FR{az?{o gG#w0JUT7A7KGkEz^sLTIU;)nH>FVdQ&MBb@0Ex0qDgXcg literal 0 HcmV?d00001 diff --git a/ui/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/ui/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png index df0f15880bee46332dfc6622583215194f948b0f..45f1836b5fbaa2b00316ad04b350a34f1d40986f 100644 GIT binary patch literal 7898 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 tf=pxua2?&Hm6lI6V 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 diff --git a/ui/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/ui/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png index 6cdf97c1196d48e9833487ff6de7c4cfc4e1232d..6d6640705cf01ff2fb7174237f6c729b0a759a65 100644 GIT binary patch literal 5691 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 literal 6644 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 diff --git a/ui/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_background.png b/ui/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_background.png new file mode 100644 index 0000000000000000000000000000000000000000..942fa924ffd21ddff550f7c210a242c3445646dd GIT binary patch literal 2933 zcmdT`ZA?>F7{29}+Y8**i)3lLA{0U_+e|4mu57EMEnR>gI7A7W@X;}aA9EmM%tnXw zmd@3gEnAEq1f^_CCh}uQ8l@=8C3dK5Wh^t1Me3Rwv!xCknT-rrS$p2I{V|Knf^q)1 zxjjwJbDsBkpXWVyU&ZBVEo+u`?T`J=cCxg9WbR&*FF0sNu7)=VQxmc*Hg3^Db8Kw6 z$Hfi$)r^!P88e&3CQ!2e*I{wQT4@d81nnh{nw4cN^eltYDLVCgxLfLI0qQTcHIAx(82 z3%3Wvzt>@5i3)d4X}3;hg8gTaV7U^O4T{bj+_zbLj7{BCBH4Wkdw=3SR?9OUr`pa z0$UHA>;Dm3qUU+AL@n4XG%W^|CD69QBVwfTI@~_}84;{~V7j86RNY+g^S3wTKji60 zc*psM4o-dv`ioT$>ft2*=6CCmp(fp6T7BId5kH#mxXg^sPJDeU)bPkC%z)s1a|Ok5 z+p-s%l_*pD!E`NceNLOA}kTzM_9Pg%E=h$i4Utf$qu z2HZIT!z7d^1b`(x?H_DSMjcW6`LQ|icKbGpnej5hR!iC%ttGg+QRyUmEZqW9mrokg zr-iYv2+uw_9pYDSZshrLzkwCKI9@CpEHv;2ej{?5&Idae1>*mpEh_Ud}`S0;=7Pg#DO^#A|> literal 0 HcmV?d00001 diff --git a/ui/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/ui/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png index 2960cbb6104b915c84760f889deed9bff2b3e17a..238e95ff1efc8b6709b0e94db0d6f9e097f229df 100644 GIT binary patch literal 12572 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 literal 10455 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 X*Gb3XRk4AF>wuE{OSw{6Bk%tMXMp-a literal 9441 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 HN@xNA@UCW! literal 0 HcmV?d00001 diff --git a/ui/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/ui/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png index d2ea9abed395c5fb38369a54896c51c8e8bdff72..29b081c396235d09d45c37c5d660ce2029777622 100644 GIT binary patch literal 18807 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
)RYJFF2se8H$(sE6y&r zHy*fLksrTE5o~C+NM3DMaeqzlcHM)m+5|?Z=}=@q9AM(l|HPS{-$Y8)yARJVM?_^F znM@p0K|##7uYKV0LkU`aD}O>uNCxe;zDB=x|C9bmfqtJBHaJh(-$-@S>TaB`2>H%F zH`TF$x63;9bbq6R3PshB@jOWDp1#8qJ@Gha+VW^hX+~*d86Ly=|Kt;wITVUy)IMlz zX`cKA6u9ZQnEx7*Z z!@QqVF1qX4WFj9XoA3TTi6xdAAk;xs;OzzC`V^jpTgn(u>2zl|x?(TK^^fuQjpkq{ z`}%OM=x1aE$w!ZCtgRz#YvGzh%`m;*ZFyl3-+ZW5c+*W)s`gvE!PVi8{WNh}qwfxF zJR|c?18xcf*!3V~2Q8@{v7e38yZ{j08Xn%#6vqF%N9p+B)1IagBCO9o#_russ9wbgRs8FGX?-2K>f^2>?aXji+C7UGw156 zl?dYHAUpQxEh(cB1YU;ShL3XIiA*nv*k|)_B4^~sfRcom*vR)lG&VNUyVEa+co!Hj zco}Wg0+8BIn7}^qrO*r*5~i-)=>vL}@>pT@=Es|n?CWdZ`n3f3l4ffhov>D>$qE)q z)(3?{;5(|vwiFcY|( z@}bh~w(hN)mpEVZm51bNhjL+d*&vqb$k>A*%wHa8iQELi#n`M^O!q-A+M&aPM{-Jk zQ-xVLC-_qg{$TZalXE0e&LQY$2?g1F2Y8W*z(Zm8Lh}c~;>*r0HSj%KC#q@pqOw~_ zw)O~dz3(;)jX`0XbEHrtGg9Fb; zGl7ybhM(>?%x@x$$eKu3h>U+nOGXFsmwa#1 zqI|&F_1D_tK?`DkgE8}=Xt_Q=HJ8#iVI;Sa87itQ1gDyw4hjq^SO-*X9wTd>&}b&b z_VfS_Ik161HndoPs6;yYc8yp$hY&y_p@bq3Ls@Q7wXi~qN8i}pi-;?~*>c9zAKm=m` zm4ruSH_k?I=B4Hq#|mRqphSaZISHSXuU)S~yq#l9mM$*@v>xDt-5mInD_G@W|%^3dvu#8iex1 zS~8zy@1PZ(L{luGXYRR5%F0bu@%A&2e5B6ZcCxhzUOT#zKNY)+d*(A%6Z_WYG+Z?TDuVhf-W@kNJ zg&!HdrtA=Ad}35y)G-tQCMdM}mXw_Av1J!1x2UsnnPnc?vBQ7J<@9?=+X9|d^$k{s$P{5d>oTpK$;O5sgj6ko}`yx~Guc6}0fIf}J%dn_WdNU`Gg)cmA-w0lpsXwW~5 z7q&W~r*?y7EV{G^8#DgTscvI5_-wP`SEPhm)Y^bsl3LD@yWoxC9kJ?NiJO`$lA^Z8 zC(3vt4!tDf+Z~-ltyDbB63Pis^Njf#aJv6q;W2Q*EsBEk%H~1*KbLIe0CV<##cdhD z%KUrT$Mxd>-Vp*^u=0QB^(X)1Vj5xR{~IrTX(J{1Kk7OjuS$$Z5f*q(?cWPbt-wu6 PFz+N4Bud`ufBSy`yiJ#% literal 15529 zcmd^mi91x^AAf0Iq^?k@6vj5gkf@N-%FIyqDGaWVEG;rjwy*k>E>V~nOGY0G35}bj za7nq!TAvaIX*Coh8BvIS=k|Mkf5oro>3MpZd(J)gea?G%z22{b9JM(tyL`j)dGqGU zT3H^jn>TNM3GsL7V(>qWHu^gA=9!(bI$+@t)-xg)PTklb@ECM2OBma4X{m3jQnL5z zn6jDIb>Gg>v0s&@6hRoIjDSx?q2xG)ks-)gCP%(aEa+a|jka$JV^UqT&2cb_BQ z(ZhDhFP3VQ-;iG*h-t;IpzWa^i{4 z?%(O_oMtu~AAtL25v*cU^NJXYK$#UJ_TdO*${#i9?Rs0PZ8-%E`9ot|#3EGw_gq}A=cThN zLN3%ST&{&eUAP!tSaB2%z06Dd-;s~C%`II}%CFr&M=sT2SXJ)a?rW`Jno>x48KXZV zZ3#)kmQ^cT7cVyA{@nbI?+y!Qr7bIBVs^$Hq)QU(plaPmxOz)VDm0#5u^+LT-J(wx z3W7+{Dr$yTp|l_1_Y%Bf_l?vaP>L&yKI-Z0gM^U(E@IIk#HbLvLvMW;VuO&JLO5IX zSL>EshU6h!UJ6ITC{%4|9L4Tf zQMg@B4ZtpSEB>zPKdA6HY<oqp462k=<~Vg+MOF zHgHI)lFS0(!U_j?0jFBNh0l~1JC@^j_N=n~$L1hZ=wH7W{Jf~s2QfOvadi@yH;=@Hyo z+rX%Cix7sCm+l&B8T@+StGHuW?%AImYKH4xsm#`0O-=g+(W6I+DYgnfLGo1LJCDgf zUMCiRw%+);&y~y6CSAc+lK9&cu3&NW)>QDlH~f|0$9wMJ8|eWQp<}<}9elBo%6&;k z_}wH?tp_J^H5q(c<-=DmUnEx_MihAKq|LT#P-s7^fnGG6jjdkS4~ZV(W;<7hSimx; z*-oUw#h-Tf^TJKehChtQmeT^f3e}FYmTUkPY}D0vr!gYk{AK72S!`4oaBYeE;&%~u z{SHiQz9%Px#ZDc4Z8w@dy+y~GMb;+#p`=a={k`CHSd!Yr(IU8`r2*L#c;e5$d!k0a z1xb)c-5d>Jv4q&P10JuS6tmUW=>b0``f97){E^Gj<@vJpG0dKXcJoGZ1m#Ibl2u?% zc*&yy(#PE!7kB%Evy-_ZAR9LmiELAGhqKoGA^)zwk(5@6DZVfK{{1+u6~l}lDs^Ed zMtzcv0^{wvzz{Zz23q!-Eu{z497jg*X7bnJ99+^&UPbcJ6Bdv3%PNOpu^iy)F~KpH zN$lQKsL&D~_p84onLn*Za_X;NL-KKFwLpaxxcOTNqowfl?8|N2F4@OS*}?U3G>Vz0 z8l4q?u21pdg!?&;E!@yT|G7D6ls~h1fOvcEGRkq-e{%pzrNh;HY1}H27t*&M=ImKH z(t%}t_To6Y!3T*zQy|ka-c)Htsz|YCanq`k^KnT_;XUYPi~rFt@9P^^<}NELCK;23 zFDyRJkNExj_zHS!$M*9#>6FtPo*S$Zq(B94<1H-;BvpL2WW|#z+V4TZHCIfk|2z9| zH$*0bMB8!-Ty9=WR$8oie2buvnY&|Gdkwf1n4Vibbvr zIrvQS7F3YjU#@Q8>1#5*h3dTE%*{Mmw^ZhOuz^Pl>N0fDzGQL7V#IMG_?6%H4CXO$ z?(7y1E%ZS@I0@%sjI3eDrotwuaC$HsA?5W?SRi8FL)@6gRg$@Md|~HW#8FqMK`Xj{ z>yiesIsxs^yCR6}0`~coeA;zr`0xqaR4hXst$O^&S_{3`(o%-syFrXyG?0q3eMwFa zv5YMS+V4Ye(TnaGQG2068ZlOh8KJMdG*#5x!(YmoqM%LL4W_VpnJ9>Ma=gs5GyHDU zs={OtY}Uw(=i+bX<==OAb{5c+FCT$YrX#a>X-go})f&RpA>``mS<&6^!|;j4Yh+UN z&@(+}LLFGIz8+BL3o&(mg&cH~+r{6>x!iu`lx|U+y=2Y0tMa0Y_(C_y&gz%`CV}hR z<>l3`X1gL&=Z4EpAR{Yug(w#EGGDf^DsB-Gx!d*>w5*eSk}h9EHi#i<)L`d_cO|Q9 zRAF3f)ig5d*$sh6a8@S84z3oQ;2b1XnDdyopz$i~Jk+bW#h_bUUeH%!+YsK^xKeeI zA{D*2r?Rm8{&o(Mn)W|vycjG}^rQ?k{-?=5SVuT}DXLgy;ktB-qPm=09||!W+<~EUNj|}!w~HNvkn&vY)A>zYu<~^uPt^gldbjvzguQTB9OR*7fFXWJZCWfQA-ay zl5v*t#@X-WU6z|8NU0+CPWGkf>Q339Vsrqw^4$1<&G%O2z7Ov-#EyrE7kkE7r7*Rq zJ!OUi z%N=}O`V*w?jwOZbe7>zk4r$UxYu;J1gbDo{r9LsA>kv?^r4|r`0%-{d+Wo z*ArQPh6Vq!5v%UNFZYNE((67!g%`HiB&WJVg^zIuPNW*Q%faL0aJU*0a)YVSbyys- zQ&sqV0<}eE!xIQEVGw(gxx7dZ$!#K6-T&-}I8qE8Su|Gce$GMnc4%fZiGPeGr`}lj z4H_@U9{hcLMSun>SC}Nqiot#-Gbc!S&BHhCIhTcx>a+|lNvB5+*r`|%(Y-b`)dqIC z4IKH3-9p7x_{S04+p6^ttCq)fgl_V>3ieV<79zHAa1f(~OlLW!rX_b3FK#01865J_ zvi9(%Q?6quN_H({0ng|mWcN& z6qj5-r0(dA1ePBFp;t#9jEu7kpqe>Gjn)-x>2ZKhwb8AW&38hn7aA7jkk=GiL0CGu3B=vh!n@_yKp zvnip;U!x?gQE|D1n~rC&;E!dVT0%z5v1ZC?B=B2VA$av04Sg5HaVzyPEkM=aCS)(2 zesLE|%vz>F72r0c$BcaWo33!Fbb7*p_1JhV^Ql8l3$b}o)RW4A8B{)zzYX$iX~(h}*Rf=^M|-FBl+~#UYXaeR)wb{sK7F+U~CrH%%Ro z$oJ#Wik9Kpf|74^h*^Z2`Q zyB}!LESgptv4U+*!^K8SXa)%iY@^|S;yA$k?7TP$ffe3Qp9IFYSV4GlUt?Cy2)v6^WSdKr)q_^>FwfCD840=EN+ssWAXD8tSd5}u03ry7$B36W@ zybL&zzbpTN!h>w#WBzcSDm|qu`~AWvE}>VFT#%nAC~c}1@hf^unoZFNJ@oQSTON6~ z=2h>+`0x~I(xaK16BHc#b$%U0mpnUPf5?@E$g~&5_Bo%hrg+DG`e@7PW8VCed60Vk zfX6(eW#9lkY!6kY=^AK5%6B#%C|c-w9PZgrnr35``59lej5q~zw&IB2JDMPu3|fSq zmsjk_1yQv63Wl}vJ!#y2WUKyNTMy%xpsZai&YhZRr%AH!)}1$En{a4jPs)7pm09wp z>ixSwtbESO0F$kaiG2Gn{%s~?a>2_ydt^-d+N!9H^sI3uZ$$w6R%$~qC`_;5KGDJ_ z3i`X_A=6X4a+yEg9+|6tg1h+ zOD1@$up(9Dae)?B1n5pwZP*5FG@f}tgwOr?15&%_cem_3e%@qg zn)_<&TPJKnDOB3Z7>h+RhTVZ83Nm7nDw4#dRyX{qp}~9XN$gGrT)AqV-Wdh@F_1a@ zHH2SUPHY(4k*Gt_5jI9UwO`>h7mg5?%Uxcyk~5`lpycw$jq99w$q!LTw~6>(HuWq~ z?aHvHcb}xFdHAC`=OF8+FGG9am>hj~!#i6}c_qk&+1q2<#O3Zelzm8`(F430b1mJG z$z>)D;zcUw6R%3<_bJYNeU_-QQ-`p`)bCH^f~T)fF&^$8tHtc&9%u2pGG@LG7+W%C zYYn&U*On>V2TpnK4Q+HnhGbmr(C*3kN}~XSO62C7!%SH2BrA3!Pt>c%nVtCJKh=La zpDL)!dbnB?JmpW(d7zeLe!3DfUJ8y0$&>bU_X>|HJ|I<`I(D@F`#%ZG zD+YSGqF08~OR|cONc6*OiY$==>4mT#KcjUlSjUmww`x(Z$qV;Iis4=DR|0iVK-D}q zq+V(oLgKs3ak%5QJr4@gm*H zyxw7X^}KKE!~Kh^V&C0#fDJhbQ7=12P1Ou{$}{s1ai&yJ07!z{$ffw3`WHL$KAo#U z)ttPlj0}`WlQvpHr2!fG+H_AOQg!e={CZWxz2-uMq^K+W&OUX>=ZtE}?)g$_4M7XF z8lk~_WmB78w`+dqw+_$;AbatI`yuz|`RNsqdV(t&_kpVaOu@>g ziP()OeJaVvnE=d71CIQQVK+pv!AKjm>Ft_es{xChf|HL-Uv(?aT$49l<<|*P`J9G^ zFddKbKMLC?iM7$9SV4#E%hSb8mCGCRAs23!lz;@4i#pd(Kz%WBz$)Ne-shRnic1~U z(x5OFQ{MC;rpKlXj=VVhG-1k0F+z0=8alS_%%kj4I$be?<9D+Hani|b?OU{%Q zT1F&2OONo)jr0r1$mW%oqN8rB{Ql{`#NzPl349re?;i?xetf)04_`@_++r#7y1FZ| zRW&zUJxie$sC#_z%edXA+3ZiYo?>wd{(wNxK`|j_$*FIk;cLwwmpoQpe2cSd-Qy^B zjmpL!-mBQV+s=PNWk~!=4WBbX@DI54aw>v9pi%aF6vWOuk}rFDDL?fDl1?B~SDA5J zRy?JEC&`Aq5 zBN)9njV6CTujhhuM9{l_SUmB?k~O4|%1o{UnevvxqazZFUWhJw<4HD9j?ukJ*$;|1 z^VF^f_&qW@_hr!Z2;h^n$`WeNlGyo~kiD{T)VicDhKHYOd{KM>G~D#o^RX+e-7C4? zljRX@@+WTQ;8*Q4=$JgAiHSP|bl|>>&qq1Ko86JxP=w?O&mh z7Zes19x3|a9&bkrI9q=RjRv&J7X9a>PDgQwnyTV?hC)xM3;d zVL|=mE_DB~c4Pyx`^|Uh@#M66DA*Br>1yUOQpJwGlC!EB!jnkDLB0v^i$9XPXou6hQl~{`>el=8L z&s6EjU6;iZCEF1aBJpb?Degf(XNnyu9BM-=@Y(`=KlP4#LrzdwkQc{~9?k*{VX_$^4ah@<+s4D7S5s+(Qg2Bl&DW z3Addu6MPh)_qaxXD-R{ZJoylRSeQ0q<3M762nGf)4awV!2%5(-nHMn!PTyWuC5{pJa}=A+2K}pxswW*QM$!W$J4bzyO(%ocHuC9TtC$0*eg5lw`Ho@t`>FlCUPp z+8Grr1_uC_>%7xHZP3$q;o_x5+c_gIn#lzkPoeOfe~b*;7yK{8SJV8n1+qH;0KEI~ zuFTImit2ol(Bc5A9ydZC5ai10v>0shCC{O~W@LlDjI<`>@ID9liM`~OVy)@eAaE@| z7YVP7k|%$i`OW44JRr{P71{cLN^pTpd!zsET)>>&EJhmg6jZtbzA?2*;-{@Q8T)Ep zaD%VhG%W&WG@mOfK+0Cx!#2%yD!K|p8jS+%d^=L%4<7_z4CD_DiA4gmXJk44Soa-0RA?ZH{pz5)v0KI}PYiA*d^6}>F y3vD~Wi9;mL_v z7xo7KSWDz+M=Rp9m`_0a0lhg5l^&CC5BgTJ8~rS9SnxkU19>e|C7+YL@oW>oCNY~% zjVaC?;3_T_7YlcX;!4CHF6O@bK=w=3NCfVpder~+} zlN~`b;ZH0cqf)!anP6auHDwr2j1MwqivrM}D4y7zDN5QdIC*xfPfy#6Jpo~e>_)!x zF=AeZc`K$+Nj(iiSI|EYm%+91t@RkYEp50Fb$oH(=LnB0Hd9b~x58vt)(rmXq3PpfJJ>#E_a`eP*G4lhV92sh zbXI2&wZHc?FWR^m_YsE(f7^=(i6UMrRF*M&!zdenDyv*bN_8H}5an{^P4zNHY#6Tc z)i+L?j3t%eX4Pxkzr0EOY6u%Yw-NUUc7AtfIdW55h;Jyg-dLN;WU>ksc+OcyXo`lC z7t7Lo;jdSB>`k{Tu+2Qoi$S<)+2d+3ego@0V>ovAG7H>!ZiBZr&|Km6Y7yKi2u#sCQd>&w_Q3pqS1D z-u_vP59v|e5QWMs4JWNB1<&9`pitC0?-hGt^o=9MN|SAN;>>mC(6dDQ?qRscdK0xR zRC8J#l=GdZxX$mu7hD0=OaTt?Db(*>rQs8?DZUsFU~AHJ(d>`8X&FWaz4E5#71%o~ zG!%o-pSid?x9j!j<%0xt3IZ)W#yxO)`Z26OLF?3w8Smx{(dRtVwSjC6pWR<8JBs!=ZyZkxJ{N9*89VkN99f3 zf8(oE=#s4|gZS%J^UNK8`}h`+20jJsUq)b_%ZoHn{7$NKG9EQ`|D)ne{G_ku@gthG z7-niKMeVIfPMrgZ^`Odpm9XhGjd70CO&si_R!5kuWvT1swi6GK8Nd6a)V1wg3?hQ5zy87yG)A z>l-%CDZkTXe+WkeA;GuOM%rG42n1ieIJ&c}9~w~aRpNB-RAO!-(wEVm7P>QhNZIt9 zndan|MWquZpErNAp~;O&i~IC6nA%BJr1fHlL73Dnjt)Z?*MCp&>itYcar+@PsFoJQ25T5$R_O_runRf zYy9wp{K7O-l zu4%*E(S3+5s8jzT+L?W`tTU-n9S68ayCHt+h$L)#VDMqai7Kyrb&%z5`@d4GbEt(Z{6Zc@HeGjn zLzkc{rsU>1kvipF;X_O2`5T9vc&E)Dm*A%{8uRYdeIzn}-VuExvbm@fYRkFkIl&xZRR~3+zu%pCw*v+hop9YfG{} z9PAo5)z%ejk?(5~{={nIJl@jQGE58oA)Ss(?i$_@lgl9a&?qA@gC$S(@)(+|l0EDp zkUIZKtOp6gkuoN4TC{3j#SPIT?1G}o!meIU&1yA6z~`SSjCePLfo`6EG4@Q^SQYfD zME-0j+%@=0&VAfw9Y5_WvMGliaFPk{%3FI|b;jusr~AH|8USTRd?k|cV2vLq^4mng zBbK{jx34U{b->g2b00EjxS8GQ_8h7{Qbfh@&CMXrJ_&~3hxHXZFPckU?^m_Tk7p*8J@@0Wc zuu-6B0IE(`72?ZVQ1o+uu6Tt(J6kKmN#r$X$kw_rmnnLAU#`6i6oL%RENvDm&`rL# zyZ5li(X6^=9icG~lp41ln{gubrnhOKkIMm7%PH7ra1u(d*@ zi7@&!+4?ug=pS|)13s*#$&ScZ=QtY8*gnKe`W7r){B4m_IhMf$pzK1hdLelO$4@=4 zS8%erVQyIhZnGiN;})kh`1eHIR4@$Fi%v5EV-#5kn$z?mDfc}*#EGjB zk|sx5I+_c$Ns0pFYfl?j+AP!x+p^YFJG=zYj&2a?DnIj$ zccEWAlL4$A-Y2$CSf8FuqiO%K@f~LyRmujzNZNnLX!ozOD8cxscX0zfP&` z2)d){2xXh#3mu89_Tfw&hppPL0IF>n;~o}~40wK_+lq@+RytODW3p;vfkEH1#2goi z8a2eR<;Z)3Oq*)~k}$09S>op_FRxlr(VACElefuBp6qZRUQ)f}9AlV{%Rm-l*ZW2KEg@mTk^vReLa*bRHHFPUPx=o?my9TrfCXdx8Y&v4yLVmFisW}xDSJQ!PQli}Vv;xwdP;f8` zq;@jO2TtV9{TYgQIuQ;4`PRd*F_@6(X*bhzK;L$@e)Qr8`sr&dXHDVuq{ywl31V%7 zkeCB6O0TA`187$ofjRC5e=T zKBG1a0d2dhJZN=}v&a42h(nE8kadY8Zyz>ApKv)I^Zw22} zS@CK|(l#2SX?XY^_HHGAVV**d1gRWVF7HM)ZDd+sZoZV9cz_ddL`TjHme`^YMkz{cKKujz6<=Z#HSOMb( z^OGCAXi;9c6NAS*{pBcYmA7H4D3O9J3Zl2>{$+9?nxrNPtDSSw=Xa&7m%gS+?mc<7 z>XPo{t?R`Jm3n}zo*n9I%uVBD0k~%__$8Y9EoZ8v4Y)6H0uGuL-+s{6I{&3=HiCX8 zrYb#tgQ-PH_^s7v&# z2^ubzq(}w5|8pH_eu(#*v}EUWG0zDuczM-()4YJ-Q_soMz72`bABz6GbA?l4xnO(V z(^{Qi@4rkBos7DTLo;4+7(WkM!O+|w=vm{UJag(GF~^ZReVUW^y6azP2H2oo*5pI# zK6bDpFEy0Je$Ifs{~w1Iy`gDX<*@Vu4H@eB!E^F_Rd7HVsqrjnGdC9e>WFIrv;-wl zu&w5Z#GuV@)AbEO5=$~6smh0{eUAcp(Ye2DpaKP`oW2+Mr=;4jIQeVG?;{D~km4-q zYo5p|#mL~&xP0-dc~PX9H;H$k!a^(}Decp{GCX5i3dR=!WGI$C*-jUdd*|o#?FqRgbfvEmou58aq2W`d=Tm~J1>USN(f{?bSNgu* zOp|?QwOVBbDPM~Q&eWnL#36m+uoZNkSeM}S7VPKtcf_2-?RVm`tCOI+ zcVz8*+tVlaqIjkKqKczlU9CILo2C24&nl<*)$a+M8E5H@*laf|uO9*c<0NSf3&l2zAwUefgo5=tHQyaEF>fUvB!`Qyb7Y7_!;i#tin-6rPyMhMo35{qyYAul zzqSn5C^nN>uqM@eqfCS?b(@m7;~BIs2sX$_+r(C*@5O3TaLnU`D(?= zIPV{WdulsgNaITPZ1_C)d~`{tvMCpfI#=(;;kd#4{NYp*wd?QLh)3PaG$7^eM_7q1 zWM`zNk_o#<7xszE)zP^#dT3Fwe7@?;*=58RSAB;{D^>HBb1pwtI!FwD=I^2Gl8sNd zB{^G(c|Te%yeI)!we4qsI_iFa#6OqMOc#rT5pSyip(>}6P!uu)Kb_o%I6AU8G@uA@ zAyi>m|A8Fpod4-16No_j;>6;81Swgw;?*EjNN24eRe*L^igbgA_Dv|>QFH`o+DGY> zbAE#?YpD)FQ#6(*M6uw=e(}FRLv@*O4+oDuoa$-Ne-T+O2feT_dqz7c!iKXAHeli# zbdOqI+FBr11cls9uCpF8`$>S{QPb>5VyOi}`#4N$NzijET9trixd&1e-VoGW`WrJ^ zMn|v7$t`Y?o3FMjqNG;-_voJUmt2Oc%UO~y!2cv8O9&11;}>7f=d48{J+}Pi$n?KL zDLTS0Mv_ySccwQ~Tei|zL)>K{VZ|HzhcH6xvZ4#)5-4BYiV|24Y_wJ}%>hApUGJm? z?@a9h1HHK2JsbP>qQ&zZG-D%HGM#3^V@A}8s43#}K^yuY((yP;4LD&Eq3Y=7IY*QT z+%#3oaCJ+@&vDBv0gpkvB3Pq)H)?q`SR5>k)zFk#Y0 z)*OIyPDPlO!48$I{#2%~1^D%7T-`lAbapZK?@whU_QM(y|L5Ro3;0tfKHxtBp2(=X zrvvyYB~r!Ct2WK#=w)Svfbw z44Cf^yEV06QE<01NEKOpFm-GOJ@JWPF4IwZ?*SKRiWPyTcqNT-p5wSPY{CEMmow;#v(0pX)_K5-W0edv=Pi4pBMF`+3P@!- zUd@FLfiCBhdS_(BkqLtlu`q8O9T1%zrdSM+UVSqc=LinJni z#0bUiQ4EYMi+2=Z{1XP0BQU4GgH2Eg;0&n>w~-Y2&M9I?aN`ABE+Gy4f}hs}3BO;- zPRGB|Qq!vCb^-rLuXAlIT#1xtW1vfNk~0A^6AqEJRwxlt#J5D8(pi&6=UfgjxxtjL zXdWb)ISVZj>;8^J>FZSH+@BFWvDhC`nEH>nW3WQvK@sZaOV4dZZFYu9Dvq%9XhjL) zT&h7h!UJlkzl^d@$+qT}%Xsrfv)^QNc5Lmv<4f*fQmcTr2l%r+(WE0T53>m)Y>&At z&aHTynvej_oHbIM!2>ko@2plJxlj}=-(zMJ8LA5SX+k|`Tw%(aRZX)j+RstYL5%}= zRI}CjTxR}7pdVxO?Do|&Ukf@Z!7+}E}7XmlhL? z+o`}*@Mmd2)dZ>OScGSUnK|$loE3nwUgRc61DV~U$d`Ww-4c`8F(3%Dwc6Yl!$9pd%l-oVOpXE4mPB`PIR({&N?rZ;!VThbE!2&OieN|3x@Te%lhvz8CX7%Ls& zP8U-t(NLRW!jKpo^w$-l!tyE;BD>*B!KEEHbU|i61kR2*FYN?JH}bkRh%x6DcJ_^4 zUvj;8Q>8SH#yF1X2Jn=eSU?)#>t2g}B2~}`ZKu13IoJ91`A?7V$(e17%ewQWF-oJi z?tlw~ScDE*zWi@mQ2^l-+yI(SGNuZ3$B4*k&P#PB<*_yIrxJ!Zdb3XbwCH;_uGobw zX4OWA+an{LTMTZAdA|(*Q*we8GQR@pSou=W$D-+=_ja)FN~?zbI96I{&;mm2?7y!I zrxBI8gIzGaPMPyyCti|zUhJS7}t$>Q9<3LvIDE+q1y;J@&Ci6*m?7gs{K*%`ng_Hc=&_{@x@jLZ4TVu=W+4>0Ed3~t^fc4 diff --git a/ui/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/ui/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png index a40d73e9c68ea638c28c7b13e4bcd1e179a3a102..278b30730df11c18354063fef5f4c7d7b7db7d9e 100644 GIT binary patch literal 8807 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 literal 15916 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 z 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 W-`&GGorHluT4(f5=bp6r^Zx)wWVDL_ literal 0 HcmV?d00001 From de003e862a04bb3a527e50b668519705239b4a0b Mon Sep 17 00:00:00 2001 From: Ilia Denisov Date: Sun, 12 Jul 2026 14:58:35 +0200 Subject: [PATCH 04/18] feat(android): resolve gateway origin on native, skip SW, hide MVP purchases Make the web SPA behave correctly inside the Capacitor native shell, where the bundle loads from a local origin: - New lib/origin.ts gatewayOrigin(): absolute URLs resolve to VITE_GATEWAY_URL on native (the finished-game export/share URL in Game.svelte and the Wallet site-root link), falling back to the page origin on web. transport.ts already resolved via VITE_GATEWAY_URL and is left as-is. - Skip the PWA service worker on the native channel (the assets are already local; a worker would risk serving stale content across store updates). - Hide the money-purchase UI in the MVP: new distribution.purchasesHidden() folds VITE_PAYMENTS_DISABLED and the Google Play flag. The Wallet "buy" tab shows a neutral, pointer-free note (wallet.purchasesSoon) for the RuStore MVP and keeps the RuStore stub Google-Play-only. A ?nopay mock force mirrors ?gp for the e2e. - Native env types in vite-env.d.ts. Client-only, contour-safe: no wire/proto/schema change; web/VK/Telegram unchanged. Tests: origin + purchasesHidden unit tests, a ?nopay wallet e2e. svelte-check clean, vitest green, web + native vite build clean. --- .claude/CLAUDE.md | 4 ++++ ANDROID_PLAN.md | 23 +++++++++++++++++++---- ui/e2e/wallet.spec.ts | 16 ++++++++++++++++ ui/src/game/Game.svelte | 3 ++- ui/src/lib/distribution.test.ts | 22 ++++++++++++++++++++-- ui/src/lib/distribution.ts | 29 +++++++++++++++++++++++++---- ui/src/lib/i18n/en.ts | 1 + ui/src/lib/i18n/ru.ts | 1 + ui/src/lib/origin.test.ts | 28 ++++++++++++++++++++++++++++ ui/src/lib/origin.ts | 17 +++++++++++++++++ ui/src/lib/pwa.svelte.ts | 9 +++++++-- ui/src/screens/Wallet.svelte | 21 +++++++++++++++------ ui/src/vite-env.d.ts | 9 ++++++++- 13 files changed, 163 insertions(+), 20 deletions(-) create mode 100644 ui/src/lib/origin.test.ts create mode 100644 ui/src/lib/origin.ts diff --git a/.claude/CLAUDE.md b/.claude/CLAUDE.md index 451a7ad..db427f8 100644 --- a/.claude/CLAUDE.md +++ b/.claude/CLAUDE.md @@ -114,6 +114,10 @@ The native Android app (`ANDROID_PLAN.md`) is a Capacitor 8 wrapper of the `ui` eyeball per-variant tiles. - **Durable Playwright MCP servers** (chromium + webkit) exist for UI inspection (there's a plugin-config gotcha in wiring them). +- **The `playwright test` runner can't fetch browsers in this sandbox** — `playwright install` dies + with `EBADF` against the Playwright CDN (blocked network), even with the sandbox off. Run the e2e in + **CI** (the `ui` job installs chromium+webkit), or drive a state live through the **Playwright MCP** + browser against a local `vite --mode mock` server for visual verification. - **`docker run -p ...` boot tests fail from the shell** (published ports unreachable in this env). Use **testcontainers** for container-backed tests. - **Distroless images run as UID 65532 (nonroot).** Bind-mounted TLS keys must be **0644** (not 0600) diff --git a/ANDROID_PLAN.md b/ANDROID_PLAN.md index 4876a05..0312637 100644 --- a/ANDROID_PLAN.md +++ b/ANDROID_PLAN.md @@ -71,7 +71,17 @@ Kept current as parts land so a fresh session resumes without re-deriving. Verif **Launcher icon:** a **temporary** placeholder is in place — `ui/assets/icon.png` (the maskable «Э» brand mark upscaled 512→1024) → `pnpm android:assets` regenerated the Android launcher/adaptive icons + splashes. Superseded by the icon rebrand below. -- **B–G — pending.** +- **B. Native web-build correctness — ✅ DONE & verified (2026-07-12).** New `ui/src/lib/origin.ts` + `gatewayOrigin()`; the two `location.origin` landmines fixed (`game/Game.svelte` export/share URL, + `screens/Wallet.svelte` site-root) — `transport.ts:32` already resolves via `VITE_GATEWAY_URL`, left + as-is. Service worker skipped on the native channel (`lib/pwa.svelte.ts`). Payments hidden in the MVP + via new `purchasesHidden()` (`lib/distribution.ts`: folds `VITE_PAYMENTS_DISABLED` + the GP flag, plus + a `?nopay` mock force); the `Wallet.svelte` buy tab shows a neutral pointer-free note + (`wallet.purchasesSoon`) for the RuStore MVP, RuStore stub kept GP-only. Native env types in + `vite-env.d.ts`. `svelte-check` 0 errors, `vitest` 590 passed, web + native `vite build` clean; + `?nopay`/`?gp` wallet states verified live via the Playwright MCP browser (the e2e runner can't fetch + browsers in this sandbox — the states are covered by `e2e/wallet.spec.ts`, which CI runs). +- **C–G — pending.** Open logistics (not code): **mandatory icon rebrand (future)** — author ONE vector master and generate *every* icon from it (web `favicon.svg` / PWA `icon-*` / maskable, Android adaptive, future iOS). Today @@ -232,7 +242,7 @@ is: scaffold → native-correct → gate → offline-first → CI → docs → r **Done when:** `npx cap sync android` succeeds against a real `pnpm build`, and (from `ui/android/`) `./gradlew assembleDebug` produces a debug APK that installs and cold-launches to the login screen. -### B. Native web-build correctness (file:// origin) +### B. Native web-build correctness (file:// origin) — ✅ DONE 1. **One origin helper** — new `ui/src/lib/origin.ts`: ```ts @@ -264,8 +274,13 @@ is: scaffold → native-correct → gate → offline-first → CI → docs → r } ``` Switch the wallet/purchase consumers from `isGooglePlayBuild()` to `purchasesHidden()` where they - hide the buy actions (grep `isGooglePlayBuild` under `ui/src`). Keep the "go to RuStore" stub - `isGooglePlayBuild()`-only. Add `VITE_PAYMENTS_DISABLED?: string`, `VITE_STORE_URL?: string`, + hide the buy actions (the sole consumer is `Wallet.svelte`). Keep the "go to RuStore" stub + `isGooglePlayBuild()`-only. **As built (owner decision):** in the RuStore MVP (`purchasesHidden() && + !isGooglePlayBuild()`) the buy tab shows a neutral, pointer-free note — new i18n key + `wallet.purchasesSoon`, `data-testid="purchases-hidden"` — not an empty tab and not a store link; the + same note can replace the RuStore stub in the later Google Play anti-steering variant. + `purchasesHidden()` also carries a mock-only `?nopay` force (mirrors `?gp`) so the e2e drives the + state without a separate build. Add `VITE_PAYMENTS_DISABLED?: string`, `VITE_STORE_URL?: string`, `VITE_DICT_VERSION?: string` to `ui/src/vite-env.d.ts`. 4. **Native env matrix** — see Build & env. diff --git a/ui/e2e/wallet.spec.ts b/ui/e2e/wallet.spec.ts index 1651bc0..c10935e 100644 --- a/ui/e2e/wallet.spec.ts +++ b/ui/e2e/wallet.spec.ts @@ -105,6 +105,22 @@ test('wallet: the Google Play build hides the money purchases behind the RuStore await expect(page.locator('[data-kind="value"]').first().getByTestId('buy')).toBeVisible(); }); +test('wallet: the native MVP hides the money purchases behind a neutral note (no store pointer)', async ({ page }) => { + await page.goto('/?nopay'); + await page.getByRole('button', { name: /guest/i }).click(); + await expect(page.getByText('Your turn')).toBeVisible(); + await openWallet(page); + + // Buy chips: the chip pack is gone; a neutral note shows and — unlike the Google Play build — it + // carries no RuStore (or any store) pointer. + await expect(page.getByTestId('purchases-hidden')).toBeVisible(); + await expect(page.getByTestId('gp-stub')).toHaveCount(0); + await expect(page.locator('[data-kind="pack"]')).toHaveCount(0); + // Spending earned chips still works — the values live in the Spend tab. + await page.getByTestId('tab-spend').click(); + await expect(page.locator('[data-kind="value"]').first().getByTestId('buy')).toBeVisible(); +}); + test('wallet: a web spend that would draw store chips confirms with a warning, then completes', async ({ page }) => { await loginLobby(page); await openWallet(page); diff --git a/ui/src/game/Game.svelte b/ui/src/game/Game.svelte index f2ab090..a7d6a4c 100644 --- a/ui/src/game/Game.svelte +++ b/ui/src/game/Game.svelte @@ -28,6 +28,7 @@ import { alphabetLetters, hasAlphabet } from '../lib/alphabet'; import { hintsLeft, hintGateRemainingMs, hintLockMinutes, HINT_GATE_MS } from '../lib/hints'; import { downloadUrl, shareOrDownloadGcg, shareUrlAsFile } from '../lib/share'; + import { gatewayOrigin } from '../lib/origin'; import { insideVK, vkAndroidWebView, vkCopyText, vkDownloadFile, vkPlatform, vkShowImages } from '../lib/vk'; import { getCachedGame, setCachedGame, setCachedDraft, type CachedGame } from '../lib/gamecache'; import { patchLobbyGame } from '../lib/lobbycache'; @@ -1211,7 +1212,7 @@ const dateLocale = typeof navigator !== 'undefined' ? (navigator.language ?? '') : ''; const timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone ?? ''; const { path, filename } = await gateway.exportUrl(id, kind, dateLocale, labels, timeZone); - const url = new URL(path, location.origin).href; + const url = new URL(path, gatewayOrigin()).href; const mime = kind === 'png' ? 'image/png' : 'text/plain'; if (insideTelegram() && !tgShareSheet && telegramDownloadFile(url, filename)) return; if (insideVK()) { diff --git a/ui/src/lib/distribution.test.ts b/ui/src/lib/distribution.test.ts index a429e35..ba9d72a 100644 --- a/ui/src/lib/distribution.test.ts +++ b/ui/src/lib/distribution.test.ts @@ -1,5 +1,5 @@ -import { describe, it, expect } from 'vitest'; -import { isGooglePlayBuild } from './distribution'; +import { afterEach, describe, it, expect, vi } from 'vitest'; +import { isGooglePlayBuild, purchasesHidden } from './distribution'; describe('isGooglePlayBuild', () => { it('is false by default (no VITE_GP_BUILD flag, not the mock ?gp force)', () => { @@ -8,3 +8,21 @@ describe('isGooglePlayBuild', () => { expect(isGooglePlayBuild()).toBe(false); }); }); + +describe('purchasesHidden', () => { + afterEach(() => vi.unstubAllEnvs()); + + it('is false by default (the build sells normally)', () => { + expect(purchasesHidden()).toBe(false); + }); + + it('is true for the native MVP that defers billing (VITE_PAYMENTS_DISABLED)', () => { + vi.stubEnv('VITE_PAYMENTS_DISABLED', '1'); + expect(purchasesHidden()).toBe(true); + }); + + it('is true for the Google Play build (folds isGooglePlayBuild)', () => { + vi.stubEnv('VITE_GP_BUILD', '1'); + expect(purchasesHidden()).toBe(true); + }); +}); diff --git a/ui/src/lib/distribution.ts b/ui/src/lib/distribution.ts index e7b10a0..4ddcef9 100644 --- a/ui/src/lib/distribution.ts +++ b/ui/src/lib/distribution.ts @@ -1,7 +1,9 @@ -// Distribution channel of the native build. Google Play forbids selling in-app currency through -// an external gate, so the Google Play build hides the purchase actions and shows a stub pointing -// the user to the RuStore build; every other build (web, VK, Telegram, RuStore native) sells -// normally. The channel is a build-time flag the Google Play build sets, not a runtime guess. +// Distribution flags for the native builds. Two independent build-time flags hide the in-app-currency +// purchase actions: VITE_GP_BUILD marks the Google Play build (Google forbids selling in-app currency +// through an external gate — it hides the actions and shows a stub pointing at the RuStore build), and +// VITE_PAYMENTS_DISABLED marks the thin native MVP that defers store billing (it hides the actions with +// no store pointer). Every other build (web, VK, Telegram, a billing-enabled RuStore native build) sells +// normally. purchasesHidden() folds both; isGooglePlayBuild() stays separate for the RuStore-pointer stub. /** * isGooglePlayBuild reports whether this is the Google Play native build, where in-app-currency @@ -19,3 +21,22 @@ export function isGooglePlayBuild(): boolean { } return (import.meta.env as Record).VITE_GP_BUILD === '1'; } + +/** + * purchasesHidden reports whether this build hides the in-app-currency purchase actions. It is true + * for the Google Play build (external-payment policy — see isGooglePlayBuild) and for the thin native + * MVP that defers store billing (the build-time flag VITE_PAYMENTS_DISABLED set to "1"). Every other + * build sells normally. Under the mock e2e it can be forced on with a `?nopay` query parameter so the + * hidden-purchases state is exercisable without a separate build. + */ +export function purchasesHidden(): boolean { + if (isGooglePlayBuild()) return true; + if ( + import.meta.env.MODE === 'mock' && + typeof window !== 'undefined' && + new URLSearchParams(window.location.search).has('nopay') + ) { + return true; + } + return (import.meta.env as Record).VITE_PAYMENTS_DISABLED === '1'; +} diff --git a/ui/src/lib/i18n/en.ts b/ui/src/lib/i18n/en.ts index d3a50de..67dad18 100644 --- a/ui/src/lib/i18n/en.ts +++ b/ui/src/lib/i18n/en.ts @@ -252,6 +252,7 @@ export const en = { 'wallet.iosBlockedLink': 'other version', 'wallet.iosBlockedPost': ' of the game.', 'wallet.gpStub': 'To buy chips, install the RuStore build.', + 'wallet.purchasesSoon': 'Purchases will be available in a future update.', 'wallet.cur.RUB': '₽', 'wallet.cur.VOTE': 'votes', 'wallet.cur.XTR': '⭐', diff --git a/ui/src/lib/i18n/ru.ts b/ui/src/lib/i18n/ru.ts index b177751..6c5c5d7 100644 --- a/ui/src/lib/i18n/ru.ts +++ b/ui/src/lib/i18n/ru.ts @@ -252,6 +252,7 @@ export const ru: Record = { 'wallet.iosBlockedLink': 'другой версией', 'wallet.iosBlockedPost': ' игры.', 'wallet.gpStub': 'Чтобы покупать фишки, установите версию из RuStore.', + 'wallet.purchasesSoon': 'Покупки появятся в одном из следующих обновлений.', 'wallet.cur.RUB': '₽', 'wallet.cur.VOTE': 'голосов', 'wallet.cur.XTR': '⭐', diff --git a/ui/src/lib/origin.test.ts b/ui/src/lib/origin.test.ts new file mode 100644 index 0000000..5fe23d5 --- /dev/null +++ b/ui/src/lib/origin.test.ts @@ -0,0 +1,28 @@ +import { afterEach, describe, expect, it, vi } from 'vitest'; +import { gatewayOrigin } from './origin'; + +describe('gatewayOrigin', () => { + afterEach(() => { + vi.unstubAllEnvs(); + vi.unstubAllGlobals(); + }); + + it('returns the configured VITE_GATEWAY_URL (the packaged native build)', () => { + vi.stubEnv('VITE_GATEWAY_URL', 'https://erudit-game.ru'); + // Even with a page origin present, the configured gateway wins (native loads from a local origin). + vi.stubGlobal('location', { origin: 'https://localhost' }); + expect(gatewayOrigin()).toBe('https://erudit-game.ru'); + }); + + it('falls back to the page origin when VITE_GATEWAY_URL is unset (web/mock)', () => { + vi.stubEnv('VITE_GATEWAY_URL', ''); + vi.stubGlobal('location', { origin: 'https://erudit-game.ru' }); + expect(gatewayOrigin()).toBe('https://erudit-game.ru'); + }); + + it('returns an empty string with neither a configured gateway nor a location (server-side)', () => { + vi.stubEnv('VITE_GATEWAY_URL', ''); + // No location stub — location is undefined in the node test env, so the path degrades to relative. + expect(gatewayOrigin()).toBe(''); + }); +}); diff --git a/ui/src/lib/origin.ts b/ui/src/lib/origin.ts new file mode 100644 index 0000000..644fc75 --- /dev/null +++ b/ui/src/lib/origin.ts @@ -0,0 +1,17 @@ +// The absolute origin the client talks to. A packaged native build (Capacitor) loads the SPA from +// its own local origin (https://localhost / file://), so an absolute URL built from location.origin +// would point at the app itself, not the gateway. The native build therefore sets VITE_GATEWAY_URL +// to the real gateway; web/mock leave it empty and fall back to the page origin. Centralised so every +// absolute-URL construction resolves identically. transport.ts computes the same fallback inline for +// the Connect base URL and is intentionally left untouched. + +/** + * gatewayOrigin returns the absolute origin every client build talks to: the configured + * VITE_GATEWAY_URL when set (the native build), otherwise the current page origin. It returns an + * empty string when there is no location (server-side), so callers appending a path degrade to a + * relative URL. + */ +export function gatewayOrigin(): string { + const configured = import.meta.env.VITE_GATEWAY_URL ?? ''; + return configured || (typeof location !== 'undefined' ? location.origin : ''); +} diff --git a/ui/src/lib/pwa.svelte.ts b/ui/src/lib/pwa.svelte.ts index 0357a6e..472b7bf 100644 --- a/ui/src/lib/pwa.svelte.ts +++ b/ui/src/lib/pwa.svelte.ts @@ -5,6 +5,7 @@ import { isIosSafari, isStandalone, resolveInstallMode, type InstallMode } from './pwa'; import { insideTelegram } from './telegram'; import { insideVK } from './vk'; +import { clientChannel } from './channel'; /** inMiniApp reports whether the app runs inside a Telegram or VK Mini App webview, where a web * install makes no sense (the platform manages its own launcher). Kept here, out of the pure @@ -79,12 +80,16 @@ export async function promptInstall(): Promise { * registerServiceWorker registers the app-shell service worker (built from ui/src/sw.ts to * dist/sw.js by vite-plugin-pwa): it satisfies Chromium's installability requirement and precaches * the shell + assets so an installed PWA cold-launches offline. Web-only: skipped in the mock build - * (a real worker would perturb the Playwright run) and inside a Telegram/VK Mini App. Best-effort — - * a failed registration only means the app is not installable and cannot launch offline. + * (a real worker would perturb the Playwright run), inside a Telegram/VK Mini App, and inside the + * Capacitor native shell (the bundle is already local, and a worker would risk serving stale assets + * across store updates). Best-effort — a failed registration only means the app is not installable + * and cannot launch offline. */ export function registerServiceWorker(): void { if (typeof navigator === 'undefined' || !('serviceWorker' in navigator)) return; if (import.meta.env.MODE === 'mock') return; if (inMiniApp()) return; + const ch = clientChannel(); + if (ch === 'android' || ch === 'ios') return; void navigator.serviceWorker.register('sw.js').catch(() => {}); } diff --git a/ui/src/screens/Wallet.svelte b/ui/src/screens/Wallet.svelte index 1dbbe42..ff4c1c5 100644 --- a/ui/src/screens/Wallet.svelte +++ b/ui/src/screens/Wallet.svelte @@ -6,8 +6,9 @@ import { normalizeSubtype } from '../lib/platform'; import { t, i18n, type MessageKey } from '../lib/i18n/index.svelte'; import { executionContext, formatAmount, needsWebSpendWarning, spendableChips, type SpendContext } from '../lib/wallet'; - import { isGooglePlayBuild } from '../lib/distribution'; + import { isGooglePlayBuild, purchasesHidden } from '../lib/distribution'; import { onExternalLinkClick, openExternalUrl } from '../lib/links'; + import { gatewayOrigin } from '../lib/origin'; import { vkPlatform, vkShowOrderBox } from '../lib/vk'; import { telegramOpenInvoice } from '../lib/telegram'; import { rewardedReady, showRewarded } from '../lib/ads'; @@ -16,8 +17,9 @@ // The Wallet section: a compact chip balance, the active benefits, and the storefront. The store // splits into "buy chips" (chip packs, funded with money — a provider redirect) and "spend chips" - // (values bought with chips — an instant exchange). On the Google Play build the money purchases - // are hidden behind a RuStore stub (store policy), while spending already-earned chips still works. + // (values bought with chips — an instant exchange). When purchases are hidden — the Google Play + // build (behind a RuStore stub, store policy) or the native MVP that defers billing (a neutral + // note) — the money purchases disappear while spending already-earned chips still works. let wallet = $state(null); let catalog = $state(null); @@ -38,13 +40,16 @@ ); const gpBuild = isGooglePlayBuild(); + // Money purchases are hidden in the Google Play build (policy) and in the native MVP that defers + // billing; the RuStore-pointer stub shows only for the former (gpBuild). + const noPurchases = purchasesHidden(); // Money purchases are not permitted inside the VK iOS app (Apple ToS); the pack CTA is shown // muted and taps explain why, rather than hiding the storefront. VK's device family is not on the // client platformSubtype (server-derived) — read it from the signed vk_platform launch param. const purchaseBlocked = context === 'vk' && normalizeSubtype(vkPlatform()) === 'ios'; // The "other version" link points at this deployment's own site root (the landing lists every // platform), so it follows prod vs the contour without a hardcoded host. - const siteRoot = typeof location !== 'undefined' ? `${location.origin}/` : '/'; + const siteRoot = `${gatewayOrigin()}/`; const values = $derived(catalog?.products.filter((p) => p.kind === 'value') ?? []); const packs = $derived(catalog?.products.filter((p) => p.kind === 'pack') ?? []); @@ -237,8 +242,12 @@ > {/if} - {#if gpBuild} -

{t('wallet.gpStub')}

+ {#if noPurchases} + {#if gpBuild} +

{t('wallet.gpStub')}

+ {:else} +

{t('wallet.purchasesSoon')}

+ {/if} {:else} {#each packs as p (p.productId)}
diff --git a/ui/src/vite-env.d.ts b/ui/src/vite-env.d.ts index 02e18e8..f607cb6 100644 --- a/ui/src/vite-env.d.ts +++ b/ui/src/vite-env.d.ts @@ -2,8 +2,15 @@ /// interface ImportMetaEnv { - /** Base URL of the gateway Connect endpoint. Empty in dev (same-origin proxy). */ + /** Base URL of the gateway Connect endpoint. Empty in dev (same-origin proxy); set to the real + * gateway origin in a packaged native build. */ readonly VITE_GATEWAY_URL?: string; + /** "1" hides the in-app-currency purchase actions in the thin native MVP that defers store billing. */ + readonly VITE_PAYMENTS_DISABLED?: string; + /** Store listing URL the native update overlay opens for its "update" action (e.g. the RuStore page). */ + readonly VITE_STORE_URL?: string; + /** Bundled-dictionary version the native offline path requests; matches the packaged DAWG files. */ + readonly VITE_DICT_VERSION?: string; } interface ImportMeta { From 2ea91a8354be142b835555d4d7b6a24dd2835f5c Mon Sep 17 00:00:00 2001 From: Ilia Denisov Date: Sun, 12 Jul 2026 15:14:31 +0200 Subject: [PATCH 05/18] fix(e2e): pin Web Share off in the desktop export tests (macOS WebKit) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The three "plain desktop browser" export tests (the PNG and GCG downloads plus the legacy-Telegram clipboard copy) assumed navigator.share is absent — true for Chromium and for WebKit on the Linux CI host, but desktop WebKit on macOS exposes a working Web Share API. There shareUrlAsFile / pickGcgDelivery take the share branch, so no download event fires and the "GCG copied to the clipboard" toast never shows, and the tests failed only on macOS WebKit. Pin navigator.share/canShare off in those three tests (a withoutWebShare helper that mirrors the inverse stub the share-sheet test already uses), so the delivery path under test is deterministic and identical across engines and OSes. Test-only; no production change. Full e2e suite: 228 passed on Chromium + WebKit. --- ui/e2e/export.spec.ts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/ui/e2e/export.spec.ts b/ui/e2e/export.spec.ts index 54eb524..01e1d68 100644 --- a/ui/e2e/export.spec.ts +++ b/ui/e2e/export.spec.ts @@ -38,7 +38,20 @@ async function openFinishedHistory(page: Page): Promise { await expect(page.getByRole('button', { name: 'Export game' })).toBeVisible(); } +// Desktop WebKit (Safari's engine) exposes a working Web Share API, unlike Chromium and WebKit on +// Linux (the CI host). The "plain desktop browser" delivery paths tested below are reached only when +// Web Share is ABSENT — shareUrlAsFile / pickGcgDelivery fall through to the anchor download or the +// clipboard copy — so pin that precondition; otherwise macOS WebKit takes the share branch and no +// download or clipboard copy occurs. Mirrors the inverse stub the share-sheet test sets up. +async function withoutWebShare(page: Page): Promise { + await page.addInitScript(() => { + Object.defineProperty(navigator, 'share', { value: undefined, configurable: true }); + Object.defineProperty(navigator, 'canShare', { value: undefined, configurable: true }); + }); +} + test('the chooser downloads the PNG through the signed URL on a plain browser', async ({ page }) => { + await withoutWebShare(page); await routeDl(page); await openFinishedHistory(page); await page.getByRole('button', { name: 'Export game' }).click(); @@ -49,6 +62,7 @@ test('the chooser downloads the PNG through the signed URL on a plain browser', }); test('the chooser downloads the GCG through the same signed-URL route', async ({ page }) => { + await withoutWebShare(page); await routeDl(page); await openFinishedHistory(page); await page.getByRole('button', { name: 'Export game' }).click(); @@ -198,6 +212,7 @@ test('Telegram on iOS keeps the app chooser and opens the OS share sheet', async }); test('a legacy Telegram client (no downloadFile) hides the image and copies the GCG', async ({ page }) => { + await withoutWebShare(page); await page.addInitScript(() => { // Headless engines deny the real clipboard; a permissive stub keeps the legacy // copy path deterministic in both browsers. From a57fd355ba60b7dc68cb60d7fe7f53478a81ad45 Mon Sep 17 00:00:00 2001 From: Ilia Denisov Date: Sun, 12 Jul 2026 15:47:41 +0200 Subject: [PATCH 06/18] =?UTF-8?q?feat(gateway,ui):=20client-version=20gate?= =?UTF-8?q?=20=E2=80=94=20turn=20away=20too-old=20builds?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Introduce a minimum-supported-client gate so a future incompatible wire change can turn away installed builds too old to speak it, cleanly, instead of letting them crash on decode. It rides the outermost stable layer (an HTTP header), never the FlatBuffers payload. Gateway: - New internal/clientver: dependency-free parse + compare of the leading MAJOR.MINOR.PATCH (a git-describe suffix is tolerated). - GATEWAY_MIN_CLIENT_VERSION config (empty => gate dormant; validated at load). - connectsrv checks the X-Client-Version header before decoding the payload: Execute returns result_code="update_required" (before the registry lookup), Subscribe returns FailedPrecondition. It fails open on an absent or garbled header — the header is a client-controlled compatibility signal, not an access control. Client: - Attach X-Client-Version on every call. - A terminal update.svelte.ts store + a non-dismissable UpdateOverlay (native opens VITE_STORE_URL, web reloads); retry.ts maps FailedPrecondition to the update_required sentinel; a mock __update hook drives the e2e. Wire-additive and contour-safe: no FBS/proto regen, no schema migration; the gate stays dormant until GATEWAY_MIN_CLIENT_VERSION is deliberately set, so web / VK / Telegram behaviour is unchanged. The silent reconciliation seam is deferred to the offline-first work (its only caller). Tests: Go clientver/config/connectsrv gate tests, retry.test.ts, Playwright update.spec.ts. --- ANDROID_PLAN.md | 40 +++++--- gateway/cmd/gateway/main.go | 33 +++---- gateway/internal/clientver/clientver.go | 57 ++++++++++++ gateway/internal/clientver/clientver_test.go | 63 +++++++++++++ gateway/internal/config/config.go | 28 ++++-- gateway/internal/config/config_test.go | 23 +++++ gateway/internal/connectsrv/errors.go | 1 + gateway/internal/connectsrv/server.go | 66 +++++++++++++ gateway/internal/connectsrv/server_test.go | 98 ++++++++++++++++++-- ui/e2e/update.spec.ts | 34 +++++++ ui/src/App.svelte | 2 + ui/src/components/UpdateOverlay.svelte | 95 +++++++++++++++++++ ui/src/lib/gateway.ts | 4 + ui/src/lib/i18n/en.ts | 3 + ui/src/lib/i18n/ru.ts | 3 + ui/src/lib/retry.test.ts | 4 + ui/src/lib/retry.ts | 3 + ui/src/lib/transport.ts | 22 ++++- ui/src/lib/update.svelte.ts | 26 ++++++ 19 files changed, 558 insertions(+), 47 deletions(-) create mode 100644 gateway/internal/clientver/clientver.go create mode 100644 gateway/internal/clientver/clientver_test.go create mode 100644 ui/e2e/update.spec.ts create mode 100644 ui/src/components/UpdateOverlay.svelte create mode 100644 ui/src/lib/update.svelte.ts diff --git a/ANDROID_PLAN.md b/ANDROID_PLAN.md index 0312637..97791da 100644 --- a/ANDROID_PLAN.md +++ b/ANDROID_PLAN.md @@ -81,7 +81,17 @@ Kept current as parts land so a fresh session resumes without re-deriving. Verif `vite-env.d.ts`. `svelte-check` 0 errors, `vitest` 590 passed, web + native `vite build` clean; `?nopay`/`?gp` wallet states verified live via the Playwright MCP browser (the e2e runner can't fetch browsers in this sandbox — the states are covered by `e2e/wallet.spec.ts`, which CI runs). -- **C–G — pending.** +- **C. Client-version gate — ✅ DONE & verified (2026-07-12).** Server: new `gateway/internal/clientver` + (parse + compare), `GATEWAY_MIN_CLIENT_VERSION` config (empty ⇒ dormant, validated at load), and the + gate in `connectsrv` — `Execute` returns `result_code="update_required"` before the registry lookup, + `Subscribe` returns `FailedPrecondition`; fail-open on an absent/garbled header. Client: + `X-Client-Version` on every call (`transport.ts headers()`), a terminal `update.svelte.ts` store + + `UpdateOverlay.svelte` (native → `VITE_STORE_URL`, web → reload), `retry.ts` maps + `FailedPrecondition → update_required`, the `__update` mock hook. `gofmt`/`vet` clean, Go + `clientver`/config/`connectsrv` tests green, `svelte-check` 0, `vitest` 591, e2e 232 (incl. + `update.spec.ts`), client build clean. Silent reconciliation seam deferred to D (owner); in-app + store-update SDK noted Out of scope. +- **D–G — pending.** Open logistics (not code): **mandatory icon rebrand (future)** — author ONE vector master and generate *every* icon from it (web `favicon.svg` / PWA `icon-*` / maskable, Android adaptive, future iOS). Today @@ -287,7 +297,7 @@ is: scaffold → native-correct → gate → offline-first → CI → docs → r **Done when:** a native-flavoured build reaches the gateway, signs in as guest, plays a move, and the purchase actions are absent; `pnpm check` + `pnpm test:unit` pass. -### C. The client-version gate +### C. The client-version gate — ✅ DONE #### C1. Backend (gateway) @@ -364,10 +374,10 @@ purchase actions are absent; `pnpm check` + `pnpm test:unit` pass. before the throw. - catch (after `toGatewayError`, line 73) and the `subscribe()` catch: if the code is `UPDATE_REQUIRED`, call `reportUpdateRequired()` before rethrowing/`onError`. - - **Reconciliation exception:** provide a variant used by background guest-reconciliation that does - NOT call `reportUpdateRequired()` (it swallows the code and stays offline). Simplest: a boolean - on `exec`/a dedicated `authGuestSilent` path guarded by a flag; the executing session picks the - seam. Foreground `auth.*` keep the overlay behaviour. + - **Reconciliation exception — deferred to D (owner decision).** The silent update-path variant + (swallows `update_required` without raising the overlay) has no caller until D.4, so it is added + there with its caller rather than speculatively in C. In C every foreground call that gets + `update_required` raises the overlay; offline play never trips it (the network kill switch). - **`ui/src/lib/retry.ts` `toGatewayError()`**: add `case Code.FailedPrecondition: return new GatewayError('update_required', e.message);`. - **`ui/src/components/UpdateOverlay.svelte`** (new, mirror `MaintenanceOverlay.svelte`): non-dismissable; @@ -376,8 +386,10 @@ purchase actions are absent; `pnpm check` + `pnpm test:unit` pass. `update.title/body/action` (add siblings to the maintenance keys). - **`ui/src/App.svelte`**: import + place `` right after `` (line 139). - **Mock e2e hook** — `ui/src/lib/gateway.ts` mock branch, next to `__maint`: `__update = { on: reportUpdateRequired }`. -- **Tests:** `update.svelte.test.ts`; extend `retry.test.ts` (`FailedPrecondition → 'update_required'`); - Playwright `update.spec.ts` driving `__update.on()`. +- **Tests:** extend `retry.test.ts` (`FailedPrecondition → 'update_required'`) and drive the overlay via + Playwright `update.spec.ts` (`__update.on()`). The `update.svelte.ts` store is a `$state` rune module, + which this project's plugin-less `vitest` cannot import (`$state is not defined`); like every other + `*.svelte.ts` store it is covered by the e2e, not a unit test. **Done when:** Go `clientver` + gate tests pass; `pnpm check`/`test:unit`/`test:e2e` pass; a local gateway with `GATEWAY_MIN_CLIENT_VERSION=v99.0.0` shows the overlay, unset ⇒ unchanged. @@ -425,9 +437,10 @@ with no network**. `standalone && hasEmail` web gate for native), or bypass preload entirely on native since the dicts are bundled. 4. **Lazy server-guest reconciliation** — when native and online and no server session: background - `auth.guest` (the silent variant from C2), cache the session, adopt it; unlock online features. - Guard against duplicates (only when no cached session). Local games remain device-only. On - `update_required`, stay offline silently (no overlay). + `auth.guest`, cache the session, adopt it; unlock online features. Guard against duplicates (only + when no cached session). Local games remain device-only. **Add the silent update-path variant here** + (a flag on the transport `exec`/a dedicated silent `auth.guest`) so reconciliation swallows + `update_required` and stays offline — no overlay. This is the seam deferred from C. 5. **Ensure both offline modes render for the local guest.** `NewGame.svelte` gates the offline flows on `guest || offlineMode.active`; the local guest makes `offlineMode.active` true, so both the "quick" (vs_ai) and "with friends" (hotseat) flows show. Verify the vs_ai human seat uses the @@ -576,7 +589,10 @@ breaking release deliberately sets the min version. Google Play publication (beyond keeping the codebase variant-ready), iOS, OTA/live-updates, in-app purchases in the native build (RuStore billing SDK) and the GP anti-steering fix, VK/Telegram login in -the native build, a soft "recommended update" tier, native splash/status-bar plugins, push +the native build, a soft "recommended update" tier, **in-app store-update flows** (Google Play In-App +Updates API / RuStore In-App Update SDK — a future enhancement that would swap the update overlay's +action from opening the store listing to a store-driven immediate in-app update; needs a Capacitor +plugin bridge, and is orthogonal to the server-driven gate), native splash/status-bar plugins, push notifications (FCM), and automated RuStore-API upload. ## End-to-end verification diff --git a/gateway/cmd/gateway/main.go b/gateway/cmd/gateway/main.go index b0f3745..a3e92f7 100644 --- a/gateway/cmd/gateway/main.go +++ b/gateway/cmd/gateway/main.go @@ -221,22 +221,23 @@ func run(ctx context.Context, cfg config.Config, logger *zap.Logger) error { } registry := transcode.NewRegistry(backend, validator, regOpts...) edge := connectsrv.NewServer(connectsrv.Deps{ - Registry: registry, - Sessions: sessions, - Backend: backend, - Limiter: limiter, - Tracker: tracker, - Banlist: banlist, - Blocklist: blocklist, - Honeytoken: cfg.Abuse.Honeytoken, - VKAppSecret: cfg.VKAppSecret, - Hub: hub, - RateLimit: cfg.RateLimit, - Heartbeat: cfg.PushHeartbeatInterval, - Logger: logger, - AdminProxy: adminProxy, - Meter: tel.MeterProvider().Meter("scrabble/gateway/edge"), - MaxBodyBytes: cfg.MaxBodyBytes, + Registry: registry, + Sessions: sessions, + Backend: backend, + Limiter: limiter, + Tracker: tracker, + Banlist: banlist, + Blocklist: blocklist, + Honeytoken: cfg.Abuse.Honeytoken, + VKAppSecret: cfg.VKAppSecret, + Hub: hub, + RateLimit: cfg.RateLimit, + Heartbeat: cfg.PushHeartbeatInterval, + Logger: logger, + AdminProxy: adminProxy, + Meter: tel.MeterProvider().Meter("scrabble/gateway/edge"), + MaxBodyBytes: cfg.MaxBodyBytes, + MinClientVersion: cfg.MinClientVersion, }) // Bridge the backend push stream into the fan-out hub (and the out-of-app diff --git a/gateway/internal/clientver/clientver.go b/gateway/internal/clientver/clientver.go new file mode 100644 index 0000000..a0efc2e --- /dev/null +++ b/gateway/internal/clientver/clientver.go @@ -0,0 +1,57 @@ +// Package clientver parses and compares the leading MAJOR.MINOR.PATCH of a client +// version string so the edge can turn away a build too old to speak the current wire +// contract. It is deliberately dependency-free and tolerant: the version rides an HTTP +// header (X-Client-Version) that a build stamps from `git describe --tags`, so any +// `-N-gSHA` or `+meta` suffix is ignored, and anything unparseable is reported as such +// (the caller fails open — an absent or garbled header is never treated as too old). +package clientver + +import ( + "strconv" + "strings" +) + +// Version is a parsed semantic version triple. Only MAJOR.MINOR.PATCH participate in the +// ordering; any pre-release or build suffix is dropped at parse time. +type Version struct { + Major, Minor, Patch int +} + +// Parse extracts the leading MAJOR.MINOR.PATCH from s, tolerating an optional leading +// "v" and any `-N-gSHA` or `+meta` suffix (as produced by `git describe --tags`). It +// reports ok=false when s has fewer than three numeric components or any component is not +// an integer, so the caller can distinguish a real version from a dev/empty string. +func Parse(s string) (Version, bool) { + s = strings.TrimPrefix(strings.TrimSpace(s), "v") + if i := strings.IndexAny(s, "-+"); i >= 0 { + s = s[:i] + } + p := strings.SplitN(s, ".", 4) + if len(p) < 3 { + return Version{}, false + } + var v Version + var err error + if v.Major, err = strconv.Atoi(p[0]); err != nil { + return Version{}, false + } + if v.Minor, err = strconv.Atoi(p[1]); err != nil { + return Version{}, false + } + if v.Patch, err = strconv.Atoi(p[2]); err != nil { + return Version{}, false + } + return v, true +} + +// Less reports whether a orders before b by MAJOR, then MINOR, then PATCH. Equal versions +// are not Less than each other, so a client exactly at the minimum passes the gate. +func Less(a, b Version) bool { + if a.Major != b.Major { + return a.Major < b.Major + } + if a.Minor != b.Minor { + return a.Minor < b.Minor + } + return a.Patch < b.Patch +} diff --git a/gateway/internal/clientver/clientver_test.go b/gateway/internal/clientver/clientver_test.go new file mode 100644 index 0000000..22ccd81 --- /dev/null +++ b/gateway/internal/clientver/clientver_test.go @@ -0,0 +1,63 @@ +package clientver + +import "testing" + +// TestParse covers the version strings the edge actually sees: a plain and a "v"-prefixed +// triple, a `git describe --tags` suffix, build metadata, surrounding space, and the +// non-version strings (dev/empty/too-few/non-numeric) that must report ok=false so the +// gate fails open. +func TestParse(t *testing.T) { + tests := []struct { + name string + in string + want Version + wantK bool + }{ + {"plain", "1.16.0", Version{1, 16, 0}, true}, + {"v-prefixed", "v1.16.0", Version{1, 16, 0}, true}, + {"git describe suffix", "v1.16.0-3-gabc1234", Version{1, 16, 0}, true}, + {"build metadata", "1.16.0+ci42", Version{1, 16, 0}, true}, + {"surrounding space", " v2.0.1 ", Version{2, 0, 1}, true}, + {"extra component ignored", "v1.16.0.4", Version{1, 16, 0}, true}, + {"dev", "dev", Version{}, false}, + {"empty", "", Version{}, false}, + {"too few components", "1.16", Version{}, false}, + {"non-numeric patch", "1.16.x", Version{}, false}, + } + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + got, ok := Parse(tc.in) + if ok != tc.wantK { + t.Fatalf("Parse(%q) ok = %v, want %v", tc.in, ok, tc.wantK) + } + if ok && got != tc.want { + t.Errorf("Parse(%q) = %+v, want %+v", tc.in, got, tc.want) + } + }) + } +} + +// TestLess covers the ordering by MAJOR, then MINOR, then PATCH, and that an equal version +// is not Less (a client exactly at the minimum passes the gate). +func TestLess(t *testing.T) { + tests := []struct { + name string + a, b Version + want bool + }{ + {"equal", Version{1, 16, 0}, Version{1, 16, 0}, false}, + {"major less", Version{1, 9, 9}, Version{2, 0, 0}, true}, + {"major greater", Version{2, 0, 0}, Version{1, 9, 9}, false}, + {"minor less", Version{1, 16, 5}, Version{1, 17, 0}, true}, + {"minor greater", Version{1, 17, 0}, Version{1, 16, 9}, false}, + {"patch less", Version{1, 16, 0}, Version{1, 16, 1}, true}, + {"patch greater", Version{1, 16, 2}, Version{1, 16, 1}, false}, + } + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + if got := Less(tc.a, tc.b); got != tc.want { + t.Errorf("Less(%+v, %+v) = %v, want %v", tc.a, tc.b, got, tc.want) + } + }) + } +} diff --git a/gateway/internal/config/config.go b/gateway/internal/config/config.go index 2080c48..3ff7354 100644 --- a/gateway/internal/config/config.go +++ b/gateway/internal/config/config.go @@ -9,6 +9,7 @@ import ( "strings" "time" + "scrabble/gateway/internal/clientver" pkgtel "scrabble/pkg/telemetry" ) @@ -54,6 +55,11 @@ type Config struct { // MaxBodyBytes caps one inbound request body on the public listener and one // Connect message read; oversized requests are refused without buffering. MaxBodyBytes int + // MinClientVersion, when non-empty, is the lowest client version (MAJOR.MINOR.PATCH) + // the edge serves. A client reporting an older X-Client-Version is turned away with an + // "update required" signal before its payload is decoded. Empty leaves the gate dormant + // (every client is served) — the default for web-only deployments. + MinClientVersion string // RateLimit configures the in-memory anti-abuse limiter. RateLimit RateLimitConfig // Abuse configures the temporary IP ban and the honeytoken (prod-only). @@ -226,14 +232,15 @@ func (c VKIDConfig) Enabled() bool { func Load() (Config, error) { var err error c := Config{ - HTTPAddr: envOr("GATEWAY_HTTP_ADDR", defaultHTTPAddr), - LogLevel: envOr("GATEWAY_LOG_LEVEL", defaultLogLevel), - BackendHTTPURL: envOr("GATEWAY_BACKEND_HTTP_URL", defaultBackendHTTPURL), - BackendGRPCAddr: envOr("GATEWAY_BACKEND_GRPC_ADDR", defaultBackendGRPCAddr), - AdminUser: os.Getenv("GATEWAY_ADMIN_USER"), - AdminPassword: os.Getenv("GATEWAY_ADMIN_PASSWORD"), - ValidatorAddr: os.Getenv("GATEWAY_VALIDATOR_ADDR"), - VKAppSecret: os.Getenv("GATEWAY_VK_APP_SECRET"), + HTTPAddr: envOr("GATEWAY_HTTP_ADDR", defaultHTTPAddr), + LogLevel: envOr("GATEWAY_LOG_LEVEL", defaultLogLevel), + BackendHTTPURL: envOr("GATEWAY_BACKEND_HTTP_URL", defaultBackendHTTPURL), + BackendGRPCAddr: envOr("GATEWAY_BACKEND_GRPC_ADDR", defaultBackendGRPCAddr), + AdminUser: os.Getenv("GATEWAY_ADMIN_USER"), + AdminPassword: os.Getenv("GATEWAY_ADMIN_PASSWORD"), + ValidatorAddr: os.Getenv("GATEWAY_VALIDATOR_ADDR"), + VKAppSecret: os.Getenv("GATEWAY_VK_APP_SECRET"), + MinClientVersion: os.Getenv("GATEWAY_MIN_CLIENT_VERSION"), VKID: VKIDConfig{ AppID: os.Getenv("GATEWAY_VK_ID_APP_ID"), ClientSecret: os.Getenv("GATEWAY_VK_ID_CLIENT_SECRET"), @@ -332,6 +339,11 @@ func (c Config) validate() error { if c.MaxBodyBytes <= 0 { return fmt.Errorf("config: GATEWAY_MAX_BODY_BYTES must be positive") } + if c.MinClientVersion != "" { + if _, ok := clientver.Parse(c.MinClientVersion); !ok { + return fmt.Errorf("config: GATEWAY_MIN_CLIENT_VERSION %q is not a MAJOR.MINOR.PATCH version", c.MinClientVersion) + } + } if c.Abuse.BanEnabled && (c.Abuse.BanThreshold <= 0 || c.Abuse.BanWindow <= 0 || c.Abuse.BanDuration <= 0) { return fmt.Errorf("config: GATEWAY_ABUSE_BAN_THRESHOLD/_WINDOW/_DURATION must be positive when GATEWAY_ABUSE_BAN_ENABLED") } diff --git a/gateway/internal/config/config_test.go b/gateway/internal/config/config_test.go index 60ff87c..73bf800 100644 --- a/gateway/internal/config/config_test.go +++ b/gateway/internal/config/config_test.go @@ -47,6 +47,29 @@ func TestLoadMaxBodyBytes(t *testing.T) { } } +// TestLoadMinClientVersion verifies the client-version gate config: dormant (empty) by +// default, a parseable version accepted, and an unparseable one rejected. +func TestLoadMinClientVersion(t *testing.T) { + c, err := Load() + if err != nil { + t.Fatalf("Load: %v", err) + } + if c.MinClientVersion != "" { + t.Errorf("MinClientVersion = %q, want empty (gate dormant)", c.MinClientVersion) + } + t.Setenv("GATEWAY_MIN_CLIENT_VERSION", "v1.16.0") + if c, err = Load(); err != nil { + t.Fatalf("Load with a valid min version: %v", err) + } + if c.MinClientVersion != "v1.16.0" { + t.Errorf("MinClientVersion = %q, want %q", c.MinClientVersion, "v1.16.0") + } + t.Setenv("GATEWAY_MIN_CLIENT_VERSION", "dev") + if _, err := Load(); err == nil { + t.Fatal("Load: expected an error for an unparseable GATEWAY_MIN_CLIENT_VERSION, got nil") + } +} + // TestLoadAbuseDefaults verifies the anti-abuse ban defaults: disabled (prod-only), // the agreed thresholds, and no honeytoken. func TestLoadAbuseDefaults(t *testing.T) { diff --git a/gateway/internal/connectsrv/errors.go b/gateway/internal/connectsrv/errors.go index 68a14c6..838a68e 100644 --- a/gateway/internal/connectsrv/errors.go +++ b/gateway/internal/connectsrv/errors.go @@ -12,6 +12,7 @@ var ( errInternal = errors.New("internal error") errMissingToken = errors.New("missing session token") errInvalidSession = errors.New("invalid or expired session") + errUpdateRequired = errors.New("client too old, update required") ) // errUnknownMessageType reports an unregistered message type. diff --git a/gateway/internal/connectsrv/server.go b/gateway/internal/connectsrv/server.go index c8c9a52..c3c4853 100644 --- a/gateway/internal/connectsrv/server.go +++ b/gateway/internal/connectsrv/server.go @@ -26,6 +26,7 @@ import ( "golang.org/x/net/http2/h2c" "scrabble/gateway/internal/backendclient" + "scrabble/gateway/internal/clientver" "scrabble/gateway/internal/config" "scrabble/gateway/internal/push" "scrabble/gateway/internal/ratelimit" @@ -46,6 +47,16 @@ const heartbeatKind = "heartbeat" // spoofer, so trusting it is safe. const honeypotHeader = "X-Scrabble-Honeypot" +// clientVersionHeader carries the client build version (stamped from `git describe --tags`) so +// the edge can turn away a build too old to speak the current wire contract, before it decodes +// the payload. resultUpdateRequired is the stable envelope result_code — with the Subscribe +// counterpart connect.CodeFailedPrecondition — that any build, however old, recognises as +// "you must update". Both are part of the frozen wire contract (docs/ARCHITECTURE.md §2). +const ( + clientVersionHeader = "X-Client-Version" + resultUpdateRequired = "update_required" +) + // Limiter classes, the `class` attribute of gateway_rate_limited_total and the // class field of the periodic rejection report. const ( @@ -88,6 +99,11 @@ type Server struct { maxBodyBytes int + // minClient is the lowest client version served; gateOn is false when the gate is dormant + // (GATEWAY_MIN_CLIENT_VERSION empty or unparseable). + minClient clientver.Version + gateOn bool + publicPolicy ratelimit.Policy userPolicy ratelimit.Policy emailPolicy ratelimit.Policy @@ -128,6 +144,10 @@ type Deps struct { // MaxBodyBytes caps one inbound request body and one Connect message read; // zero or negative selects config.DefaultMaxBodyBytes. MaxBodyBytes int + // MinClientVersion is the lowest client version (MAJOR.MINOR.PATCH) the edge serves; an + // older X-Client-Version is turned away with "update required". Empty or unparseable leaves + // the gate dormant. + MinClientVersion string } // NewServer constructs the edge service. @@ -160,6 +180,18 @@ func NewServer(d Deps) *Server { if rl == (config.RateLimitConfig{}) { rl = config.DefaultRateLimit() } + // Parse the minimum client version once. Config.validate already rejects an unparseable + // value, so the warn branch only guards a direct (test) construction; an empty value leaves + // the gate dormant. + var minClient clientver.Version + gateOn := false + if d.MinClientVersion != "" { + if v, ok := clientver.Parse(d.MinClientVersion); ok { + minClient, gateOn = v, true + } else { + log.Warn("ignoring unparseable MinClientVersion; client-version gate disabled", zap.String("value", d.MinClientVersion)) + } + } return &Server{ registry: d.Registry, sessions: d.Sessions, @@ -176,6 +208,8 @@ func NewServer(d Deps) *Server { adminProxy: d.AdminProxy, metrics: newServerMetrics(d.Meter, blocklist), maxBodyBytes: maxBody, + minClient: minClient, + gateOn: gateOn, publicPolicy: ratelimit.PerMinute(rl.PublicPerMinute, rl.PublicBurst), userPolicy: ratelimit.PerMinute(rl.UserPerMinute, rl.UserBurst), emailPolicy: ratelimit.Per(rl.EmailPer10Min, 10*time.Minute, rl.EmailBurst), @@ -285,6 +319,22 @@ func (s *Server) abuseGuard(next http.Handler) http.Handler { }) } +// clientTooOld reports whether the X-Client-Version header names a version below the configured +// minimum. It fails open: with the gate dormant, or an absent or unparseable header, it returns +// false. The header is a client-controlled compatibility signal, not an access control (it is +// trivially spoofable), so a missing or garbled value — an old build predating the header, or a +// non-browser caller — must never be blocked spuriously. +func (s *Server) clientTooOld(header string) bool { + if !s.gateOn { + return false + } + v, ok := clientver.Parse(header) + if !ok { + return false + } + return clientver.Less(v, s.minClient) +} + // Execute runs one unary operation. Domain failures are returned in the envelope // (result_code != "ok", HTTP 200); only edge failures (rate limit, missing // session, unknown type, internal) become Connect errors. @@ -294,6 +344,17 @@ func (s *Server) Execute(ctx context.Context, req *connect.Request[edgev1.Execut result := "internal" defer func() { s.metrics.recordEdge(ctx, msgType, result, start) }() + // The version gate rides the outermost stable layer (an HTTP header) and is checked before + // the payload is decoded, so a too-old client makes zero successful calls but sees the + // recognizable update_required envelope rather than a decode crash (docs/ARCHITECTURE.md §2). + if s.clientTooOld(req.Header().Get(clientVersionHeader)) { + result = resultUpdateRequired + return connect.NewResponse(&edgev1.ExecuteResponse{ + RequestId: req.Msg.GetRequestId(), + ResultCode: resultUpdateRequired, + }), nil + } + op, ok := s.registry.Lookup(msgType) if !ok { result = "unknown_type" @@ -363,6 +424,11 @@ func (s *Server) Execute(ctx context.Context, req *connect.Request[edgev1.Execut // Subscribe streams the authenticated user's live events with a keep-alive // heartbeat until the client disconnects. func (s *Server) Subscribe(ctx context.Context, req *connect.Request[edgev1.SubscribeRequest], stream *connect.ServerStream[edgev1.Event]) error { + // A stream carries no result_code, so a too-old client is refused with the Connect + // FailedPrecondition counterpart of the update_required sentinel. + if s.clientTooOld(req.Header().Get(clientVersionHeader)) { + return connect.NewError(connect.CodeFailedPrecondition, errUpdateRequired) + } uid, _, _, err := s.resolve(ctx, req.Header(), peerIP(req.Peer().Addr, req.Header())) if err != nil { return err diff --git a/gateway/internal/connectsrv/server_test.go b/gateway/internal/connectsrv/server_test.go index 17dc3bc..45cca2a 100644 --- a/gateway/internal/connectsrv/server_test.go +++ b/gateway/internal/connectsrv/server_test.go @@ -22,8 +22,13 @@ import ( ) // newEdge wires a connectsrv.Server over a fake backend and returns a Connect -// client plus a cleanup func. +// client plus a cleanup func. The client-version gate is off. func newEdge(t *testing.T, backendHandler http.HandlerFunc) (edgev1connect.GatewayClient, func()) { + return newEdgeMin(t, "", backendHandler) +} + +// newEdgeMin is newEdge with the client-version gate armed at minVersion (empty leaves it off). +func newEdgeMin(t *testing.T, minVersion string, backendHandler http.HandlerFunc) (edgev1connect.GatewayClient, func()) { t.Helper() backendSrv := httptest.NewServer(backendHandler) backend, err := backendclient.New(backendSrv.URL, "localhost:9090", 2*time.Second) @@ -31,12 +36,13 @@ func newEdge(t *testing.T, backendHandler http.HandlerFunc) (edgev1connect.Gatew t.Fatalf("backendclient: %v", err) } edge := connectsrv.NewServer(connectsrv.Deps{ - Registry: transcode.NewRegistry(backend, nil), - Sessions: session.NewCache(backend, time.Minute, 100), - Limiter: ratelimit.New(), - Hub: push.NewHub(0), - RateLimit: config.DefaultRateLimit(), - Heartbeat: 15 * time.Second, + Registry: transcode.NewRegistry(backend, nil), + Sessions: session.NewCache(backend, time.Minute, 100), + Limiter: ratelimit.New(), + Hub: push.NewHub(0), + RateLimit: config.DefaultRateLimit(), + Heartbeat: 15 * time.Second, + MinClientVersion: minVersion, }) edgeSrv := httptest.NewServer(edge.HTTPHandler()) client := edgev1connect.NewGatewayClient(http.DefaultClient, edgeSrv.URL) @@ -108,6 +114,84 @@ func TestExecuteGuestGate(t *testing.T) { } } +// TestExecuteVersionGate verifies the client-version gate on the unary path: a build older +// than the configured minimum is turned away with the update_required result code before the +// registry lookup (an unknown message type is gated too, proving the short-circuit), while an +// equal, newer, absent, or unparseable version passes; and the gate is dormant when unset. +func TestExecuteVersionGate(t *testing.T) { + // The backend answers auth.guest with a session; a gated call never reaches it. + backend := func(w http.ResponseWriter, _ *http.Request) { + _, _ = w.Write([]byte(`{"token":"tok","user_id":"u-1","is_guest":true,"display_name":"Guest"}`)) + } + tests := []struct { + name string + min string + header string + msgType string + want string + }{ + {"too old is gated before lookup", "v1.16.0", "v1.0.0", "bogus.unknown", "update_required"}, + {"equal passes", "v1.16.0", "v1.16.0", transcode.MsgAuthGuest, "ok"}, + {"newer passes", "v1.16.0", "v2.0.0", transcode.MsgAuthGuest, "ok"}, + {"absent header fails open", "v1.16.0", "", transcode.MsgAuthGuest, "ok"}, + {"unparseable header fails open", "v1.16.0", "dev", transcode.MsgAuthGuest, "ok"}, + {"gate dormant when unset", "", "v1.0.0", transcode.MsgAuthGuest, "ok"}, + } + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + client, cleanup := newEdgeMin(t, tc.min, backend) + defer cleanup() + req := connect.NewRequest(&edgev1.ExecuteRequest{MessageType: tc.msgType, RequestId: "rq"}) + if tc.header != "" { + req.Header().Set("X-Client-Version", tc.header) + } + resp, err := client.Execute(context.Background(), req) + if err != nil { + t.Fatalf("execute: %v", err) + } + if got := resp.Msg.GetResultCode(); got != tc.want { + t.Fatalf("result_code = %q, want %q", got, tc.want) + } + }) + } +} + +// TestSubscribeVersionGate verifies the streaming path: a too-old client is refused with +// FailedPrecondition, while an equal or absent version is admitted and proceeds to auth (which +// fails Unauthenticated with no session, proving it passed the version gate). +func TestSubscribeVersionGate(t *testing.T) { + noBackend := func(_ http.ResponseWriter, _ *http.Request) {} + tests := []struct { + name string + min string + header string + want connect.Code + }{ + {"too old refused", "v1.16.0", "v1.0.0", connect.CodeFailedPrecondition}, + {"equal admitted then auth-gated", "v1.16.0", "v1.16.0", connect.CodeUnauthenticated}, + {"gate dormant admits", "", "v1.0.0", connect.CodeUnauthenticated}, + } + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + client, cleanup := newEdgeMin(t, tc.min, noBackend) + defer cleanup() + req := connect.NewRequest(&edgev1.SubscribeRequest{}) + if tc.header != "" { + req.Header().Set("X-Client-Version", tc.header) + } + stream, err := client.Subscribe(context.Background(), req) + if err == nil { + for stream.Receive() { + } + err = stream.Err() + } + if got := connect.CodeOf(err); got != tc.want { + t.Fatalf("code = %v, want %v", got, tc.want) + } + }) + } +} + func TestExecuteAuthedRequiresSession(t *testing.T) { client, cleanup := newEdge(t, func(w http.ResponseWriter, r *http.Request) { t.Error("backend must not be called without a session") diff --git a/ui/e2e/update.spec.ts b/ui/e2e/update.spec.ts new file mode 100644 index 0000000..baa7ca3 --- /dev/null +++ b/ui/e2e/update.spec.ts @@ -0,0 +1,34 @@ +import { expect, test } from './fixtures'; + +// The "update required" overlay is raised in prod when the edge's client-version gate turns away a +// too-old build (the update_required result_code on Execute, a Subscribe FailedPrecondition). The +// mock transport never produces one, so — like the maintenance overlay — the e2e drives it through +// the window.__update hook (gateway.ts, mock-only). It is app-global (mounted outside the route +// blocks in App.svelte), so it shows without a session, and it is terminal (no self-clearing poll). +test('update overlay covers the app when the client is too old', async ({ page }) => { + await page.goto('/'); + await expect(page.getByRole('alertdialog')).toHaveCount(0); + + await page.evaluate(() => (window as unknown as { __update: { on(): void } }).__update.on()); + const overlay = page.getByRole('alertdialog'); + await expect(overlay).toBeVisible(); + // One action button (EN "Update" / RU "Обновить" depending on locale). + await expect(overlay.getByRole('button', { name: /Update|Обновить/i })).toBeVisible(); +}); + +test('the update action reloads the web client', async ({ page }) => { + await page.goto('/'); + await page.evaluate(() => (window as unknown as { __update: { on(): void } }).__update.on()); + const overlay = page.getByRole('alertdialog'); + await expect(overlay).toBeVisible(); + + // On the web the action reloads the page to fetch the current client (on a native build it opens + // the store instead). The reload resets the terminal store, so the app re-bootstraps: the overlay + // is gone and the login is back. + await Promise.all([ + page.waitForEvent('load'), + overlay.getByRole('button', { name: /Update|Обновить/i }).click(), + ]); + await expect(page.getByRole('alertdialog')).toHaveCount(0); + await expect(page.getByRole('button', { name: /guest/i })).toBeVisible(); +}); diff --git a/ui/src/App.svelte b/ui/src/App.svelte index ad9fe2c..5003683 100644 --- a/ui/src/App.svelte +++ b/ui/src/App.svelte @@ -11,6 +11,7 @@ import WelcomeRedeemModal from './components/WelcomeRedeemModal.svelte'; import Coachmark from './components/Coachmark.svelte'; import MaintenanceOverlay from './components/MaintenanceOverlay.svelte'; + import UpdateOverlay from './components/UpdateOverlay.svelte'; import DebugPanel from './components/DebugPanel.svelte'; import Login from './screens/Login.svelte'; import Lobby from './screens/Lobby.svelte'; @@ -142,6 +143,7 @@ + -{#if app.offlinePrompt} - -{/if} - {#if routeIsLobby && !app.splashDone && !app.blocked && !app.bootError && !app.launchError} {/if} @@ -169,49 +154,6 @@ {/if} diff --git a/ui/src/components/UpdateOverlay.svelte b/ui/src/components/UpdateOverlay.svelte index b0e8676..36753d0 100644 --- a/ui/src/components/UpdateOverlay.svelte +++ b/ui/src/components/UpdateOverlay.svelte @@ -1,33 +1,29 @@ -{#if updateRequired.active} +{#if netState.versionLocked && !dismissed}

{t('update.title')}

{t('update.body')}

- +
+ + +
{/if} @@ -36,8 +32,7 @@ .scrim { position: fixed; inset: 0; - /* Above the game (z 60) and toasts (z 50) — a terminal update block covers everything the user - could otherwise interact with; below the dev DebugPanel (z 10000). */ + /* Above the game (z 60) and toasts (z 50); below the dev DebugPanel (z 10000). */ z-index: 100; background: rgba(0, 0, 0, 0.55); display: grid; @@ -79,6 +74,11 @@ color: var(--text-muted); line-height: 1.5; } + .acts { + display: flex; + flex-direction: column; + gap: 0.6rem; + } button { font: inherit; padding: 0.55rem 1.4rem; @@ -92,4 +92,13 @@ border-color: var(--accent); color: var(--accent); } + .primary { + background: var(--accent); + color: var(--accent-text); + border-color: var(--accent); + } + .primary:hover { + color: var(--accent-text); + opacity: 0.9; + } diff --git a/ui/src/lib/app.svelte.ts b/ui/src/lib/app.svelte.ts index 02e89b9..6a17009 100644 --- a/ui/src/lib/app.svelte.ts +++ b/ui/src/lib/app.svelte.ts @@ -56,8 +56,10 @@ import { } from './session'; import type { CoachSeries } from './coachmark'; import { connection, reportOffline, reportOnline, resetConnection, checkReachable } from './connection.svelte'; -import { offlineMode, setOfflineMode } from './offline.svelte'; -import { shouldBootOffline } from './offline'; +import { bootOffline, emit, initNetSignals, registerNetNudge, registerNetToast, registerRecovery } from './netstate.svelte'; +import { latchUpdateNudge } from './update.svelte'; +import { clearOfflinePref } from './offline'; +import { initNativeNetwork } from './native'; import { clientChannel } from './channel'; import { localGuestId } from './localguest'; import { isConnectionCode } from './retry'; @@ -80,10 +82,6 @@ export const app = $state<{ * backend was down during a deploy). App.svelte then renders the boot-error retry screen * instead of the web login — a Mini App has no manual sign-in to fall back to. */ bootError: boolean; - /** True while the cold-start "no connection — go offline?" dialog is up (the reachability check - * timed out with the network interface reportedly online). App.svelte renders it over the splash; - * bootstrap awaits the choice via resolveOfflinePrompt. */ - offlinePrompt: boolean; /** On the dedicated /telegram/ entry, set to a privacy-safe diagnostic snapshot when a Mini App * launch carried no sign-in data (empty initData). App.svelte then renders the compact * launch-error screen (screens/TelegramLaunchError) — a shareable probe for why Telegram @@ -160,7 +158,6 @@ export const app = $state<{ }>({ ready: false, bootError: false, - offlinePrompt: false, launchError: null, debugOpen: false, lobbyReady: false, @@ -574,82 +571,25 @@ async function adoptSession(s: Session): Promise { void refreshNotifications(); } -// The cold-start "no connection — go offline?" dialog. bootstrap raises it and awaits the choice -// here; App.svelte's dialog buttons call resolveOfflinePrompt. +// The cold-start reachability probe budget: how long the boot waits for the gateway to answer before +// launching from the cache into the implicit offline lobby (offline is auto-detected now — no dialog). const BOOT_REACHABILITY_TIMEOUT_MS = 3000; -let offlinePromptResolve: ((goOffline: boolean) => void) | null = null; - -/** resolveOfflinePrompt answers the cold-start "no connection — go offline?" dialog (App.svelte). */ -export function resolveOfflinePrompt(goOffline: boolean): void { - app.offlinePrompt = false; - const resolve = offlinePromptResolve; - offlinePromptResolve = null; - resolve?.(goOffline); -} - -/** promptOfflineChoice raises the dialog and resolves to the player's choice (true = go offline). */ -function promptOfflineChoice(): Promise { - app.offlinePrompt = true; - return new Promise((resolve) => { - offlinePromptResolve = resolve; - }); -} /** - * initNetworkReactivity reacts to mid-session network changes (e.g. the player toggling flight mode): - * losing the network interface enters offline mode automatically (session-only); regaining it - * verifies the gateway is really reachable (an interface being up does not guarantee it) and returns - * to online — but only if the offline was auto. A deliberate offline (the Settings toggle or the - * cold-start dialog) is left as the player's choice. These are passive OS events — no polling, no - * battery cost. Web-only and skipped in the mock (the e2e drives connectivity directly). + * recover is the smart recovery the net-state store's watcher runs while connecting/offline: a + * session-less native local guest reconciles a server guest (the reconcile attempt IS the reachability + * probe — it needs no prior session), while any cached-session launch does a cheap authenticated read. + * It resolves when the gateway is reachable (the store then heals to online) and rejects to stay offline. + * bootstrap wires it to the store, which owns the poll/backoff timer and the OS-signal listeners. */ -// While in auto-offline, poll for the network to return so the app comes back online — robust to the -// unreliable `online` event (which often does not fire in an installed PWA). Each tick is cheap: it -// reads navigator.onLine (no radio) and only hits the network (a reachability check) when the -// interface is actually up, so while flight mode is on it costs nothing. The poll runs ONLY in -// auto-offline (a deliberate offline is the player's choice) and stops on returning online. -let recoveryTimer: ReturnType | null = null; -export function scheduleRecovery(delayMs: number): void { - if (recoveryTimer) { - clearTimeout(recoveryTimer); - recoveryTimer = null; +async function recover(): Promise { + const channel = clientChannel(); + if ((channel === 'android' || channel === 'ios') && !app.session) { + await reconcileServerGuest(); + if (!app.session) throw new Error('still a local guest'); // reconcile did not adopt — stay offline + return; } - // Web / native only; under the mock the e2e drives connectivity + reconciliation directly (cf. - // initNetworkReactivity), so the poll must not race a mock reconcile to online before the spec can - // observe the offline lobby. - if (typeof window === 'undefined' || import.meta.env.MODE === 'mock' || !offlineMode.active || !offlineMode.auto) return; - recoveryTimer = setTimeout(async () => { - recoveryTimer = null; - if (!offlineMode.active || !offlineMode.auto) return; - const interfaceUp = typeof navigator === 'undefined' || navigator.onLine; - if (interfaceUp) { - if (!app.session) { - // A native local guest has no session token for checkReachable's authenticated probe, so the - // reconciliation attempt itself is the reachability check: it mints + adopts a server guest and - // clears the auto-offline on success (a no-op off the native channel or once a session exists). - await reconcileServerGuest(); - } else if (await checkReachable(BOOT_REACHABILITY_TIMEOUT_MS)) { - if (offlineMode.active && offlineMode.auto) setOfflineMode(false); - } - if (!offlineMode.active) return; // came back online - } - scheduleRecovery(4000); - }, delayMs); -} - -export function initNetworkReactivity(): void { - if (typeof window === 'undefined' || import.meta.env.MODE === 'mock') return; - window.addEventListener('offline', () => { - if (!offlineMode.active) { - setOfflineMode(true, false); // auto (session) - scheduleRecovery(4000); // poll for the network to return - } - }); - // The online event, when it fires, just kicks an immediate reachability check; the poll above is - // the reliable fallback for platforms where it does not fire. - window.addEventListener('online', () => { - if (offlineMode.active && offlineMode.auto) scheduleRecovery(0); - }); + if (!(await checkReachable(BOOT_REACHABILITY_TIMEOUT_MS))) throw new Error('gateway unreachable'); } // A concurrency guard: the boot kick, the recovery poll and the online event can all try to reconcile @@ -672,9 +612,10 @@ async function reconcileServerGuest(): Promise { reconcileInFlight = true; try { const s = await gateway.authGuestSilent(app.locale); - // The gateway answered, so leave auto-offline BEFORE adopting: adoptSession's profile fetch and live - // stream ride the normal (online) transport, which the offline kill switch would otherwise refuse. - if (offlineMode.active && offlineMode.auto) setOfflineMode(false); + // The gateway answered, so heal the machine to online BEFORE adopting: adoptSession's profile fetch + // and live stream ride the normal (online) transport, which the offline kill switch would otherwise + // refuse. emit('callOk') is idempotent when already online (a re-entrant recover after adoption). + emit('callOk'); await adoptSession(s); } catch { // A too-old client (update_required, swallowed — stay a local guest, no overlay) or an unreachable @@ -857,6 +798,9 @@ export async function bootstrap(): Promise { // has no real backend). Deliberately before any await, so even an early-return launch path // (e.g. the Telegram launch-error screen) still counts as an app open. if (import.meta.env.MODE !== 'mock') startLocalEvalMetrics(); + // One-time cleanup of the retired deliberate-offline preference (offline is implicit now — the key is + // never read again). Runs for every channel, before the Mini-App branches return. + clearOfflinePref(); const prefs = await loadPrefs(); app.theme = prefs.theme ?? 'auto'; app.reduceMotion = prefs.reduceMotion ?? false; @@ -966,37 +910,27 @@ export async function bootstrap(): Promise { // worker so the app is installable — Chromium needs a registered SW, notably on Android. Web-only // and skipped in the mock build; see lib/pwa.svelte. registerServiceWorker(); - // React to mid-session network changes (e.g. flight mode) for the rest of the session. - initNetworkReactivity(); - - // Deliberate offline mode carried over from a prior session: with no network the session adoption - // + profile fetch below would hang the splash, so skip them and launch straight from the cached - // session + profile into the offline lobby. Without a cached profile (e.g. storage cleared) fall - // through to the normal online flow but KEEP the sticky flag — the mode is the player's choice, and - // an online boot re-persists the profile so the next launch goes offline. (A truly offline launch - // with no cached profile is unreachable: enabling offline requires a prior online session.) - if (offlineMode.active) { - const [offlineSession, offlineProfile] = await Promise.all([loadSession(), loadProfile()]); - if (shouldBootOffline({ offlineActive: true, hasSession: !!offlineSession, hasProfile: !!offlineProfile })) { - gateway.setToken(offlineSession!.token); - app.session = offlineSession!; - app.profile = offlineProfile!; - if (router.route.name === 'login' || router.route.name === 'confirm') navigate('/'); - app.ready = true; - return; - } - } + // Wire the net-state machine's signal sources for the rest of the session: the OS connectivity hints + // (web navigator + native @capacitor/network), the smart recovery the store's watcher runs, and the + // offline/online toast. Reached only on web / native — the Telegram/VK branches returned above, so + // those channels are never fed an offline signal and the machine stays inert (always online) there. + registerNetToast((toast) => showToast(t(toast === 'offline' ? 'net.offline' : 'net.online'))); + registerNetNudge(latchUpdateNudge); + registerRecovery(recover); + initNetSignals(); + void initNativeNetwork(); const saved = await loadSession(); // A VK ID web-link callback (?code&device_id&state) rides the URL after the redirect back // from VK; capture and clear it here (it needs the restored session to link against). const vkcb = pendingVKLink(); if (saved) { - // Cold-start network auto-detect (deliberate offline is handled above). With a cached profile to - // fall back on and no pending VK-link, do not hang on adoptSession's retrying profile fetch when - // the network is down: a device with no network interface goes offline for the session (no - // dialog); an interface that is up but cannot reach the gateway within a short window asks the - // player. Web-only reaches here (the Mini-App branches returned above), so isStandalone gates it. + // Cold-start network auto-detect. With a cached profile to fall back on and no pending VK-link, do + // not hang on adoptSession's retrying profile fetch when the network is down: if the interface is + // down, or the gateway does not answer within a short window, launch straight from the cache into + // the implicit offline lobby (no dialog — offline is detected now). The store's recovery poll heals + // to online when the network returns. Web-only reaches here (the Mini-App branches returned above), + // so isStandalone gates it. const cachedProfile = await loadProfile(); const canOffline = !!cachedProfile && !vkcb && isStandalone() && !!cachedProfile.email; if (canOffline) { @@ -1004,21 +938,12 @@ export async function bootstrap(): Promise { gateway.setToken(saved.token); const reachable = interfaceOffline ? false : await checkReachable(BOOT_REACHABILITY_TIMEOUT_MS); if (!reachable) { - // No network interface → go offline for the session (no dialog); interface up but the - // gateway is unreachable → ambiguous, so ask. - const goOffline = interfaceOffline ? true : await promptOfflineChoice(); - if (goOffline) { - // A deliberate dialog choice is sticky; an auto (no-interface) offline is session-only. - setOfflineMode(true, !interfaceOffline); - if (interfaceOffline) scheduleRecovery(4000); // auto-offline: poll for the network to return - app.session = saved; - app.profile = cachedProfile; - if (router.route.name === 'login' || router.route.name === 'confirm') navigate('/'); - app.ready = true; - return; - } - // "Нет" — keep trying online: fall through to adoptSession (it retries; the connection - // watcher shows "Connecting…"). + bootOffline(); + app.session = saved; + app.profile = cachedProfile; + if (router.route.name === 'login' || router.route.name === 'confirm') navigate('/'); + app.ready = true; + return; } } await adoptSession(saved); @@ -1031,15 +956,14 @@ export async function bootstrap(): Promise { navigate('/'); } } else if (clientChannel() === 'android' || clientChannel() === 'ios') { - // Native offline-first cold boot: no cached server session, so enter as a device-local guest in a - // non-sticky (auto) offline mode and land straight in the lobby — never /login. reconcileServerGuest - // (kicked here and by the recovery poll) mints a server guest and clears the auto-offline once the - // gateway is reachable; until then the guest plays local vs_ai / hotseat with the APK's bundled - // dictionaries. Web / PWA / Telegram / VK keep the online-session rule below. + // Native offline-first cold boot: no cached server session, so enter as a device-local guest in the + // implicit offline lobby and land straight there — never /login. bootOffline(true) drops into offline + // and kicks the recovery poll now; recover() mints + adopts a server guest and heals to online once + // the gateway is reachable, and until then the guest plays local vs_ai / hotseat with the APK's + // bundled dictionaries. Web / PWA / Telegram / VK keep the online-session rule below. localGuestId(); // establish + persist the device-local identity from the very first launch - setOfflineMode(true, false); + bootOffline(true); // offline-first + kick reconciliation now, then poll until the network returns if (router.route.name === 'login' || router.route.name === 'confirm') navigate('/'); - scheduleRecovery(0); // kick reconciliation now, then poll until the network returns } else if (router.route.name !== 'login' && router.route.name !== 'confirm') { navigate('/login'); } @@ -1424,9 +1348,9 @@ if (import.meta.env.MODE === 'mock' && typeof window !== 'undefined') { navigate, route: () => router.route.name, }; - // Drive the native offline-first reconciliation from the e2e: the recovery poll that fires it in a - // real build is skipped under the mock (scheduleRecovery), so the spec calls this to simulate "the - // network returned" and prove a server guest is minted + adopted and the auto-offline clears. + // Drive the native offline-first reconciliation from the e2e: the net-state store's recovery poll that + // fires it in a real build is inert under the mock, so the spec calls this to simulate "the network + // returned" and prove a server guest is minted + adopted and the machine heals to online. (window as unknown as { __native?: { reconcile(): void } }).__native = { reconcile: () => void reconcileServerGuest(), }; diff --git a/ui/src/lib/connection.svelte.ts b/ui/src/lib/connection.svelte.ts index 03b30e5..d97c407 100644 --- a/ui/src/lib/connection.svelte.ts +++ b/ui/src/lib/connection.svelte.ts @@ -1,80 +1,49 @@ -// Global connectivity signal. `online` is false while the app is actively failing to -// reach the gateway — a unary call retrying after a transport/rate-limit failure, or the live -// stream dropped. The transport and the live-stream owner report transitions; the UI reads -// `connection.online` to show the "Connecting…" indicator and to softly disable proactive -// actions. In mock mode nothing ever reports trouble, so it simply stays online. -// -// Recovery is guaranteed by a reachability watcher: while offline it periodically fires a -// registered probe (a lightweight read) until one succeeds, so the indicator clears even when no -// other traffic is in flight. +// connection.svelte.ts is now a thin shim over the net-state store (netstate.svelte.ts, O2). It keeps +// the historical surface — `connection.online` plus the report/probe helpers the transport and the live +// stream call — so those consumers are unchanged while the single net-state machine drives everything +// underneath. `online` is true only in the fully-online machine state; a failing call or dropped stream +// reports via reportOffline, which enters the connecting hysteresis buffer once, and the store's probe +// then decides whether it becomes offline — so a transient blip never flips the chrome. -import { backoffMs } from './retry'; -import { offlineMode } from './offline.svelte'; - -let online = $state(true); -let watchTimer: ReturnType | null = null; -let probe: (() => Promise) | null = null; +import { + netState, + emit, + registerProbe as registerNetProbe, + checkReachable as checkNetReachable, + resetNetState, +} from './netstate.svelte'; export const connection = { - /** online is true when the app believes it can reach the gateway. */ + /** online is true when the app can reach the gateway (the fully-online machine state). */ get online(): boolean { - return online; + return netState.online; }, }; -/** registerProbe installs the reachability probe the watcher fires while offline. The transport - * wires a cheap authenticated read; it should reject when there is no session. */ +/** registerProbe installs the reachability probe the store's watcher fires while connecting/offline. + * The transport wires a cheap authenticated read; it should reject when there is no session. */ export function registerProbe(fn: () => Promise): void { - probe = fn; + registerNetProbe(fn); } -/** - * checkReachable runs the reachability probe once, bounded by timeoutMs, and reports whether the - * gateway answered — a single attempt (no retry loop), for the cold-start network decision — while - * updating the online signal. It reports false when no probe is registered or the timeout wins. - */ -export async function checkReachable(timeoutMs: number): Promise { - if (!probe) return false; - try { - await Promise.race([ - probe(), - new Promise((_, reject) => setTimeout(() => reject(new Error('reachability timeout')), timeoutMs)), - ]); - return true; - } catch { - return false; - } +/** checkReachable runs the reachability probe once, bounded by timeoutMs, and reports whether the + * gateway answered — a single attempt for the cold-start / recovery decision. */ +export function checkReachable(timeoutMs: number): Promise { + return checkNetReachable(timeoutMs); } -/** reportOnline marks the gateway reachable and stops the watcher. */ +/** reportOnline marks the gateway reachable — a successful round-trip heals the machine to online. */ export function reportOnline(): void { - online = true; - if (watchTimer) { - clearTimeout(watchTimer); - watchTimer = null; - } + emit('callOk'); } -/** reportOffline marks the gateway unreachable and starts the reachability watcher (once). */ +/** reportOffline reports a failing call or dropped stream. It opens the connecting hysteresis buffer + * once (only from online); the store's probe then decides whether it becomes offline. */ export function reportOffline(): void { - online = false; - if (!watchTimer && probe) scheduleProbe(1); + if (netState.online) emit('callFailed'); } /** resetConnection restores the online state and stops the watcher (e.g. on logout). */ export function resetConnection(): void { - reportOnline(); -} - -function scheduleProbe(attempt: number): void { - watchTimer = setTimeout( - () => { - watchTimer = null; - // Never probe the network in offline mode (the kill switch); the online/offline events drive - // recovery there instead. - if (online || !probe || offlineMode.active) return; - probe().then(reportOnline, () => scheduleProbe(Math.min(attempt + 1, 6))); - }, - backoffMs(attempt), - ); + resetNetState(); } diff --git a/ui/src/lib/dict/offlineready.ts b/ui/src/lib/dict/offlineready.ts deleted file mode 100644 index cc00dd7..0000000 --- a/ui/src/lib/dict/offlineready.ts +++ /dev/null @@ -1,27 +0,0 @@ -// Browser orchestration for the offline-toggle readiness wait. Lazily imported by -// offline.svelte.ts's requestOffline so the dict loader/generator it pulls in stays out of the main -// bundle. It runs the same cache-first preload as the background warmup (preload.ts), but bounded by -// a UI wait: it tells the toggle whether flipping to offline can succeed right now, and leaves the -// fetch running on a timeout so a later flip is instant. - -import type { Profile } from '../model'; -import { preloadDicts } from './preload'; -import { getDawg, dictLoadingDisabled } from '../dict'; -import { raceOfflineReady } from '../offline'; - -/** - * ensureOfflineDicts fetches the profile's enabled variants' dictionaries cache-first (instant when - * already warm, a network fetch otherwise) and reports, within budgetMs, whether every one is - * available — the offline toggle's readiness gate. With no enabled variant there is nothing to play - * offline, so it is never ready. The fetch is not aborted on a timeout; it keeps warming the - * on-device cache in the background so a later flip to offline succeeds immediately. - */ -export async function ensureOfflineDicts(prof: Profile, budgetMs: number): Promise { - if (prof.variantPreferences.length === 0) return false; - const run = preloadDicts(prof.dictVersions, prof.variantPreferences, { - getDawg, - disabled: dictLoadingDisabled, - retries: 1, - }); - return raceOfflineReady(run, budgetMs); -} diff --git a/ui/src/lib/gateway.ts b/ui/src/lib/gateway.ts index 1e62cdb..990b99f 100644 --- a/ui/src/lib/gateway.ts +++ b/ui/src/lib/gateway.ts @@ -7,8 +7,9 @@ import { MockGateway } from './mock/client'; import { createTransport } from './transport'; import { setForcedSeed } from './localgame/id'; import { reportOffline, reportOnline } from './connection.svelte'; +import { emit } from './netstate.svelte'; import { clearMaintenance, maintenanceRecovered, reportMaintenance } from './maintenance.svelte'; -import { reportUpdateRequired } from './update.svelte'; +import { reportUpdateRecommended, reportUpdateRequired } from './update.svelte'; const isMock = import.meta.env.MODE === 'mock'; @@ -32,9 +33,25 @@ if (isMock && typeof window !== 'undefined') { off: clearMaintenance, recover: maintenanceRecovered, }; - // The mock never receives a real update_required from the edge, so the e2e drives the terminal - // "update required" overlay directly (it is terminal — there is no clear hook). - (window as unknown as { __update?: { on(): void } }).__update = { on: reportUpdateRequired }; + // The mock never receives a real version signal from the edge, so the e2e drives them directly: + // __update.on() raises the hard-tier notice (netState.versionLocked), __update.recommend() raises the + // soft-tier nudge (versionRecommended → the setNudge latch, from online). + (window as unknown as { __update?: { on(): void; recommend(): void } }).__update = { + on: reportUpdateRequired, + recommend: reportUpdateRecommended, + }; + // The mock has no real transport, so the net-state store's probe watcher is inert; the e2e drives the + // machine directly. __net.offline() rides past the connecting hysteresis (k failures) into the offline + // lobby; __net.online() heals back to online (the "back online" toast fires from the offline state). + (window as unknown as { __net?: { offline(): void; online(): void } }).__net = { + offline: () => { + emit('callFailed'); + emit('probeFailed'); + emit('probeFailed'); + emit('probeFailed'); + }, + online: () => emit('callOk'), + }; // Drive the auto-match opponent join deterministically from the e2e (the mock otherwise // attaches a robot on a timer). ( diff --git a/ui/src/lib/i18n/en.ts b/ui/src/lib/i18n/en.ts index c7fec61..cb92099 100644 --- a/ui/src/lib/i18n/en.ts +++ b/ui/src/lib/i18n/en.ts @@ -7,12 +7,16 @@ export const en = { 'app.brand': 'Erudit', 'dict.loading': 'Loading…', 'connection.connecting': 'Connecting…', + 'net.offline': 'You are offline', + 'net.online': 'Back online', 'maintenance.title': 'Under maintenance', 'maintenance.body': 'Scrabble is briefly down for an update. It will be back in a moment — no need to reload the page.', 'maintenance.retry': 'Try again', 'update.title': 'Update required', 'update.body': 'This app is out of date and can no longer run. Download the update to keep playing — and winning.', 'update.action': 'Update', + 'update.playOffline': 'Play offline', + 'update.available': 'Update available', 'blocked.title': 'Account blocked', 'blocked.permanent': 'Your account is blocked.', @@ -219,15 +223,8 @@ export const en = { 'settings.labelsNone': 'None', 'settings.reduceMotion': 'Reduce motion', 'settings.zoomBoard': 'Zoom the board', - 'settings.offlineMode': 'Play mode', - 'settings.online': 'Online', 'settings.offline': 'Offline', - 'settings.offlineChecking': 'Loading dictionaries…', - 'settings.offlineNeedsData': 'Not enough data on the device. Internet access is needed to download it.', 'offline.preloadWarning': 'Poor internet connection. Some features may be unavailable.', - 'offline.promptTitle': 'No connection. Enable offline mode?', - 'offline.promptYes': 'Enable', - 'offline.promptNo': 'Keep trying', // --- wallet --- 'wallet.title': 'Wallet', @@ -378,6 +375,10 @@ export const en = { 'new.auto': 'Quick match', 'new.withFriends': 'Play with friends', + 'new.playRemote': 'Invite a friend', + 'new.playLocal': 'Pass and play', + 'new.needsNetwork': 'Online play needs a connection.', + 'new.dictUnavailable': "This dictionary isn't available offline yet.", 'new.pickFriends': 'Choose who to invite', 'new.searchFriends': 'Search friends', 'new.gameType': 'Variant', diff --git a/ui/src/lib/i18n/ru.ts b/ui/src/lib/i18n/ru.ts index ee855e0..f4c131d 100644 --- a/ui/src/lib/i18n/ru.ts +++ b/ui/src/lib/i18n/ru.ts @@ -8,12 +8,16 @@ export const ru: Record = { 'app.brand': 'Эрудит', 'dict.loading': 'Загрузка…', 'connection.connecting': 'Подключение…', + 'net.offline': 'Нет соединения', + 'net.online': 'Соединение восстановлено', 'maintenance.title': 'Технические работы', 'maintenance.body': 'Идёт короткое обновление игры. Мы скоро вернёмся — страницу перезагружать не нужно.', 'maintenance.retry': 'Повторить', 'update.title': 'Требуется обновление', 'update.body': 'Приложение устарело и не может продолжить работу. Загрузите обновлённую версию, чтобы продолжить играть и побеждать.', 'update.action': 'Обновить', + 'update.playOffline': 'Играть офлайн', + 'update.available': 'Доступно обновление', 'blocked.title': 'Учётная запись заблокирована', 'blocked.permanent': 'Ваша учётная запись заблокирована.', @@ -219,15 +223,8 @@ export const ru: Record = { 'settings.labelsNone': 'Без текста', 'settings.reduceMotion': 'Меньше анимаций', 'settings.zoomBoard': 'Приближать доску', - 'settings.offlineMode': 'Режим игры', - 'settings.online': 'Онлайн', 'settings.offline': 'Оффлайн', - 'settings.offlineChecking': 'Загрузка словарей…', - 'settings.offlineNeedsData': 'Недостаточно данных. Необходим доступ в интернет для загрузки.', 'offline.preloadWarning': 'Плохое соединение с интернет. Некоторые функции могут быть недоступны.', - 'offline.promptTitle': 'Нет связи. Включить офлайн-режим?', - 'offline.promptYes': 'Включить', - 'offline.promptNo': 'Ждать сеть', // --- wallet --- 'wallet.title': 'Кошелёк', @@ -378,6 +375,10 @@ export const ru: Record = { 'new.auto': 'Быстрая игра', 'new.withFriends': 'Игра с друзьями', + 'new.playRemote': 'Пригласить друга', + 'new.playLocal': 'На одном устройстве', + 'new.needsNetwork': 'Для игры онлайн нужна сеть.', + 'new.dictUnavailable': 'Этот словарь пока недоступен офлайн.', 'new.pickFriends': 'Кого пригласить', 'new.searchFriends': 'Поиск друзей', 'new.gameType': 'Вариант', diff --git a/ui/src/lib/lobbycache.test.ts b/ui/src/lib/lobbycache.test.ts index 1754a96..9e21401 100644 --- a/ui/src/lib/lobbycache.test.ts +++ b/ui/src/lib/lobbycache.test.ts @@ -44,10 +44,10 @@ beforeEach(() => clearLobby()); describe('patchLobbyGame', () => { it('replaces the matching game by id and leaves the others untouched', () => { - setLobby({ games: [gameView('a', 'active', 0), gameView('b', 'active', 0)], invitations: [], incoming: [], offline: false }); + setLobby({ games: [gameView('a', 'active', 0), gameView('b', 'active', 0)], invitations: [], incoming: [] }); // The player's own move flipped game "a" to the opponent's turn. patchLobbyGame(gameView('a', 'active', 1)); - const snap = getLobby(false); + const snap = getLobby(); expect(snap?.games.map((g) => g.id)).toEqual(['a', 'b']); expect(snap?.games.find((g) => g.id === 'a')?.toMove).toBe(1); expect(snap?.games.find((g) => g.id === 'b')?.toMove).toBe(0); @@ -55,27 +55,27 @@ describe('patchLobbyGame', () => { it('preserves invitations and incoming when patching a game', () => { const incoming: AccountRef[] = [{ accountId: 'u9', displayName: 'Nine' }]; - setLobby({ games: [gameView('a')], invitations: [], incoming, offline: false }); + setLobby({ games: [gameView('a')], invitations: [], incoming }); patchLobbyGame(gameView('a', 'finished')); - expect(getLobby(false)?.incoming).toEqual(incoming); - expect(getLobby(false)?.games[0].status).toBe('finished'); + expect(getLobby()?.incoming).toEqual(incoming); + expect(getLobby()?.games[0].status).toBe('finished'); }); it('adds the game when it is not yet in the cached lobby (a game started elsewhere)', () => { - setLobby({ games: [gameView('a')], invitations: [], incoming: [], offline: false }); + setLobby({ games: [gameView('a')], invitations: [], incoming: [] }); patchLobbyGame(gameView('z', 'active')); // Order is irrelevant — the lobby re-groups and re-sorts on render — so assert membership. - expect(getLobby(false)?.games.map((g) => g.id).sort()).toEqual(['a', 'z']); + expect(getLobby()?.games.map((g) => g.id).sort()).toEqual(['a', 'z']); }); it('is a no-op when there is no cached lobby yet', () => { patchLobbyGame(gameView('a')); - expect(getLobby(false)).toBeNull(); + expect(getLobby()).toBeNull(); }); it('does not mutate the previous snapshot array', () => { const games = [gameView('a', 'active', 0)]; - setLobby({ games, invitations: [], incoming: [], offline: false }); + setLobby({ games, invitations: [], incoming: [] }); patchLobbyGame(gameView('a', 'active', 1)); expect(games[0].toMove).toBe(0); // the original array/object is left intact }); @@ -83,59 +83,52 @@ describe('patchLobbyGame', () => { describe('patchLobbyInvitation', () => { it('adds a new pending invitation to the cached lobby', () => { - setLobby({ games: [], invitations: [], incoming: [], offline: false }); + setLobby({ games: [], invitations: [], incoming: [] }); patchLobbyInvitation(invitation('i1', 'pending')); - expect(getLobby(false)?.invitations.map((x) => x.id)).toEqual(['i1']); + expect(getLobby()?.invitations.map((x) => x.id)).toEqual(['i1']); }); it('replaces a pending invitation already in the list (e.g. an updated response)', () => { - setLobby({ games: [], invitations: [invitation('i1', 'pending'), invitation('i2', 'pending')], incoming: [], offline: false }); + setLobby({ games: [], invitations: [invitation('i1', 'pending'), invitation('i2', 'pending')], incoming: [] }); const updated = { ...invitation('i1', 'pending'), turnTimeoutSecs: 999 }; patchLobbyInvitation(updated); - expect(getLobby(false)?.invitations.map((x) => x.id)).toEqual(['i1', 'i2']); - expect(getLobby(false)?.invitations.find((x) => x.id === 'i1')?.turnTimeoutSecs).toBe(999); + expect(getLobby()?.invitations.map((x) => x.id)).toEqual(['i1', 'i2']); + expect(getLobby()?.invitations.find((x) => x.id === 'i1')?.turnTimeoutSecs).toBe(999); }); it('removes an invitation that reached a terminal status', () => { for (const terminal of ['declined', 'cancelled', 'started', 'expired']) { - setLobby({ games: [], invitations: [invitation('i1', 'pending'), invitation('i2', 'pending')], incoming: [], offline: false }); + setLobby({ games: [], invitations: [invitation('i1', 'pending'), invitation('i2', 'pending')], incoming: [] }); patchLobbyInvitation(invitation('i1', terminal)); - expect(getLobby(false)?.invitations.map((x) => x.id)).toEqual(['i2']); + expect(getLobby()?.invitations.map((x) => x.id)).toEqual(['i2']); } }); it('is a no-op for a terminal invitation that is not in the list', () => { - setLobby({ games: [], invitations: [invitation('i2', 'pending')], incoming: [], offline: false }); + setLobby({ games: [], invitations: [invitation('i2', 'pending')], incoming: [] }); patchLobbyInvitation(invitation('i1', 'declined')); - expect(getLobby(false)?.invitations.map((x) => x.id)).toEqual(['i2']); + expect(getLobby()?.invitations.map((x) => x.id)).toEqual(['i2']); }); it('is a no-op when there is no cached lobby yet', () => { patchLobbyInvitation(invitation('i1', 'pending')); - expect(getLobby(false)).toBeNull(); + expect(getLobby()).toBeNull(); }); it('preserves games and incoming when patching an invitation', () => { const incoming: AccountRef[] = [{ accountId: 'u9', displayName: 'Nine' }]; - setLobby({ games: [gameView('g1')], invitations: [], incoming, offline: false }); + setLobby({ games: [gameView('g1')], invitations: [], incoming }); patchLobbyInvitation(invitation('i1', 'pending')); - expect(getLobby(false)?.games.map((g) => g.id)).toEqual(['g1']); - expect(getLobby(false)?.incoming).toEqual(incoming); + expect(getLobby()?.games.map((g) => g.id)).toEqual(['g1']); + expect(getLobby()?.incoming).toEqual(incoming); }); }); -describe('getLobby is mode-aware (a mode flip must not render the other mode’s games)', () => { - it('returns the snapshot only for the mode it was stored under', () => { - setLobby({ games: [gameView('online1')], invitations: [], incoming: [], offline: false }); - expect(getLobby(false)?.games.map((g) => g.id)).toEqual(['online1']); - // Reading it as the OTHER (offline) mode must not surface the online snapshot. - expect(getLobby(true)).toBeNull(); - }); - - it('replaces the snapshot when the mode changes, so the stale mode is dropped', () => { - setLobby({ games: [gameView('online1')], invitations: [], incoming: [], offline: false }); - setLobby({ games: [gameView('local1')], invitations: [], incoming: [], offline: true }); - expect(getLobby(false)).toBeNull(); - expect(getLobby(true)?.games.map((g) => g.id)).toEqual(['local1']); +describe('the unified snapshot (one lobby cache — offline reuses its server games, greyed)', () => { + it('replaces the whole snapshot on each store, so the latest merged lists win', () => { + setLobby({ games: [gameView('online1')], invitations: [], incoming: [] }); + expect(getLobby()?.games.map((g) => g.id)).toEqual(['online1']); + setLobby({ games: [gameView('local1'), gameView('online2')], invitations: [], incoming: [] }); + expect(getLobby()?.games.map((g) => g.id)).toEqual(['local1', 'online2']); }); }); diff --git a/ui/src/lib/lobbycache.ts b/ui/src/lib/lobbycache.ts index 9ffc0e1..86e302a 100644 --- a/ui/src/lib/lobbycache.ts +++ b/ui/src/lib/lobbycache.ts @@ -10,18 +10,15 @@ interface LobbySnapshot { games: GameView[]; invitations: Invitation[]; incoming: AccountRef[]; - // Which mode the snapshot belongs to (offline = device-local games, online = server games). The - // lobby renders it instantly only when it matches the current mode, so a mode flip never flashes — - // or lets the player open — the other mode's games before the background refresh replaces them. - offline: boolean; } let snapshot: LobbySnapshot | null = null; -/** getLobby returns the last lobby lists for the given mode, or null before the first load or when - * the cached snapshot belongs to the other mode (so the lobby cold-renders after a mode flip). */ -export function getLobby(offline: boolean): LobbySnapshot | null { - return snapshot && snapshot.offline === offline ? snapshot : null; +/** getLobby returns the last lobby lists, or null before the first load. The unified lobby caches one + * snapshot (device-local + server games merged); offline reuses its server games, greyed, and drops + * the local ones for a fresh device read. */ +export function getLobby(): LobbySnapshot | null { + return snapshot; } /** setLobby stores the latest lobby lists. */ diff --git a/ui/src/lib/lobbysort.test.ts b/ui/src/lib/lobbysort.test.ts index 792535b..c8f758f 100644 --- a/ui/src/lib/lobbysort.test.ts +++ b/ui/src/lib/lobbysort.test.ts @@ -3,6 +3,9 @@ import { gamePhase, groupGames, isMyTurn, orderedSeats, scoreStanding, shouldBli import type { GameView, Seat } from './model'; const ME = 'me'; +// The self-id set the lobby passes (server user id + device-local guest id); ME is used as a bare seat +// id where a single seat is built, MINE where a function takes the whole "you" set. +const MINE = [ME]; const seat = (s: number, accountId: string): Seat => ({ seat: s, accountId, @@ -41,7 +44,7 @@ describe('groupGames', () => { game('b', 'active', 1, 100), // their turn game('c', 'finished', 0, 100), ], - ME, + MINE, {}, ); expect(g.yourTurn.map((x) => x.id)).toEqual(['a']); @@ -59,7 +62,7 @@ describe('groupGames', () => { game('f_new', 'finished', 0, 200), game('f_old', 'finished', 0, 100), ], - ME, + MINE, {}, ); expect(g.yourTurn.map((x) => x.id)).toEqual(['y_old', 'y_new']); @@ -77,7 +80,7 @@ describe('groupGames', () => { game('f_unread', 'finished', 0, 100), game('f_new', 'finished', 0, 300), // finished ignores unread, stays newest-first ], - ME, + MINE, { y_unread: true, t_unread: true, f_unread: true }, ); // Unread is the primary key, so it overrides the within-section activity order. @@ -88,9 +91,9 @@ describe('groupGames', () => { }); it('isMyTurn is false for a finished game even at my seat', () => { - expect(isMyTurn(game('x', 'finished', 0, 0), ME)).toBe(false); - expect(isMyTurn(game('x', 'active', 0, 0), ME)).toBe(true); - expect(isMyTurn(game('x', 'active', 1, 0), ME)).toBe(false); + expect(isMyTurn(game('x', 'finished', 0, 0), MINE)).toBe(false); + expect(isMyTurn(game('x', 'active', 0, 0), MINE)).toBe(true); + expect(isMyTurn(game('x', 'active', 1, 0), MINE)).toBe(false); }); it('treats an open game (awaiting an opponent) as in progress, not finished', () => { @@ -99,23 +102,36 @@ describe('groupGames', () => { game('open_mine', 'open', 0, 100), // my turn while waiting game('open_wait', 'open', 1, 100), // the empty seat's turn ], - ME, + MINE, {}, ); expect(g.yourTurn.map((x) => x.id)).toEqual(['open_mine']); expect(g.theirTurn.map((x) => x.id)).toEqual(['open_wait']); expect(g.finished).toEqual([]); - expect(isMyTurn(game('x', 'open', 0, 0), ME)).toBe(true); + expect(isMyTurn(game('x', 'open', 0, 0), MINE)).toBe(true); + }); + + it('recognises "you" under any of the self ids (local game under localGuestId, server under userId)', () => { + // After reconciliation a device-local game seats you under the local guest id and a server game + // under the user id; the two differ (ids never collide) and both must count as your turn. + const localGame: GameView = { ...game('local', 'active', 0, 100), seats: [seat(0, 'guest'), seat(1, 'robot')] }; + const serverGame: GameView = { ...game('server', 'active', 0, 100), seats: [seat(0, ME), seat(1, 'opp')] }; + const both = ['guest', ME]; + expect(isMyTurn(localGame, both)).toBe(true); + expect(isMyTurn(serverGame, both)).toBe(true); + expect(isMyTurn(localGame, [ME])).toBe(false); // a single id misses the other source's game + const g = groupGames([localGame, serverGame], both, {}); + expect(g.yourTurn.map((x) => x.id).sort()).toEqual(['local', 'server']); }); }); describe('gamePhase', () => { it('maps each game to its lobby bucket (open folds into mine/theirs like active)', () => { - expect(gamePhase(game('x', 'active', 0, 0), ME)).toBe('mine'); - expect(gamePhase(game('x', 'active', 1, 0), ME)).toBe('theirs'); - expect(gamePhase(game('x', 'open', 0, 0), ME)).toBe('mine'); - expect(gamePhase(game('x', 'open', 1, 0), ME)).toBe('theirs'); - expect(gamePhase(game('x', 'finished', 0, 0), ME)).toBe('finished'); + expect(gamePhase(game('x', 'active', 0, 0), MINE)).toBe('mine'); + expect(gamePhase(game('x', 'active', 1, 0), MINE)).toBe('theirs'); + expect(gamePhase(game('x', 'open', 0, 0), MINE)).toBe('mine'); + expect(gamePhase(game('x', 'open', 1, 0), MINE)).toBe('theirs'); + expect(gamePhase(game('x', 'finished', 0, 0), MINE)).toBe('finished'); }); }); @@ -131,38 +147,38 @@ describe('scoreStanding', () => { it('greens the leading viewer and reds a trailing one; the opponent stays muted', () => { const lead = withScores('active', 30, 10); - expect(scoreStanding(lead, ME, at(lead, ME))).toBe('win'); - expect(scoreStanding(lead, ME, at(lead, 'opp'))).toBeNull(); // a trailing opponent is not coloured + expect(scoreStanding(lead, MINE, at(lead, ME))).toBe('win'); + expect(scoreStanding(lead, MINE, at(lead, 'opp'))).toBeNull(); // a trailing opponent is not coloured const behind = withScores('active', 5, 10); - expect(scoreStanding(behind, ME, at(behind, ME))).toBe('lose'); - expect(scoreStanding(behind, ME, at(behind, 'opp'))).toBeNull(); // a leading opponent is not coloured + expect(scoreStanding(behind, MINE, at(behind, ME))).toBe('lose'); + expect(scoreStanding(behind, MINE, at(behind, 'opp'))).toBeNull(); // a leading opponent is not coloured }); it('greens both seats on an equal non-zero score', () => { const tie = withScores('active', 10, 10); - expect(scoreStanding(tie, ME, at(tie, ME))).toBe('win'); - expect(scoreStanding(tie, ME, at(tie, 'opp'))).toBe('win'); + expect(scoreStanding(tie, MINE, at(tie, ME))).toBe('win'); + expect(scoreStanding(tie, MINE, at(tie, 'opp'))).toBe('win'); }); it('leaves a fresh 0:0 board muted (nobody has scored yet)', () => { const fresh = withScores('active', 0, 0); - expect(scoreStanding(fresh, ME, at(fresh, ME))).toBeNull(); - expect(scoreStanding(fresh, ME, at(fresh, 'opp'))).toBeNull(); + expect(scoreStanding(fresh, MINE, at(fresh, ME))).toBeNull(); + expect(scoreStanding(fresh, MINE, at(fresh, 'opp'))).toBeNull(); }); it('is null for any non-active game (open or finished)', () => { const fin = withScores('finished', 30, 10); - expect(scoreStanding(fin, ME, at(fin, ME))).toBeNull(); + expect(scoreStanding(fin, MINE, at(fin, ME))).toBeNull(); const op = withScores('open', 0, 0); - expect(scoreStanding(op, ME, at(op, ME))).toBeNull(); + expect(scoreStanding(op, MINE, at(op, ME))).toBeNull(); }); it('is null when the viewer is not seated or has no opponent', () => { const g = withScores('active', 30, 10); - expect(scoreStanding(g, 'stranger', at(g, ME))).toBeNull(); + expect(scoreStanding(g, ['stranger'], at(g, ME))).toBeNull(); const solo: GameView = { ...game('g', 'active', 0, 0), seats: [{ ...seat(0, ME), score: 9 }] }; - expect(scoreStanding(solo, ME, solo.seats[0])).toBeNull(); + expect(scoreStanding(solo, MINE, solo.seats[0])).toBeNull(); }); it('compares against the strongest opponent in a multiplayer game', () => { @@ -175,8 +191,8 @@ describe('scoreStanding', () => { { ...seat(2, 'b'), score: 50 }, // b is ahead -> the viewer is losing ], }; - expect(scoreStanding(g3, ME, at(g3, ME))).toBe('lose'); - expect(scoreStanding(g3, ME, at(g3, 'b'))).toBeNull(); // a leading opponent is not coloured + expect(scoreStanding(g3, MINE, at(g3, ME))).toBe('lose'); + expect(scoreStanding(g3, MINE, at(g3, 'b'))).toBeNull(); // a leading opponent is not coloured }); it('greens every seat tied with the viewer for the lead in a multiplayer game', () => { @@ -189,9 +205,9 @@ describe('scoreStanding', () => { { ...seat(2, 'b'), score: 20 }, // trailing -> muted ], }; - expect(scoreStanding(g3, ME, at(g3, ME))).toBe('win'); - expect(scoreStanding(g3, ME, at(g3, 'a'))).toBe('win'); - expect(scoreStanding(g3, ME, at(g3, 'b'))).toBeNull(); + expect(scoreStanding(g3, MINE, at(g3, ME))).toBe('win'); + expect(scoreStanding(g3, MINE, at(g3, 'a'))).toBe('win'); + expect(scoreStanding(g3, MINE, at(g3, 'b'))).toBeNull(); }); }); diff --git a/ui/src/lib/lobbysort.ts b/ui/src/lib/lobbysort.ts index 09696d5..53d70c6 100644 --- a/ui/src/lib/lobbysort.ts +++ b/ui/src/lib/lobbysort.ts @@ -5,9 +5,12 @@ import type { GameView, Seat } from './model'; -/** isMyTurn reports whether an active game's seat-to-move belongs to the caller. */ -export function isMyTurn(game: GameView, myId: string): boolean { - const me = game.seats.find((s) => s.accountId === myId); +/** isMyTurn reports whether an active game's seat-to-move belongs to the caller. myIds carries every id + * that is "you" — the server user id and the device-local guest id — since after reconciliation a + * device-local game seats you under localGuestId while a server game seats you under the user id (the + * ids never collide). */ +export function isMyTurn(game: GameView, myIds: readonly string[]): boolean { + const me = game.seats.find((s) => myIds.includes(s.accountId)); // 'open' (an auto-match game still awaiting an opponent) is in progress like 'active'. return (game.status === 'active' || game.status === 'open') && !!me && game.toMove === me.seat; } @@ -21,16 +24,16 @@ export function isMyTurn(game: GameView, myId: string): boolean { * the result emoji instead), for a fresh 0:0 board where nobody has scored yet, and when myId is * not seated against an opponent. */ -export function scoreStanding(game: GameView, myId: string, seat: Seat): 'win' | 'lose' | null { +export function scoreStanding(game: GameView, myIds: readonly string[], seat: Seat): 'win' | 'lose' | null { if (game.status !== 'active') return null; - const me = game.seats.find((s) => s.accountId === myId); + const me = game.seats.find((s) => myIds.includes(s.accountId)); if (!me) return null; - const others = game.seats.filter((s) => s.accountId && s.accountId !== myId).map((s) => s.score); + const others = game.seats.filter((s) => s.accountId && !myIds.includes(s.accountId)).map((s) => s.score); if (!others.length) return null; const top = Math.max(me.score, ...others); if (top === 0) return null; // nobody has scored yet: leave the 0:0 board muted, like a finished game const meLeads = me.score === top; - if (seat.accountId === myId) return meLeads ? 'win' : 'lose'; + if (myIds.includes(seat.accountId)) return meLeads ? 'win' : 'lose'; // Another seat greens only when it ties the leading viewer at the top — the equal-score case. return meLeads && seat.score === top ? 'win' : null; } @@ -47,13 +50,13 @@ export function orderedSeats(game: GameView): GameView['seats'] { export type LobbyPhase = 'mine' | 'theirs' | 'finished'; /** - * gamePhase reports a game's lobby bucket for myId: 'finished' for any non-active/open status, + * gamePhase reports a game's lobby bucket for myIds: 'finished' for any non-active/open status, * else 'mine' when it is the caller's turn, else 'theirs'. It mirrors groupGames' partition and * drives the per-card blink, which fires when a card transitions into 'mine' or 'finished'. */ -export function gamePhase(game: GameView, myId: string): LobbyPhase { +export function gamePhase(game: GameView, myIds: readonly string[]): LobbyPhase { if (game.status !== 'active' && game.status !== 'open') return 'finished'; - return isMyTurn(game, myId) ? 'mine' : 'theirs'; + return isMyTurn(game, myIds) ? 'mine' : 'theirs'; } /** @@ -81,7 +84,7 @@ export interface LobbyGroups { */ export function groupGames( games: GameView[], - myId: string, + myIds: readonly string[], unread: Record, ): LobbyGroups { const yourTurn: GameView[] = []; @@ -89,7 +92,7 @@ export function groupGames( const finished: GameView[] = []; for (const g of games) { if (g.status !== 'active' && g.status !== 'open') finished.push(g); - else if (isMyTurn(g, myId)) yourTurn.push(g); + else if (isMyTurn(g, myIds)) yourTurn.push(g); else theirTurn.push(g); } // Unread is the primary key in the active sections (rank 1 before rank 0), last activity the tie-break. diff --git a/ui/src/lib/native.ts b/ui/src/lib/native.ts index 7ba5857..f25b85e 100644 --- a/ui/src/lib/native.ts +++ b/ui/src/lib/native.ts @@ -4,6 +4,7 @@ // statement is only ever reached inside the packaged native app. import { clientChannel } from './channel'; +import { emit } from './netstate.svelte'; /** * initNativeShell wires native-shell behaviour that only applies inside the packaged @@ -30,3 +31,25 @@ export async function initNativeShell(atNavigationRoot: () => boolean): Promise< } } +/** + * initNativeNetwork feeds the OS connectivity hint from @capacitor/network into the net-state machine + * (osOnline / osOffline) on the packaged native app. It is a hint only — the machine's probe still + * decides whether to actually go offline or heal to online — so on the web (which keeps navigator's + * online/offline events, wired by initNetSignals) this is a no-op and never loads the plugin. Tolerates + * a missing bridge (a WebView without the Network plugin) exactly like initNativeShell. + */ +export async function initNativeNetwork(): Promise { + const ch = clientChannel(); + if (ch !== 'android' && ch !== 'ios') return; + try { + const { Network } = await import('@capacitor/network'); + await Network.addListener('networkStatusChange', (status) => { + emit(status.connected ? 'osOnline' : 'osOffline'); + }); + } catch { + // No @capacitor/network bridge behind window.Capacitor (an e2e simulating native in a plain + // browser, or a WebView without the plugin): the native hint is unavailable, which is harmless — + // the gateway probe still drives the machine. + } +} + diff --git a/ui/src/lib/netstate.svelte.ts b/ui/src/lib/netstate.svelte.ts new file mode 100644 index 0000000..939a4d8 --- /dev/null +++ b/ui/src/lib/netstate.svelte.ts @@ -0,0 +1,196 @@ +// The reactive net-state store (O2): the single source of truth for the detected +// connectivity/version state, running the pure reducer (netstate.ts, O1) over a `$state` snapshot and +// owning the side-effects the reducer asks for — the probe/recovery watcher, the OS-signal listeners +// and the offline/online toast. connection.svelte.ts and offline.svelte.ts are now thin derived shims +// over this module, so their ~40 consumers keep reading `connection.online` / `offlineMode.active` +// unchanged while a single machine drives them underneath. +// +// The store is a leaf module: it never imports app.svelte.ts. The pieces that need app context — the +// smart recovery (reconcile-or-reachability) and the toast text (i18n) — are injected via +// register*() hooks the bootstrap wires, which also breaks what would otherwise be an import cycle. + +import { INITIAL, reduce, type Effect, type NetConfig, type NetEvent, type NetSnapshot } from './netstate'; +import { backoffMs } from './retry'; + +const isMock = import.meta.env.MODE === 'mock'; + +// Production hysteresis tuning (owner-confirmed). k = 3 consecutive probe failures ⇒ offline (a single +// blip is one failure, so it rides out in `connecting`); debounceMs is the wall-clock backstop for a +// slow, spaced-out failure sequence. Both sit on top of the transport's own retry/backoff. +const cfg: NetConfig = { k: 3, debounceMs: 15000 }; +// While offline, re-check reachability on this cadence (mirrors the old app.svelte.ts recovery poll). +const OFFLINE_POLL_MS = 4000; + +let snap = $state({ ...INITIAL }); + +/** netState exposes the reactive detected state; read the getters in markup / `$derived`. */ +export const netState = { + /** state is the raw machine state. */ + get state() { + return snap.state; + }, + /** online is true only when the gateway is reachable and the version accepted (full features). */ + get online() { + return snap.state === 'online'; + }, + /** connecting is true while a call/probe is failing but the anti-flap window has not elapsed. */ + get connecting() { + return snap.state === 'connecting'; + }, + /** offline is true in either offline state (the kill switch / blue chrome / local-only lobby). */ + get offline() { + return snap.state === 'offlineNoNetwork' || snap.state === 'offlineVersionLocked'; + }, + /** versionLocked is true when the client is below the hard minimum version (the Update notice). */ + get versionLocked() { + return snap.state === 'offlineVersionLocked'; + }, +}; + +// Injected hooks (dependency inversion — see the module comment). +let probeFn: (() => Promise) | null = null; +let recoverFn: (() => Promise) | null = null; +let toastFn: ((toast: 'offline' | 'online') => void) | null = null; +let nudgeFn: (() => void) | null = null; + +/** registerProbe installs the low-level reachability probe (a cheap authenticated read); the transport + * wires it, and checkReachable / the smart recovery use it. It should reject when there is no session. */ +export function registerProbe(fn: () => Promise): void { + probeFn = fn; +} + +/** registerRecovery installs the smart recovery the watcher runs while connecting/offline: reconcile a + * server guest when there is no session (native), otherwise a reachability check. It resolves when the + * gateway is reachable and rejects to stay offline. The bootstrap wires it. */ +export function registerRecovery(fn: () => Promise): void { + recoverFn = fn; +} + +/** registerNetToast installs the offline/online toast renderer (i18n text lives in app scope). */ +export function registerNetToast(fn: (toast: 'offline' | 'online') => void): void { + toastFn = fn; +} + +/** registerNetNudge installs the soft "update available" latch the setNudge effect fires. It runs only + * when the machine accepts a versionRecommended from online (O1), so the nudge never shows offline. */ +export function registerNetNudge(fn: () => void): void { + nudgeFn = fn; +} + +// The probe/recovery watcher: one self-rescheduling timer whose cadence follows the current state — +// exponential backoff while `connecting`, a fixed poll while `offlineNoNetwork`, and idle otherwise. It +// is inert under the mock (no real transport); the e2e drives transitions through the window hooks. +let timer: ReturnType | null = null; +let attempt = 0; +let probing = false; + +function stopTimer(): void { + if (timer) { + clearTimeout(timer); + timer = null; + } +} + +function arm(delayMs: number): void { + if (isMock) return; + stopTimer(); + timer = setTimeout(runProbe, delayMs); +} + +async function runProbe(): Promise { + timer = null; + const st = snap.state; + // Nothing to check when online, and the version lock only exits on an app update (a fresh boot). + if (st === 'online' || st === 'offlineVersionLocked') return; + if (probing || !recoverFn) return; + probing = true; + try { + await recoverFn(); + emit('probeOk'); + } catch { + emit('probeFailed'); + // Reschedule by the (possibly just-changed) state: keep backing off while connecting, poll while + // offline; stop once online / version-locked (the guard at the top of the next run). + if (snap.state === 'connecting') arm(backoffMs(Math.min(++attempt, 6))); + else if (snap.state === 'offlineNoNetwork') arm(OFFLINE_POLL_MS); + } finally { + probing = false; + } +} + +/** + * checkReachable runs the registered reachability probe once, bounded by timeoutMs, and reports whether + * the gateway answered — a single attempt for the cold-start / recovery decision. It reports false when + * no probe is registered or the timeout wins. + */ +export async function checkReachable(timeoutMs: number): Promise { + if (!probeFn) return false; + try { + await Promise.race([ + probeFn(), + new Promise((_, reject) => setTimeout(() => reject(new Error('reachability timeout')), timeoutMs)), + ]); + return true; + } catch { + return false; + } +} + +/** emit applies one event to the machine (stamping it with the current time — the reducer chose + * time-on-the-event) and runs the resulting effects. It is the single entry point every signal source + * funnels through. */ +export function emit(type: NetEvent): void { + const { next, effects } = reduce(snap, { type, at: Date.now() }, cfg); + snap = next; + for (const effect of effects) applyEffect(effect); +} + +function applyEffect(effect: Effect): void { + switch (effect.kind) { + case 'toast': + toastFn?.(effect.toast); + break; + case 'startProbe': + // Kick the watcher from the top of the backoff (entering connecting, or an osOnline hint). + attempt = 0; + arm(backoffMs(1)); + break; + case 'showVersionNotice': + // The Update/Play-offline notice (UpdateOverlay.svelte) reads netState.versionLocked directly, so + // this effect needs no side-effect here — the state transition is the signal. + break; + case 'setNudge': + // Latch the soft "update available" nudge (update.svelte.ts, wired via registerNetNudge). Fires + // only from online (O1), so the nudge is never raised while offline / version-locked. + nudgeFn?.(); + break; + } +} + +/** + * bootOffline drives the machine straight into offlineNoNetwork for a known-offline launch — a native + * device-local guest with no server session, or a web cached-session launch the reachability check + * could not confirm — and arms the recovery poll. It bypasses the connecting hysteresis on purpose: + * boot is not a mid-session flap, so there is nothing to ride out. Pass kickNow to start the recovery + * poll immediately (the native reconcile) rather than after the first interval. + */ +export function bootOffline(kickNow = false): void { + snap = { state: 'offlineNoNetwork', fails: 0, connectingSince: 0 }; + arm(kickNow ? 0 : OFFLINE_POLL_MS); +} + +/** initNetSignals wires the web connectivity hints (navigator online/offline) to the machine. The + * native @capacitor/network hint is wired separately in native.ts. A no-op under SSR and the mock (the + * e2e drives connectivity through the window hooks). */ +export function initNetSignals(): void { + if (typeof window === 'undefined' || isMock) return; + window.addEventListener('offline', () => emit('osOffline')); + window.addEventListener('online', () => emit('osOnline')); +} + +/** resetNetState returns the machine to online and stops the watcher (e.g. on logout). */ +export function resetNetState(): void { + stopTimer(); + attempt = 0; + snap = { state: 'online', fails: 0, connectingSince: 0 }; +} diff --git a/ui/src/lib/netstate.test.ts b/ui/src/lib/netstate.test.ts new file mode 100644 index 0000000..6aa4e3c --- /dev/null +++ b/ui/src/lib/netstate.test.ts @@ -0,0 +1,250 @@ +import { describe, it, expect } from 'vitest'; +import { + reduce, + INITIAL, + type NetConfig, + type NetEvent, + type NetInput, + type NetSnapshot, +} from './netstate'; + +// A deterministic config for the assertions: k = 3 (a single blip rides out; three consecutive +// failures trip offline) and a 1 s debounce window (the wall-clock anti-flap branch). +const cfg: NetConfig = { k: 3, debounceMs: 1000 }; + +// Event and snapshot builders keep the cases terse; `at` defaults to 0 where the debounce branch is +// irrelevant. +const e = (type: NetEvent, at = 0): NetInput => ({ type, at }); +const online: NetSnapshot = { state: 'online', fails: 0, connectingSince: 0 }; +const offline: NetSnapshot = { state: 'offlineNoNetwork', fails: 0, connectingSince: 0 }; +const locked: NetSnapshot = { state: 'offlineVersionLocked', fails: 0, connectingSince: 0 }; +const connecting = (over: Partial = {}): NetSnapshot => ({ + state: 'connecting', + fails: 0, + connectingSince: 0, + ...over, +}); + +// fold applies a sequence of inputs, threading the snapshot and collecting every emitted effect — +// the shape most edge cases assert against. +function fold(start: NetSnapshot, inputs: NetInput[], config: NetConfig) { + let snap = start; + const effects = []; + for (const ev of inputs) { + const r = reduce(snap, ev, config); + snap = r.next; + effects.push(...r.effects); + } + return { final: snap, effects }; +} + +describe('reduce — transition table', () => { + it('online + callFailed → connecting (starts a probe, counts the failure)', () => { + const r = reduce(online, e('callFailed', 100), cfg); + expect(r.next).toEqual({ state: 'connecting', fails: 1, connectingSince: 100 }); + expect(r.effects).toEqual([{ kind: 'startProbe' }]); + }); + + it('online + osOffline → connecting (starts a probe, no failure counted — a hint)', () => { + const r = reduce(online, e('osOffline', 100), cfg); + expect(r.next).toEqual({ state: 'connecting', fails: 0, connectingSince: 100 }); + expect(r.effects).toEqual([{ kind: 'startProbe' }]); + }); + + it('connecting + probeOk → online (silent; a blip must not thrash the chrome)', () => { + const r = reduce(connecting({ fails: 2, connectingSince: 100 }), e('probeOk', 200), cfg); + expect(r.next).toEqual(online); + expect(r.effects).toEqual([]); + }); + + it('connecting + callOk → online (silent)', () => { + const r = reduce(connecting({ fails: 1, connectingSince: 100 }), e('callOk', 200), cfg); + expect(r.next).toEqual(online); + expect(r.effects).toEqual([]); + }); + + it('connecting + a failure reaching K → offlineNoNetwork (toast "offline")', () => { + const r = reduce(connecting({ fails: cfg.k - 1, connectingSince: 0 }), e('probeFailed', 10), cfg); + expect(r.next).toEqual({ state: 'offlineNoNetwork', fails: 0, connectingSince: 0 }); + expect(r.effects).toEqual([{ kind: 'toast', toast: 'offline' }]); + }); + + it('offlineNoNetwork + osOnline → stays offline, triggers a probe (a hint never flips by itself)', () => { + const r = reduce(offline, e('osOnline', 100), cfg); + expect(r.next).toEqual(offline); + expect(r.effects).toEqual([{ kind: 'startProbe' }]); + }); + + it('offlineNoNetwork + probeOk → online (toast "back online")', () => { + const r = reduce(offline, e('probeOk', 100), cfg); + expect(r.next).toEqual(online); + expect(r.effects).toEqual([{ kind: 'toast', toast: 'online' }]); + }); + + it('offlineNoNetwork + callOk → online (toast "back online")', () => { + const r = reduce(offline, e('callOk', 100), cfg); + expect(r.next).toEqual(online); + expect(r.effects).toEqual([{ kind: 'toast', toast: 'online' }]); + }); + + it('any state + versionRejected → offlineVersionLocked (shows the notice once)', () => { + for (const start of [online, connecting({ fails: 1, connectingSince: 5 }), offline]) { + const r = reduce(start, e('versionRejected', 100), cfg); + expect(r.next).toEqual({ state: 'offlineVersionLocked', fails: 0, connectingSince: 0 }); + expect(r.effects).toEqual([{ kind: 'showVersionNotice' }]); + } + }); + + it('offlineVersionLocked + versionRejected (probe still rejected) → stays locked, no repeat notice', () => { + const r = reduce(locked, e('versionRejected', 100), cfg); + expect(r.next).toEqual(locked); + expect(r.effects).toEqual([]); + }); + + it('online + versionRecommended → online + a nudge', () => { + const r = reduce(online, e('versionRecommended', 100), cfg); + expect(r.next).toEqual(online); + expect(r.effects).toEqual([{ kind: 'setNudge' }]); + }); + + it('boot → connecting + startProbe from any state (resets the sticky lock)', () => { + for (const start of [online, offline, locked, connecting({ fails: 2, connectingSince: 5 })]) { + const r = reduce(start, e('boot', 100), cfg); + expect(r.next).toEqual({ state: 'connecting', fails: 0, connectingSince: 100 }); + expect(r.effects).toEqual([{ kind: 'startProbe' }]); + } + }); +}); + +describe('reduce — hysteresis (blip vs sustained)', () => { + it('a single fail then a success rides out inside connecting (no offline toast)', () => { + const { final, effects } = fold(online, [e('callFailed', 0), e('callOk', 200)], cfg); + expect(final).toEqual(online); + expect(effects).toEqual([{ kind: 'startProbe' }]); + }); + + it('K consecutive failures trip offlineNoNetwork', () => { + const { final, effects } = fold(online, [e('callFailed', 0), e('probeFailed', 10), e('probeFailed', 20)], cfg); + expect(final.state).toBe('offlineNoNetwork'); + expect(effects).toContainEqual({ kind: 'toast', toast: 'offline' }); + }); + + it('the debounce window trips offlineNoNetwork even below K', () => { + const { final } = fold(online, [e('osOffline', 0), e('probeFailed', cfg.debounceMs + 1)], cfg); + expect(final.state).toBe('offlineNoNetwork'); + }); + + it('a failure inside the debounce window and below K stays connecting', () => { + const { final } = fold(online, [e('osOffline', 0), e('probeFailed', cfg.debounceMs - 1)], cfg); + expect(final.state).toBe('connecting'); + expect(final.fails).toBe(1); + }); +}); + +describe('reduce — version gate (two tiers)', () => { + it('versionRecommended sets the nudge only from online', () => { + expect(reduce(online, e('versionRecommended', 0), cfg).effects).toEqual([{ kind: 'setNudge' }]); + for (const start of [connecting({ connectingSince: 0 }), offline, locked]) { + expect(reduce(start, e('versionRecommended', 0), cfg).effects).toEqual([]); + } + }); + + it('versionRejected from any state locks (the hard tier), superseding a pending soft nudge', () => { + const { final, effects } = fold(online, [e('versionRecommended', 0), e('versionRejected', 10)], cfg); + expect(final.state).toBe('offlineVersionLocked'); + expect(effects).toEqual([{ kind: 'setNudge' }, { kind: 'showVersionNotice' }]); + }); +}); + +describe('reduce — edge cases (#1–#12)', () => { + it('#1 rapid flap (fail→ok inside the window) never leaves connecting for offline', () => { + const { final, effects } = fold(online, [e('callFailed', 0), e('callOk', 50)], cfg); + expect(final).toEqual(online); + expect(effects).not.toContainEqual({ kind: 'toast', toast: 'offline' }); + }); + + it('#2 cold boot, no network → offlineNoNetwork', () => { + const { final } = fold( + INITIAL, + [e('boot', 0), e('osOffline', 1), e('probeFailed', 10), e('probeFailed', 20), e('probeFailed', 30)], + cfg, + ); + expect(final.state).toBe('offlineNoNetwork'); + }); + + it('#3 cold boot, gateway up but version < min → offlineVersionLocked + notice', () => { + const { final, effects } = fold(INITIAL, [e('boot', 0), e('versionRejected', 20)], cfg); + expect(final.state).toBe('offlineVersionLocked'); + expect(effects).toContainEqual({ kind: 'showVersionNotice' }); + }); + + it('#4 cold boot, session-less guest: the reconcile IS the probe — ok→online, fail→offline', () => { + expect(fold(INITIAL, [e('boot', 0), e('callOk', 20)], cfg).final).toEqual(online); + const failed = fold( + INITIAL, + [e('boot', 0), e('probeFailed', 10), e('probeFailed', 20), e('probeFailed', 30)], + cfg, + ); + expect(failed.final.state).toBe('offlineNoNetwork'); + }); + + it('#5 mid-session min-version bump → next call versionRejected → locked mid-play', () => { + const r = reduce(online, e('versionRejected', 100), cfg); + expect(r.next.state).toBe('offlineVersionLocked'); + expect(r.effects).toContainEqual({ kind: 'showVersionNotice' }); + }); + + it('#6 captive portal: osOnline fires but the gateway is down → probe fails → stays offline', () => { + const { final, effects } = fold(offline, [e('osOnline', 0), e('probeFailed', 10)], cfg); + expect(final.state).toBe('offlineNoNetwork'); + expect(effects).toEqual([{ kind: 'startProbe' }]); + }); + + it('#7 recovery race: probeOk then a queued callOk → one idempotent transition to online', () => { + const { final, effects } = fold(offline, [e('probeOk', 0), e('callOk', 1)], cfg); + expect(final).toEqual(online); + expect(effects.filter((x) => x.kind === 'toast')).toEqual([{ kind: 'toast', toast: 'online' }]); + }); + + it('#8 soft nudge then a hard reject → escalates to locked (notice after the nudge)', () => { + const { final, effects } = fold(online, [e('versionRecommended', 0), e('versionRejected', 10)], cfg); + expect(final.state).toBe('offlineVersionLocked'); + expect(effects).toEqual([{ kind: 'setNudge' }, { kind: 'showVersionNotice' }]); + }); + + it('#9 offlineVersionLocked is sticky — no connectivity event exits it; only boot does', () => { + const stuck: NetEvent[] = ['callOk', 'probeOk', 'osOnline', 'osOffline', 'callFailed', 'probeFailed', 'versionRecommended']; + for (const ev of stuck) { + expect(reduce(locked, e(ev, 100), cfg).next).toEqual(locked); + } + expect(reduce(locked, e('boot', 100), cfg).next.state).toBe('connecting'); + }); + + it('#10 offline → back online transitions cleanly (local-game persistence is O5, not the machine)', () => { + expect(fold(offline, [e('probeOk', 0)], cfg).final).toEqual(online); + }); + + it('#11 nothing forces the machine offline without a real failure/version signal (a stale pref cannot stick)', () => { + expect(reduce(INITIAL, e('boot', 0), cfg).next.state).toBe('connecting'); + const { final } = fold( + INITIAL, + [e('boot', 0), e('callOk', 10), e('osOnline', 20), e('versionRecommended', 30)], + cfg, + ); + expect(final.state).toBe('online'); + }); + + it('#12 TG/VK inertness: with only success/hint events the machine never leaves online', () => { + const { final, effects } = fold(online, [e('callOk', 0), e('probeOk', 10), e('osOnline', 20), e('callOk', 30)], cfg); + expect(final).toEqual(online); + expect(effects).toEqual([]); + }); +}); + +describe('reduce — purity', () => { + it('does not mutate the previous snapshot', () => { + const prev = Object.freeze({ state: 'connecting', fails: 1, connectingSince: 5 }); + expect(() => reduce(prev, e('probeFailed', 10), cfg)).not.toThrow(); + expect(prev).toEqual({ state: 'connecting', fails: 1, connectingSince: 5 }); + }); +}); diff --git a/ui/src/lib/netstate.ts b/ui/src/lib/netstate.ts new file mode 100644 index 0000000..1ed6ead --- /dev/null +++ b/ui/src/lib/netstate.ts @@ -0,0 +1,214 @@ +// The pure net-state machine (O1 of the offline-model redesign). A single reducer replaces the old +// two-layer connection.svelte.ts / offline.svelte.ts split: connectivity and the client-version gate +// collapse into one detected `state`, with an explicit hysteresis buffer so a brief network blip does +// not thrash the chrome. It is a pure function of (previous snapshot, event, config) — no timers, no +// storage, no reactivity — so every transition and the whole hysteresis are unit-tested in the node +// env and the machine is reusable verbatim by a future iOS shell. The reactive store, the probe timer +// and the event wiring live in O2 (netstate.svelte.ts); the effects returned here tell that store what +// to do (raise a toast, kick a probe, show the version notice, set the soft nudge). + +/** + * NetState is the single detected connectivity/version state. + * - `online` — the gateway is reachable and the client version is accepted; full features. It may + * additionally carry an orthogonal dismissible "update available" nudge (the soft tier) without + * leaving this state. + * - `connecting` — a call or probe is currently failing but the anti-flap window has not elapsed; + * the chrome stays online ("Connecting…"). Transient — never a kill switch. + * - `offlineNoNetwork` — sustained unreachable (hysteresis exceeded): offline mode (blue chrome, + * local-only active lobby, transport kill switch). Self-heals when a probe or call gets through. + * - `offlineVersionLocked` — the gateway is reachable but the version is below the hard minimum: + * offline mode plus the "Update / Play offline" notice. Sticky — it exits only via an app update + * (a fresh version on the next boot). + */ +export type NetState = 'online' | 'connecting' | 'offlineNoNetwork' | 'offlineVersionLocked'; + +/** + * NetEvent is every signal that can drive the machine. + * - `boot` — a fresh app start (the only exit from the sticky version lock). + * - `callOk` / `callFailed` — a foreground call succeeded / failed at the transport. + * - `probeOk` / `probeFailed` — the reachability probe succeeded / failed. + * - `osOnline` / `osOffline` — an OS connectivity hint (navigator / @capacitor/network); a hint only + * triggers a probe, it never decides the state by itself. + * - `versionRejected` — the hard gate refused the client as too old (update_required). + * - `versionRecommended` — the soft gate signalled an available (non-blocking) update. + */ +export type NetEvent = + | 'boot' + | 'callOk' + | 'callFailed' + | 'probeOk' + | 'probeFailed' + | 'osOnline' + | 'osOffline' + | 'versionRejected' + | 'versionRecommended'; + +/** NetConfig tunes the anti-flap hysteresis. */ +export interface NetConfig { + /** + * k is the consecutive-failure threshold that trips `connecting` → `offlineNoNetwork`. It must be + * at least 2 so a single blip (one failure then a success) rides out inside `connecting`. + */ + k: number; + /** + * debounceMs is the wall-clock anti-flap window (the design's `OFFLINE_DEBOUNCE_MS`): a failure + * whose timestamp is at least this far past the moment `connecting` was entered also trips + * `offlineNoNetwork`, even below k. This bounds how long a slow, spaced-out failure sequence can + * hold the chrome in "Connecting…". + */ + debounceMs: number; +} + +/** + * NetSnapshot is the machine's full memory. Beyond the visible `state` it carries the hysteresis + * bookkeeping (`fails`, `connectingSince`) so the reducer stays pure while still deciding both the + * count-based and the time-based anti-flap branches; both are zero outside `connecting`. + */ +export interface NetSnapshot { + /** state is the current detected state. */ + state: NetState; + /** fails counts consecutive failure signals accrued while `connecting` (0 in every other state). */ + fails: number; + /** + * connectingSince is the timestamp `connecting` was entered; the debounce window is measured from + * it (0 while not `connecting`). + */ + connectingSince: number; +} + +/** NetInput is an event stamped with the wall-clock time it occurred at; only the debounce branch + * reads `at`, and callers stamp `Date.now()`. */ +export interface NetInput { + /** type is the event. */ + type: NetEvent; + /** at is the event's timestamp in milliseconds. */ + at: number; +} + +/** + * Effect is a side-effect the reducer asks the O2 store to perform. It is data, not an action — the + * reducer never runs it. + * - `toast` — show the offline / back-online toast. + * - `startProbe` — kick the reachability probe (entering `connecting`, or on an `osOnline` hint). + * - `showVersionNotice` — raise the "Update / Play offline" notice (entering the version lock). + * - `setNudge` — latch the dismissible "update available" soft nudge. + */ +export type Effect = + | { kind: 'toast'; toast: 'offline' | 'online' } + | { kind: 'startProbe' } + | { kind: 'showVersionNotice' } + | { kind: 'setNudge' }; + +/** NetResult is a reduction: the next snapshot plus the effects the store should perform. */ +export interface NetResult { + /** next is the snapshot after applying the event. */ + next: NetSnapshot; + /** effects are the side-effects the O2 store should run, in order. */ + effects: Effect[]; +} + +/** + * INITIAL is the optimistic pre-boot snapshot: `online` until proven otherwise. The O2 store emits a + * `boot` event on start, which immediately moves the machine to `connecting` and kicks a probe. + */ +export const INITIAL: NetSnapshot = { state: 'online', fails: 0, connectingSince: 0 }; + +function onlineSnapshot(): NetSnapshot { + return { state: 'online', fails: 0, connectingSince: 0 }; +} + +function enterConnecting(at: number, fails: number): NetResult { + return { next: { state: 'connecting', fails, connectingSince: at }, effects: [{ kind: 'startProbe' }] }; +} + +/** + * reduce applies one event to the machine and returns the next snapshot plus the effects the store + * should perform. It is a pure function: it never mutates `prev`, reads the clock, or runs an effect. + * + * `boot` and `versionRejected` are handled first because they fire from any state: `boot` resets the + * machine (the sole exit from the sticky version lock), and `versionRejected` (the hard tier) always + * supersedes into `offlineVersionLocked`. + */ +export function reduce(prev: NetSnapshot, ev: NetInput, cfg: NetConfig): NetResult { + // A fresh app start: reachability is unknown, so enter `connecting` and kick a probe; the probe / + // version result then resolves online, offlineNoNetwork or offlineVersionLocked. This is the only + // transition that leaves the sticky version lock (a possibly-newer build). + if (ev.type === 'boot') { + return enterConnecting(ev.at, 0); + } + + // The hard version gate supersedes everything and is sticky. The notice is raised once, on entry; + // a repeated rejection while already locked changes nothing. + if (ev.type === 'versionRejected') { + const effects: Effect[] = prev.state === 'offlineVersionLocked' ? [] : [{ kind: 'showVersionNotice' }]; + return { next: { state: 'offlineVersionLocked', fails: 0, connectingSince: 0 }, effects }; + } + + switch (prev.state) { + case 'offlineVersionLocked': + // Sticky: no connectivity event exits it. A probe may reach the gateway, but real calls stay + // version-gated, so only `boot` / `versionRejected` (both handled above) touch this state. + return { next: prev, effects: [] }; + + case 'online': + switch (ev.type) { + case 'callFailed': + case 'probeFailed': + // A real failure opens the hysteresis window (probe + timer); this first failure counts. + return enterConnecting(ev.at, 1); + case 'osOffline': + // An OS hint only opens the window and a probe — it never decides offline by itself, so it + // enters `connecting` with no failure counted. + return enterConnecting(ev.at, 0); + case 'versionRecommended': + // The soft tier nudges only from online; play continues. + return { next: prev, effects: [{ kind: 'setNudge' }] }; + default: + // callOk / probeOk / osOnline: already online — idempotent, no effect. + return { next: prev, effects: [] }; + } + + case 'connecting': + switch (ev.type) { + case 'callOk': + case 'probeOk': + // Recovery is immediate on the first success — a blip resolves silently (no toast). + return { next: onlineSnapshot(), effects: [] }; + case 'callFailed': + case 'probeFailed': { + const fails = prev.fails + 1; + const sustained = fails >= cfg.k || ev.at - prev.connectingSince >= cfg.debounceMs; + if (sustained) { + return { + next: { state: 'offlineNoNetwork', fails: 0, connectingSince: 0 }, + effects: [{ kind: 'toast', toast: 'offline' }], + }; + } + return { next: { ...prev, fails }, effects: [] }; + } + case 'osOnline': + // A positive hint triggers an immediate probe but never flips to online by itself. + return { next: prev, effects: [{ kind: 'startProbe' }] }; + default: + // osOffline (already probing) / versionRecommended (no nudge outside online): no-op. + return { next: prev, effects: [] }; + } + + case 'offlineNoNetwork': + switch (ev.type) { + case 'callOk': + case 'probeOk': + // The probe (or a reconcile call) won — self-heal to online with a "back online" toast. + return { next: onlineSnapshot(), effects: [{ kind: 'toast', toast: 'online' }] }; + case 'osOnline': + // Trigger a probe; stay offline until it actually wins (a captive portal can report online). + return { next: prev, effects: [{ kind: 'startProbe' }] }; + default: + // callFailed / probeFailed / osOffline (still offline), versionRecommended (no nudge): no-op. + return { next: prev, effects: [] }; + } + } + + // Unreachable: the switch above is exhaustive over NetState. Kept so the function is total. + return { next: prev, effects: [] }; +} diff --git a/ui/src/lib/offline.svelte.ts b/ui/src/lib/offline.svelte.ts index b355ee7..6991c9c 100644 --- a/ui/src/lib/offline.svelte.ts +++ b/ui/src/lib/offline.svelte.ts @@ -1,68 +1,39 @@ -// The deliberate offline MODE: a sticky, device-scoped reactive flag the app reads to gate the -// network, tint the chrome blue and show only local games. It is the player's own choice (the -// Settings toggle is the source of truth), distinct from connection.svelte.ts's transient -// gateway-reachability signal. The pure persistence + readiness logic lives in offline.ts. +// offline.svelte.ts: the offline-mode read surface (a thin shim over the net-state store, +// netstate.svelte.ts) plus the orthogonal dictionary-preload warning + background preload. Offline is +// implicit — detected by the net-state machine — so offlineMode.active just derives from netState; there +// is no deliberate toggle. The dict-preload pieces are unrelated to connectivity and stay live here. -import { loadOfflinePref, saveOfflinePref, offlinePreloadEligible } from './offline'; +import { netState } from './netstate.svelte'; +import { offlinePreloadEligible } from './offline'; import { isStandalone } from './pwa'; import { insideTelegram } from './telegram'; import { insideVK } from './vk'; import type { Profile } from './model'; -// Not named `state` (a svelte-check hazard: `$state` would then read as a store subscription). -let active = $state(loadOfflinePref()); -// True while the current offline state was entered automatically (no network detected), not chosen -// by the player. An auto offline self-heals to online when the network returns; a deliberate one is -// left as the player's choice. -let auto = $state(false); +/** + * offlineCapable reports whether this channel supports the offline model — implicit offline mode, + * device-local games (vs_ai and hotseat) and the transport kill switch. Native builds and the plain web + * app do; the Telegram and VK mini-apps are online-only wrappers, so the whole offline model stays inert + * there (offlineMode.active is forced false regardless of the detected net state, and the create flow + * hides its device-local segment). + */ +export function offlineCapable(): boolean { + return !insideTelegram() && !insideVK(); +} /** offlineMode exposes the reactive offline flags; read them in markup / $derived. */ export const offlineMode = { - /** active is true while the app is in offline mode (deliberate or auto-detected). */ + /** active is true while the app is offline (the machine's offlineNoNetwork / offlineVersionLocked) on a + * channel that supports offline play; it is always false in the online-only Telegram/VK mini-apps, so + * every offline-model consumer (chrome, lobby, kill switch, device-local create) stays inert there. */ get active(): boolean { - return active; - }, - /** auto is true while offline was entered automatically (no network), not by the player. */ - get auto(): boolean { - return auto; + return netState.offline && offlineCapable(); }, }; -/** - * setOfflineMode enters or leaves offline mode. By default it persists the choice (device-scoped) — - * a deliberate choice (the Settings toggle, or the cold-start "no connection" dialog). Pass - * persist=false for a transient, auto-detected offline (a cold start with no network interface): the - * flag holds for the session but is not saved, so the next launch re-evaluates the network. - */ -export function setOfflineMode(on: boolean, persist = true): void { - active = on; - auto = on && !persist; // a non-persisted offline is auto-detected; a persisted one is deliberate - if (persist) saveOfflinePref(on); -} - -/** The toggle-flip readiness wait: entering offline waits at most this long for the enabled - * variants' dictionaries before reverting to online (the fetch then continues in the background). */ -export const TOGGLE_READY_BUDGET_MS = 5000; - -/** - * requestOffline attempts to enter offline mode from the Settings toggle. It fetches the enabled - * variants' dictionaries cache-first and, if every one is available within the readiness budget, - * switches to a deliberate (persisted) offline mode and returns true. Otherwise it stays online and - * returns false — the caller shows the "needs internet" note — while the fetch keeps warming the - * cache so a later flip is instant. The readiness glue and the dict loader are imported dynamically, - * so neither is pulled into the main bundle. Returns false with no profile. - */ -export async function requestOffline(prof: Profile | null, budgetMs = TOGGLE_READY_BUDGET_MS): Promise { - if (!prof) return false; - const m = await import('./dict/offlineready'); - const ready = await m.ensureOfflineDicts(prof, budgetMs); - if (ready) setOfflineMode(true); - return ready; -} - -// The dict-preload warning: true when a first-lobby background preload could not fetch every -// enabled variant's dictionary (typically a poor connection), so offline mode may be incomplete. -// The lobby shows a notice in place of the ad banner while it holds. +// The dict-preload warning: true when a first-lobby background preload could not fetch every enabled +// variant's dictionary (typically a poor connection), so offline play may be incomplete. The lobby +// shows a notice in place of the ad banner while it holds. let preloadWarn = $state(false); /** dictPreloadWarning exposes the reactive preload-failure flag; read it in markup / $derived. */ @@ -78,18 +49,18 @@ export function setDictPreloadWarning(on: boolean): void { preloadWarn = on; } -// A preload runs at most once at a time; it finishes before a fresh trigger (a repeated lobby -// mount or a variant-preference change) can start another. Module-scoped so mounts do not stack. +// A preload runs at most once at a time; it finishes before a fresh trigger (a repeated lobby mount or +// a variant-preference change) can start another. Module-scoped so mounts do not stack. let preloadInFlight = false; /** * kickDictPreload starts a background preload of the enabled variants' dictionaries for an - * offline-capable install (a standalone web PWA with a confirmed email) while online, so a later - * switch to offline mode already has the data. It is a no-op in a Telegram/VK mini-app, in a plain - * browser tab, without a confirmed email, while offline, or when a preload is already running; - * getDawg's caching makes a repeat run cheap. When warnOnFail is set (the first lobby entry), a - * fetch failure raises the in-lobby notice, and a later successful run clears it. The dict loader - * and generator are imported dynamically, so neither is pulled into the main bundle. + * offline-capable install (a standalone web PWA with a confirmed email) while online, so a later switch + * to offline mode already has the data. It is a no-op in a Telegram/VK mini-app, in a plain browser tab, + * without a confirmed email, while offline, or when a preload is already running; getDawg's caching + * makes a repeat run cheap. When warnOnFail is set (the first lobby entry), a fetch failure raises the + * in-lobby notice, and a later successful run clears it. The dict loader and generator are imported + * dynamically, so neither is pulled into the main bundle. */ export function kickDictPreload(prof: Profile | null, warnOnFail = false): void { if (preloadInFlight || !prof) return; diff --git a/ui/src/lib/offline.test.ts b/ui/src/lib/offline.test.ts index 895e863..f6b2337 100644 --- a/ui/src/lib/offline.test.ts +++ b/ui/src/lib/offline.test.ts @@ -1,8 +1,7 @@ import { describe, it, expect, beforeEach } from 'vitest'; -import { loadOfflinePref, saveOfflinePref, offlineReady, missingDicts, offlinePreloadEligible, shouldBootOffline, raceOfflineReady } from './offline'; -import type { Variant } from './model'; +import { clearOfflinePref, offlinePreloadEligible } from './offline'; -// A minimal in-memory localStorage for the persistence tests (node has none). +// A minimal in-memory localStorage for the cleanup test (node has none). beforeEach(() => { const store = new Map(); (globalThis as unknown as { localStorage: Storage }).localStorage = { @@ -15,27 +14,7 @@ beforeEach(() => { } as Storage; }); -describe('offline mode helpers', () => { - it('persists and reads the device-scoped offline flag', () => { - expect(loadOfflinePref()).toBe(false); - saveOfflinePref(true); - expect(loadOfflinePref()).toBe(true); - saveOfflinePref(false); - expect(loadOfflinePref()).toBe(false); - }); - - it('offlineReady requires every enabled variant to have a dictionary', () => { - const has = (v: Variant): boolean => v !== 'erudit_ru'; - expect(offlineReady(['scrabble_en', 'scrabble_ru'], has)).toBe(true); - expect(offlineReady(['scrabble_en', 'erudit_ru'], has)).toBe(false); - expect(offlineReady([], has)).toBe(false); - }); - - it('missingDicts lists the enabled variants without a dictionary', () => { - const has = (v: Variant): boolean => v === 'scrabble_en'; - expect(missingDicts(['scrabble_en', 'scrabble_ru', 'erudit_ru'], has)).toEqual(['scrabble_ru', 'erudit_ru']); - }); - +describe('offline helpers', () => { it('offlinePreloadEligible requires a standalone PWA with email, online, outside mini-apps', () => { const base = { hasEmail: true, standalone: true, inTelegram: false, inVK: false, online: true }; expect(offlinePreloadEligible(base)).toBe(true); @@ -46,32 +25,11 @@ describe('offline mode helpers', () => { expect(offlinePreloadEligible({ ...base, online: false })).toBe(false); }); - it('shouldBootOffline requires the offline flag plus a cached session and profile', () => { - expect(shouldBootOffline({ offlineActive: true, hasSession: true, hasProfile: true })).toBe(true); - expect(shouldBootOffline({ offlineActive: false, hasSession: true, hasProfile: true })).toBe(false); - expect(shouldBootOffline({ offlineActive: true, hasSession: false, hasProfile: true })).toBe(false); - expect(shouldBootOffline({ offlineActive: true, hasSession: true, hasProfile: false })).toBe(false); - }); -}); - -describe('raceOfflineReady (toggle-flip readiness wait)', () => { - // A sleep that never elapses: the fetch always wins the race, exercising its resolution. - const never = (): Promise => new Promise(() => {}); - // A sleep that elapses immediately: the budget always wins the race, exercising the timeout. - const now = (): Promise => Promise.resolve(); - - it('is ready when the fetch resolves with nothing failed before the budget', async () => { - const run = Promise.resolve({ failed: [] as Variant[] }); - expect(await raceOfflineReady(run, 5000, never)).toBe(true); - }); - - it('is not ready when a variant is still missing after the fetch', async () => { - const run = Promise.resolve({ failed: ['erudit_ru'] as Variant[] }); - expect(await raceOfflineReady(run, 5000, never)).toBe(false); - }); - - it('is not ready when the budget elapses before the fetch resolves', async () => { - const run = new Promise<{ failed: Variant[] }>(() => {}); // never resolves - expect(await raceOfflineReady(run, 5000, now)).toBe(false); + it('clearOfflinePref removes the retired deliberate-offline key (best-effort, idempotent)', () => { + localStorage.setItem('scrabble.offlineMode', '1'); + clearOfflinePref(); + expect(localStorage.getItem('scrabble.offlineMode')).toBeNull(); + // Idempotent: a second call on an already-clear key is a no-op, not an error. + expect(() => clearOfflinePref()).not.toThrow(); }); }); diff --git a/ui/src/lib/offline.ts b/ui/src/lib/offline.ts index f72ec08..77ffc99 100644 --- a/ui/src/lib/offline.ts +++ b/ui/src/lib/offline.ts @@ -1,70 +1,29 @@ -// Pure helpers for the deliberate offline MODE — its device-scoped persistence and the readiness -// decision — kept out of the reactive module (offline.svelte.ts) so they unit-test in the node env. -// The deliberate offline mode is distinct from connection.svelte.ts's transient "can we reach the -// gateway" signal: it is the player's own sticky choice, and it gates the network, tints the chrome -// and shows only local games. - -import type { Variant } from './model'; +// Pure helpers for offline-mode support, kept out of the reactive module (offline.svelte.ts) so they +// unit-test in the node env. Offline became implicit — the net-state machine detects connectivity, and +// there is no deliberate toggle — so only the background dict-preload eligibility check and a one-time +// cleanup of the retired deliberate-offline preference remain here. const STORAGE_KEY = 'scrabble.offlineMode'; -/** loadOfflinePref reads the persisted offline-mode flag (device-scoped); false when unset or when - * storage is unavailable, so a device that cannot persist simply starts online. */ -export function loadOfflinePref(): boolean { +/** + * clearOfflinePref removes the retired deliberate-offline preference key. The offline model is implicit + * now — the app boots online and the machine detects offline — so a persisted flag from a pre-redesign + * install is orphaned data that is never read again; boot clears it once (best-effort) so nobody is left + * with a dead key. + */ +export function clearOfflinePref(): void { try { - return typeof localStorage !== 'undefined' && localStorage.getItem(STORAGE_KEY) === '1'; + if (typeof localStorage !== 'undefined') localStorage.removeItem(STORAGE_KEY); } catch { - return false; - } -} - -/** saveOfflinePref persists the offline-mode flag (best-effort). */ -export function saveOfflinePref(on: boolean): void { - try { - if (typeof localStorage !== 'undefined') localStorage.setItem(STORAGE_KEY, on ? '1' : '0'); - } catch { - /* best-effort — a failed persist just reverts to online on the next launch */ + /* best-effort — a storage failure just leaves the orphaned key, which is never read anyway */ } } /** - * offlineReady reports whether the device can play offline right now: at least one variant is - * enabled and every enabled variant's dictionary is already available on the device (hasDict). The - * offline toggle uses it to decide whether flipping to offline can succeed immediately. - */ -export function offlineReady(enabled: readonly Variant[], hasDict: (v: Variant) => boolean): boolean { - return enabled.length > 0 && enabled.every((v) => hasDict(v)); -} - -/** missingDicts lists the enabled variants whose dictionary is not yet available — the ones the - * toggle must fetch (or wait on) before offline mode can be entered. */ -export function missingDicts(enabled: readonly Variant[], hasDict: (v: Variant) => boolean): Variant[] { - return enabled.filter((v) => !hasDict(v)); -} - -/** - * raceOfflineReady runs the dictionary fetch `run` against a `budgetMs` wait and reports whether - * offline mode can be entered now: ready only when the fetch resolves with nothing still failed - * before the budget elapses. On a timeout the caller stops waiting but does NOT abort `run` — it - * keeps warming the on-device cache so a later flip to offline is instant. The sleep is injected so - * the logic stays pure and unit-tests in the node env. - */ -export async function raceOfflineReady( - run: Promise<{ failed: readonly unknown[] }>, - budgetMs: number, - sleep: (ms: number) => Promise = (ms) => new Promise((r) => setTimeout(r, ms)), -): Promise { - const elapsed = sleep(budgetMs).then(() => null); - const res = await Promise.race([run, elapsed]); - return res !== null && res.failed.length === 0; -} - -/** - * offlinePreloadEligible reports whether a background dictionary preload should run in this - * context: an installed standalone web PWA (not a Telegram/VK mini-app, not a plain browser tab) - * with a confirmed email, currently online. Elsewhere the preload is wasted bandwidth — the context - * has no offline mode to prepare for — so kickDictPreload skips it. Mirrors the Settings offline - * toggle's eligibility so the two never disagree. + * offlinePreloadEligible reports whether a background dictionary preload should run in this context: an + * installed standalone web PWA (not a Telegram/VK mini-app, not a plain browser tab) with a confirmed + * email, currently online. Elsewhere the preload is wasted bandwidth — the context has no offline play + * to prepare for — so kickDictPreload skips it. */ export function offlinePreloadEligible(opts: { hasEmail: boolean; @@ -75,13 +34,3 @@ export function offlinePreloadEligible(opts: { }): boolean { return opts.hasEmail && opts.standalone && !opts.inTelegram && !opts.inVK && opts.online; } - -/** - * shouldBootOffline decides whether a cold start skips the network and launches straight into - * offline mode: the deliberate offline flag is persisted-on AND a prior online session left a cached - * session and profile to start from. Without both (e.g. cleared storage, or a never-online install), - * the app must boot online once first — the caller then drops the sticky flag and continues online. - */ -export function shouldBootOffline(opts: { offlineActive: boolean; hasSession: boolean; hasProfile: boolean }): boolean { - return opts.offlineActive && opts.hasSession && opts.hasProfile; -} diff --git a/ui/src/lib/result.test.ts b/ui/src/lib/result.test.ts index ec3ad3a..8fe89b9 100644 --- a/ui/src/lib/result.test.ts +++ b/ui/src/lib/result.test.ts @@ -34,28 +34,36 @@ function game(seats: Seat[], status = 'finished', toMove = 0): GameView { } describe('resultBadge', () => { + it('recognises "you" under any of the self ids (a device-local game seats you under the guest id)', () => { + // myIds carries both the server user id and the device-local guest id, so the badge resolves the + // right seat regardless of which one seated you. + const local = game([seat(0, 'guest', 5), seat(1, 'robot', 3)], 'active', 0); + expect(resultBadge(local, ['guest', 'me'])).toEqual({ key: 'result.yourMove', emoji: '🟢' }); + expect(resultBadge({ ...local, toMove: 1 }, ['guest', 'me']).key).toBe('result.oppMove'); + }); + it('active: your move vs opponent', () => { const g = game([seat(0, 'me', 5), seat(1, 'a', 3)], 'active', 0); - expect(resultBadge(g, 'me')).toEqual({ key: 'result.yourMove', emoji: '🟢' }); - expect(resultBadge({ ...g, toMove: 1 }, 'me').key).toBe('result.oppMove'); + expect(resultBadge(g, ['me'])).toEqual({ key: 'result.yourMove', emoji: '🟢' }); + expect(resultBadge({ ...g, toMove: 1 }, ['me']).key).toBe('result.oppMove'); }); it('open (awaiting an opponent) reads as in-progress, not a finished result', () => { const g = game([seat(0, 'me', 0), seat(1, '', 0)], 'open', 0); - expect(resultBadge(g, 'me')).toEqual({ key: 'result.yourMove', emoji: '🟢' }); - expect(resultBadge({ ...g, toMove: 1 }, 'me').key).toBe('result.oppMove'); + expect(resultBadge(g, ['me'])).toEqual({ key: 'result.yourMove', emoji: '🟢' }); + expect(resultBadge({ ...g, toMove: 1 }, ['me']).key).toBe('result.oppMove'); }); it('finished two-player: victory / defeat / draw', () => { - expect(resultBadge(game([seat(0, 'me', 300, true), seat(1, 'a', 200)]), 'me')).toEqual({ + expect(resultBadge(game([seat(0, 'me', 300, true), seat(1, 'a', 200)]), ['me'])).toEqual({ key: 'result.victory', emoji: '🏆', }); - expect(resultBadge(game([seat(0, 'me', 200), seat(1, 'a', 300, true)]), 'me')).toEqual({ + expect(resultBadge(game([seat(0, 'me', 200), seat(1, 'a', 300, true)]), ['me'])).toEqual({ key: 'result.defeat', emoji: '🥈', }); - expect(resultBadge(game([seat(0, 'me', 200), seat(1, 'a', 200)]), 'me')).toEqual({ + expect(resultBadge(game([seat(0, 'me', 200), seat(1, 'a', 200)]), ['me'])).toEqual({ key: 'result.draw', emoji: '🏅', }); @@ -64,7 +72,7 @@ describe('resultBadge', () => { it('finished two-player: a 0-0 resignation is a defeat, not a score-tied win', () => { // The opponent won by resignation (isWinner) although neither side scored — the lobby // must read this as a loss, matching the game-detail screen (regression). - expect(resultBadge(game([seat(0, 'me', 0), seat(1, 'a', 0, true)]), 'me')).toEqual({ + expect(resultBadge(game([seat(0, 'me', 0), seat(1, 'a', 0, true)]), ['me'])).toEqual({ key: 'result.defeat', emoji: '🥈', }); @@ -72,21 +80,21 @@ describe('resultBadge', () => { it('finished four-player: places by score', () => { const last = game([seat(0, 'me', 100), seat(1, 'a', 400, true), seat(2, 'b', 300), seat(3, 'c', 200)]); - expect(resultBadge(last, 'me')).toEqual({ key: 'result.place4', emoji: '🏅' }); + expect(resultBadge(last, ['me'])).toEqual({ key: 'result.place4', emoji: '🏅' }); const second = game([seat(0, 'me', 300), seat(1, 'a', 400, true), seat(2, 'b', 200), seat(3, 'c', 100)]); - expect(resultBadge(second, 'me')).toEqual({ key: 'result.place2', emoji: '🥈' }); + expect(resultBadge(second, ['me'])).toEqual({ key: 'result.place2', emoji: '🥈' }); }); it('tie for the lead (3-4p): a shared victory for the leaders, a placed finish for those below', () => { // The reported case, viewer-side: two seats tie for the lead (-8), one is last (-14) — no single // winner(), so this must NOT read as a full draw for everyone. - expect(resultBadge(game([seat(0, 'me', -8), seat(1, 'a', -14), seat(2, 'b', -8)]), 'me')).toEqual({ key: 'result.victory', emoji: '🏆' }); - expect(resultBadge(game([seat(0, 'x', -8), seat(1, 'me', -14), seat(2, 'b', -8)]), 'me')).toEqual({ key: 'result.place3', emoji: '🥉' }); + expect(resultBadge(game([seat(0, 'me', -8), seat(1, 'a', -14), seat(2, 'b', -8)]), ['me'])).toEqual({ key: 'result.victory', emoji: '🏆' }); + expect(resultBadge(game([seat(0, 'x', -8), seat(1, 'me', -14), seat(2, 'b', -8)]), ['me'])).toEqual({ key: 'result.place3', emoji: '🥉' }); }); it('an aborted game reads as a draw for everyone, whatever the scores', () => { const g = { ...game([seat(0, 'me', 50), seat(1, 'a', 30)]), endReason: 'aborted' }; - expect(resultBadge(g, 'me')).toEqual({ key: 'result.draw', emoji: '🏅' }); + expect(resultBadge(g, ['me'])).toEqual({ key: 'result.draw', emoji: '🏅' }); }); }); diff --git a/ui/src/lib/result.ts b/ui/src/lib/result.ts index ea83fb5..e2a2e01 100644 --- a/ui/src/lib/result.ts +++ b/ui/src/lib/result.ts @@ -16,8 +16,8 @@ function placeBadge(rank: number, players: number): ResultBadge { return { key: 'result.place4', emoji: '🏅' }; } -export function resultBadge(game: GameView, myId: string): ResultBadge { - const me = game.seats.find((s) => s.accountId === myId); +export function resultBadge(game: GameView, myIds: readonly string[]): ResultBadge { + const me = game.seats.find((s) => myIds.includes(s.accountId)); if (game.status === 'active' || game.status === 'open') { return game.toMove === me?.seat @@ -42,7 +42,7 @@ export function resultBadge(game: GameView, myId: string): ResultBadge { // A winner exists but it is not me — even when scores are level (a win by resignation or timeout // can leave the winner at or below my score). The winner takes rank 1; place me among the remaining // (non-resigned) seats by score, starting at rank 2. - const ahead = game.seats.filter((s) => !s.isWinner && !s.resigned && s.accountId !== myId && s.score > (me?.score ?? 0)).length; + const ahead = game.seats.filter((s) => !s.isWinner && !s.resigned && !myIds.includes(s.accountId) && s.score > (me?.score ?? 0)).length; return placeBadge(2 + ahead, game.players); } diff --git a/ui/src/lib/transport.ts b/ui/src/lib/transport.ts index ad34d6f..216bc78 100644 --- a/ui/src/lib/transport.ts +++ b/ui/src/lib/transport.ts @@ -17,7 +17,7 @@ import { offlineMode } from './offline.svelte'; import { maintenanceRecovered, registerMaintenanceProbe, reportMaintenance } from './maintenance.svelte'; import { maintenanceRetryMs } from './maintenance'; import { backoffMs, isConnectionCode, retryable, toGatewayError } from './retry'; -import { UPDATE_REQUIRED, reportUpdateRequired } from './update.svelte'; +import { UPDATE_REQUIRED, reportUpdateRecommended, reportUpdateRequired } from './update.svelte'; const MAX_RETRIES = 6; const sleep = (ms: number): Promise => new Promise((r) => setTimeout(r, ms)); @@ -31,7 +31,21 @@ function assertOnline(): void { export function createTransport(baseUrl: string): GatewayClient { const origin = baseUrl || (typeof location !== 'undefined' ? location.origin : ''); - const transport = createConnectTransport({ baseUrl: origin, useBinaryFormat: true }); + const transport = createConnectTransport({ + baseUrl: origin, + useBinaryFormat: true, + // Observe the soft-tier version nudge: a served unary response may carry X-Update-Recommended (the + // additive header the edge sets for a client at or above the hard minimum but below the recommended + // version). Reading it in an interceptor keeps it off every call site; the stream path is not + // soft-gated. It never fails the call — the nudge is non-blocking. + interceptors: [ + (next) => async (req) => { + const res = await next(req); + if (!res.stream && res.header.get('x-update-recommended') === '1') reportUpdateRecommended(); + return res; + }, + ], + }); const client = createClient(Gateway, transport); let token: string | null = null; diff --git a/ui/src/lib/update.svelte.ts b/ui/src/lib/update.svelte.ts index a8026b4..14d560d 100644 --- a/ui/src/lib/update.svelte.ts +++ b/ui/src/lib/update.svelte.ts @@ -1,26 +1,76 @@ -// Global "client too old" signal. `active` latches true the first time the gateway answers a -// user-initiated online call with the update_required sentinel — the HTTP-header version gate the -// edge checks before decoding the payload (docs/ARCHITECTURE.md §2). It is terminal: unlike the -// maintenance signal there is no self-clearing poll, because an installed build cannot become -// compatible without an actual update. A non-dismissable overlay (UpdateOverlay.svelte) then covers -// the app; its one action sends the user to the store (native) or reloads (web). Offline play never -// trips it — the network kill switch refuses the call before it leaves the device. +// The client-version gate's two client signals (docs/ARCHITECTURE.md §2). +// +// HARD tier ("client too old"): the gateway refuses a foreground call with the update_required +// sentinel (the Execute result_code, the Subscribe FailedPrecondition). The transport reports it here, +// which drives the net-state machine into offlineVersionLocked; the notice (UpdateOverlay.svelte) reads +// netState.versionLocked and offers "Update" (store / reload) or "Play offline" (dismiss → stay +// offline). Offline play never trips it — the kill switch refuses the call before it leaves the device, +// and the background guest reconcile swallows it (stays a local guest, no notice). +// +// SOFT tier ("update available"): a served response carries the X-Update-Recommended header, which the +// transport reports here. It drives the machine (versionRecommended), whose setNudge effect — fired +// only from online — latches the dismissible nudge (UpdateNudge.svelte). The hard notice supersedes the +// nudge naturally: the nudge shows only while online, and version-locked is an offline state. + +import { emit } from './netstate.svelte'; +import { clientChannel } from './channel'; /** UPDATE_REQUIRED is the stable sentinel the gateway returns (the Execute result_code, and the * GatewayError code the Subscribe FailedPrecondition maps to) for a client too old to be served. */ export const UPDATE_REQUIRED = 'update_required'; -let required = $state(false); +/** openUpdate sends the user to the fix, shared by the hard-tier notice and the soft-tier nudge: the + * store listing on a native build (VITE_RUSTORE_URL, handed to the OS via '_system'), or a plain + * reload on the web (which fetches the current client). */ +export function openUpdate(): void { + const ch = clientChannel(); + if (ch === 'android' || ch === 'ios') { + const url = import.meta.env.VITE_RUSTORE_URL; + if (url) window.open(url, '_system'); + } else { + location.reload(); + } +} -export const updateRequired = { - /** active is true once a foreground online call has been refused as too old. Terminal. */ +/** reportUpdateRequired drives the net-state machine into offlineVersionLocked (the hard tier). The + * transport calls it only for a foreground update_required — the background reconcile swallows it and + * stays offline. The notice reads netState.versionLocked; there is no separate latch. */ +export function reportUpdateRequired(): void { + emit('versionRejected'); +} + +// The soft "update available" nudge. `active` latches when the machine accepts a versionRecommended +// from online (via the setNudge effect → latchUpdateNudge); `dismissed` hides the banner for the +// session once the user closes it. A fresh launch re-evaluates the version, so both reset on reload. +let recommended = $state(false); +let nudgeDismissed = $state(false); + +export const updateRecommended = { + /** active is true once the gateway has signalled an available (non-blocking) update. */ get active(): boolean { - return required; + return recommended; + }, + /** dismissed is true once the user has closed the nudge for this session. */ + get dismissed(): boolean { + return nudgeDismissed; }, }; -/** reportUpdateRequired latches the terminal "update required" overlay. The transport calls it when - * a foreground call returns the update_required sentinel; idempotent. */ -export function reportUpdateRequired(): void { - required = true; +/** latchUpdateNudge raises the soft-nudge latch. It is wired to the machine's setNudge effect + * (registerNetNudge), which fires only from online, so the nudge is never raised while offline or + * version-locked. */ +export function latchUpdateNudge(): void { + recommended = true; +} + +/** dismissUpdateNudge hides the nudge for the session (a fresh launch re-evaluates the version). */ +export function dismissUpdateNudge(): void { + nudgeDismissed = true; +} + +/** reportUpdateRecommended signals an available update (the soft tier). The transport calls it when a + * served response carries the X-Update-Recommended header; it drives the machine (versionRecommended), + * which latches the nudge from online. */ +export function reportUpdateRecommended(): void { + emit('versionRecommended'); } diff --git a/ui/src/screens/Lobby.svelte b/ui/src/screens/Lobby.svelte index 0363a67..e8df9ea 100644 --- a/ui/src/screens/Lobby.svelte +++ b/ui/src/screens/Lobby.svelte @@ -3,9 +3,10 @@ import { SvelteMap, SvelteSet } from 'svelte/reactivity'; import Screen from '../components/Screen.svelte'; import TabBar from '../components/TabBar.svelte'; + import UpdateNudge from '../components/UpdateNudge.svelte'; import Modal from '../components/Modal.svelte'; import PinPad from '../components/PinPad.svelte'; - import { app, handleError, refreshFeedbackBadge, seedChatUnread } from '../lib/app.svelte'; + import { app, handleError, refreshFeedbackBadge, seedChatUnread, showToast } from '../lib/app.svelte'; import { connection } from '../lib/connection.svelte'; import { gateway } from '../lib/gateway'; import { navigate } from '../lib/router.svelte'; @@ -16,6 +17,9 @@ import { preloadGames } from '../lib/preload'; import { kickDictPreload, offlineMode } from '../lib/offline.svelte'; import { localSource, isLocalGameId } from '../lib/gamesource'; + import { localGuestId } from '../lib/localguest'; + import { insideTelegram } from '../lib/telegram'; + import { insideVK } from '../lib/vk'; import { gamePhase, groupGames, orderedSeats, scoreStanding, shouldBlink, type LobbyPhase } from '../lib/lobbysort'; import type { AccountRef, GameView, Invitation } from '../lib/model'; import { VARIANT_FLAG, VARIANT_RULES } from '../lib/variants'; @@ -36,27 +40,37 @@ let loadSeq = 0; async function load() { const seq = ++loadSeq; - // Deliberate offline mode: never touch the network. The lobby shows only the device-local - // vs_ai games (reconstructed from the store) plus the New-vs-AI entry; there are no online - // games, invitations or incoming requests to fetch. - if (offlineMode.active) { - const local = await localSource.list(); - if (seq !== loadSeq) return; - games = local; + const offline = offlineMode.active; + // Device-local games (vs_ai / hotseat) merge into the unified lobby everywhere except the + // always-online Telegram/VK mini-apps, which are server-only (the shared-origin local store must + // not leak device-local games into a mini-app). + const serverOnly = insideTelegram() || insideVK(); + const local = serverOnly ? [] : await localSource.list(); + if (seq !== loadSeq) return; + + if (offline) { + // Offline: device-local games are active; the last-known server games ride along greyed from the + // cache (un-openable). No network — and no invitations/incoming (a server concept, hidden until + // back online). + const cachedServer = (getLobby()?.games ?? []).filter((g) => !isLocalGameId(g.id)); + games = [...local, ...cachedServer]; invitations = []; incoming = []; app.notifications = 0; - setLobby({ games, invitations, incoming, offline: offlineMode.active }); + setLobby({ games, invitations, incoming }); app.lobbyReady = true; return; } try { const list = await gateway.gamesList(); if (seq !== loadSeq) return; - games = list.games; - // Seed the per-game unread badges from the authoritative list. The live stream only raises + const server = list.games; + // Seed the per-game unread badges from the authoritative server list. The live stream only raises // unread (it never seeds it from a GameView), so a persisted unread survives a reload here. - for (const g of games) seedChatUnread(g.id, g.unreadChat, g.unreadMessages); + for (const g of server) seedChatUnread(g.id, g.unreadChat, g.unreadMessages); + // The unified list: device-local games alongside the server ones (so a reconciled guest's local + // games stay visible online). Ids never collide. + games = [...local, ...server]; if (!guest) { const [inv, inc] = await Promise.all([gateway.invitationsList(), gateway.friendsIncoming()]); if (seq !== loadSeq) return; @@ -67,12 +81,12 @@ app.notifications = incoming.length; void refreshFeedbackBadge(); } - setLobby({ games, invitations, incoming, offline: offlineMode.active }); - // Warm the cache for the ongoing games so opening one from the lobby is instant. The list - // just loaded, so the connection is up; the call is non-blocking and re-running it on each - // lobby refresh cheaply warms any newly appeared game (already-cached ones are skipped). + setLobby({ games, invitations, incoming }); + // Warm the cache for the ongoing SERVER games so opening one from the lobby is instant (local + // games open from the device). The list just loaded, so the connection is up; non-blocking and + // cheap (already-cached ones are skipped). if (connection.online) { - void preloadGames(games); + void preloadGames(server); // Warm the offline dictionaries for an eligible install (PWA + email) so a later switch to // offline mode already has the data; a no-op elsewhere, and cheap once cached. The first // lobby entry surfaces a notice in place of the ad banner if a fetch fails. @@ -90,7 +104,7 @@ onMount(() => { // Render instantly from the cached lists (so the screen does not "draw in" during // the back-slide), then refresh in the background. - const cached = getLobby(offlineMode.active); + const cached = getLobby(); if (cached) { games = cached.games; invitations = cached.invitations; @@ -118,8 +132,16 @@ } }); + // myId is the server user id, used for the (server-only) invitation "from me" checks. myIds is the + // full "you" set — the server user id plus the device-local guest id — used for game seat matching, + // since a reconciled guest's device-local games are seated under localGuestId while server games are + // seated under the user id (the ids never collide). guestId is read once (it mints on first launch). + const guestId = localGuestId(); const myId = $derived(app.session?.userId ?? ''); - const groups = $derived(groupGames(games, myId, app.chatUnread)); + const myIds = $derived([app.session?.userId, guestId].filter((x): x is string => !!x)); + // grey marks a server game shown only from the offline cache: dimmed and un-openable until online. + const grey = (g: GameView): boolean => offlineMode.active && !isLocalGameId(g.id); + const groups = $derived(groupGames(games, myIds, app.chatUnread)); // Per-card "look here" blink. When a game changes lobby bucket into "your turn" or "finished" // while the lobby is on screen, its status emoji blinks twice (an opponent's-turn change is @@ -152,7 +174,7 @@ const seen = new Set(); for (const g of games) { seen.add(g.id); - const phase = gamePhase(g, myId); + const phase = gamePhase(g, myIds); if (shouldBlink(prevPhase.get(g.id), phase)) blink(g.id); prevPhase.set(g.id, phase); } @@ -169,7 +191,7 @@ // An honest-AI game shows the robot opponent as 🤖, never its (pooled) name. if (g.vsAi) return '🤖'; return g.seats - .filter((s) => s.accountId !== myId) + .filter((s) => !myIds.includes(s.accountId)) .map((s) => s.displayName) .join(', '); } @@ -213,6 +235,11 @@ revealedId = null; return; } + // A server game shown only from the offline cache is un-openable — a toast explains why. + if (grey(g)) { + showToast(t('net.offline')); + return; + } navigate(`/game/${g.id}`); } function toggleReveal(id: string): void { @@ -222,7 +249,7 @@ revealedId = null; const prev = games; games = games.filter((g) => g.id !== id); // optimistic; the backend already filters it out - setLobby({ games, invitations, incoming, offline: offlineMode.active }); + setLobby({ games, invitations, incoming }); try { // A local (offline) game is deleted from the device store; an online game is hidden on the // backend. Routing by id keeps the delete off the network for a local game (the transport @@ -231,7 +258,7 @@ else await gateway.hideGame(id); } catch (e) { games = prev; - setLobby({ games, invitations, incoming, offline: offlineMode.active }); + setLobby({ games, invitations, incoming }); handleError(e); } } @@ -276,7 +303,7 @@
- {#if invitations.length} + {#if invitations.length && !offlineMode.active}

{t('lobby.invitations')}

{#each invitations as inv (inv.id)} @@ -319,7 +346,7 @@
{#each group.list as g (g.id)} {@const badge = badgeKind(app.chatUnread[g.id] ?? false, app.messageUnread[g.id] ?? false)} -
+
{#if group.finished || g.hotseat} {/if} @@ -336,7 +363,7 @@ {#if badge}{/if} {#each orderedSeats(g) as s, i (s.seat)}{@const standing = scoreStanding(g, myId, s)}{#if i > 0}{' : '}{#each orderedSeats(g) as s, i (s.seat)}{@const standing = scoreStanding(g, myIds, s)}{#if i > 0}{' : '}{/if} {#key blinkNonce.get(g.id) ?? 0} - {g.hotseat ? '' : resultBadge(g, myId).emoji} + {g.hotseat ? '' : resultBadge(g, myIds).emoji} {/key} {#if group.finished || g.hotseat} @@ -397,6 +424,7 @@ {/if} {#snippet tabbar()} + (limitOpen = false)} onlogin={() => { limitOpen = false; navigate('/profile'); }} /> - {:else if offlineMode.active} + {:else} + + {#if canPlayOffline} +
+ + +
+ {#if offlineMode.active}

{t('new.needsNetwork')}

{/if} + {/if} + {#if friendsMode === 'offline'}
@@ -434,9 +492,10 @@ + {t('hotseat.addPlayer')} {/if} + {#if dictBlocked}{/if} {:else if friends.length === 0} @@ -485,6 +544,7 @@ {/if}
+ {/if} {/if} {#if pad} @@ -708,6 +768,14 @@ font-size: 0.85rem; line-height: 1.4; } + /* The offline-blocker reason (a missing dictionary, or the online segment needing a connection). */ + .dictnote { + margin: 0; + text-align: center; + color: var(--warn); + font-size: 0.85rem; + line-height: 1.4; + } /* --- offline hotseat roster --- */ .hostpin { display: flex; diff --git a/ui/src/screens/Settings.svelte b/ui/src/screens/Settings.svelte index 84e94ec..befd95f 100644 --- a/ui/src/screens/Settings.svelte +++ b/ui/src/screens/Settings.svelte @@ -11,22 +11,12 @@ import type { ThemePref } from '../lib/theme'; import type { BoardLabelMode } from '../lib/boardlabels'; import { insideTelegram } from '../lib/telegram'; - import { insideVK } from '../lib/vk'; - import { offlineMode, setOfflineMode, requestOffline } from '../lib/offline.svelte'; - import { isStandalone } from '../lib/pwa'; import InstallApp from '../components/InstallApp.svelte'; // The board-zoom toggle only makes sense on a touch device (the desktop / landscape layouts fit // the whole board and never auto-zoom), so it is shown only for a coarse pointer. const coarsePointer = typeof matchMedia !== 'undefined' && matchMedia('(pointer: coarse)').matches; - // The offline toggle is for the installed web PWA with a confirmed email only: the service worker - // that lets the app launch with no network runs only in a standalone web install (not a mini-app), - // and a durable account (email) anchors the device-local games. Elsewhere the control is hidden. - const offlineEligible = $derived( - isStandalone() && !insideTelegram() && !insideVK() && !!app.profile?.email, - ); - const themes: ThemePref[] = ['auto', 'light', 'dark']; const themeLabel: Record = { auto: 'settings.themeAuto', @@ -41,24 +31,6 @@ none: 'settings.labelsNone', }; - // The offline toggle gates entry on dictionary readiness: flipping to offline fetches the enabled - // variants' dictionaries (cache-first) and waits at most a few seconds; if they cannot be made - // available it stays online and shows the "needs internet" note, while the fetch keeps warming the - // cache in the background so a later flip is instant. Leaving offline (-> online) is never gated. - let checking = $state(false); - let needsData = $state(false); - - async function goOffline(): Promise { - if (offlineMode.active || checking) return; - needsData = false; - checking = true; - try { - const ready = await requestOffline(app.profile); - if (!ready) needsData = true; - } finally { - checking = false; - } - }
@@ -119,33 +91,6 @@ {/if}
- {#if offlineEligible} -
-

{t('settings.offlineMode')}

-
- - -
- {#if checking} -

{t('settings.offlineChecking')}

- {:else if needsData} - - {/if} -
- {/if} - @@ -190,14 +135,6 @@ opacity: 0.55; cursor: default; } - .onote { - font-size: 0.85rem; - color: var(--text-muted); - margin: 8px 0 0; - } - .onote--warn { - color: var(--warn); - } .row { display: flex; align-items: center;