diff --git a/.env.example b/.env.example
index 05d0994..27caa80 100644
--- a/.env.example
+++ b/.env.example
@@ -17,3 +17,4 @@ OPENROUTER_PLANNER_MODEL=openai/gpt-4.1-mini
# Models receive fixture references; the executor resolves the exact values.
E2E_TEST_EMAIL=
E2E_TEST_PASSWORD=
+E2E_TEST_INVALID_PASSWORD=
diff --git a/.gitignore b/.gitignore
index cb71afd..3c77956 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,8 @@
node_modules/
+Pods/
+examples/mobile-app/ios/
+examples/mobile-app/android/
+examples/mobile-app/.expo/
dist/
coverage/
.env
diff --git a/MOBILE_TEST_RESULTS.md b/MOBILE_TEST_RESULTS.md
new file mode 100644
index 0000000..36c508f
--- /dev/null
+++ b/MOBILE_TEST_RESULTS.md
@@ -0,0 +1,44 @@
+# Native mobile validation
+
+Measured September 19, 2026 on implementation commit `96a275e8c452fbc40ad5b52d83c538664edc0b64`. **The local native alpha met the [prewritten mobile exit criteria](TEST_PLAN.md#native-mobile-alpha-exit-criteria) on the owned Jev Shop fixture.** This is evidence for those five accessible flows on dedicated virtual devices, not a reliability claim for arbitrary apps or physical phones.
+
+The complete, sanitized [60-suite / 300-case first-attempt record](docs/benchmarks/native-mobile-2026-09-19.json) includes each trial's baseline, verdict, checked counts, timings, requests, model, and billed API cost. It comprises two isolated 30-suite runs; every first attempt within those runs is included without retry or replacement. Earlier diagnostic runs on other simulator and concurrent-device setups hit host/SDK failures and are not pooled into this cohort.
+
+| Platform and mode | First attempts | PASS | Correct FAIL | BLOCKED | Per-case median / p95 | Jev requests | Billed API cost |
+| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
+| iOS · healthy discovery | 50 | 50 | — | 0 | 27.21 / 30.24 s | 250 | $0.014207 |
+| iOS · seeded faults | 50 | **0** | **50** | 0 | 29.17 / 31.66 s | 250 | $0.014238 |
+| iOS · saved replay | 50 | 50 | — | 0 | 25.24 / 36.57 s | 30 | $0.001677 |
+| Android · healthy discovery | 50 | 50 | — | 0 | 10.44 / 13.10 s | 259 | $0.012789 |
+| Android · seeded faults | 50 | **0** | **50** | 0 | 12.36 / 14.94 s | 261 | $0.012835 |
+| Android · saved replay | 50 | 50 | — | 0 | 8.70 / 11.12 s | **0** | **$0** |
+
+Every row has ten runs for each of five cases. Healthy and replay reached 10/10 per case; all five seeded faults produced 10/10 observed, correct FAIL. The aggregate billed provider cost was **$0.055746222**. The median is per-case elapsed time; suite setup and aggregate artifact phases are retained in the trial record. Warm healthy medians were 27.20 s on iOS and 10.57 s on Android, below the 60-second gate.
+
+Replay made **zero prose-planner requests** on both platforms. iOS made 30 Jev repair requests across 50 replay cases because an extra accessibility ancestor changed the saved control context; the runner refused to treat that target as an exact match and selected it again from fresh evidence. Android replay made zero model requests. Replay on iOS is therefore **not** model-free. The original evaluation script mistakenly also required zero Jev calls and marked its iOS summary failed. The [written gate](TEST_PLAN.md#native-mobile-alpha-exit-criteria) requires zero **planner** requests, while the [replay behavior](docs/MOBILE.md#reports-replay-limits-and-stop) allows Jev to repair a stale control. The raw script result is preserved; the published aggregate recomputes the written gate from the immutable trials, records `originalStrictEvaluatorPassed: false` and `strictZeroJevReplayDiagnosticPassed: false`, and the script's predicate has been corrected for future runs. The correction changes only evaluation reporting, not any mobile trial or runner behavior.
+
+## Method and other gates
+
+- Five authored cases in [examples/mobile.cases](examples/mobile.cases): invalid login rejection, filtered catalog search, quantity/total, cart removal, and cart persistence after relaunch. The fault run independently seeds invalid-login, wrong-filter, wrong-total, ineffective-removal, and lost-persistence variants. The local control service confirmed that every one of the 60 suites consumed its intended baseline before actions.
+- One platform ran at a time: dedicated iOS Simulator with iOS 26.5, then Android Emulator with Android 16. Each run used the same app, cases, limits, `--planner off`, OpenRouter's `typesafe/jev-1.13-20260917`, and pinned `agent-device@0.21.6`. The runner used real native accessibility/actions and independent expectation checks. The 50 replay cases per platform reused only a complete healthy flow, after a fresh baseline reset.
+- A separate interpretation cohort at the measured implementation SHA compiled **40/40** independently authored prose cases faithfully (20 per platform). It made 40 `openai/gpt-4.1-mini` requests via OpenRouter, zero Jev requests, and billed $0.0248056. These planner-only checks are separate from the planner-off 300-case matrix.
+- Real SDK checks passed on both platforms: owned-device selection and competing lease, fresh references, Unicode text replacement, readable switch state, safe recording/discard, and cancellation during selection, snapshot, fill, and press/settle. Android's SDK check preceded the final iOS-specific quality-verdict change; Android's full 150-case matrix ran at the measured implementation SHA.
+- A clean `npm pack` install with the optional SDK ran one healthy PASS (exit 0) and one seeded login FAIL (exit 1) on **each** device. CLI JSON and saved JSON/HTML agreed. A second install with `--omit=optional` compiled an explicit native plan offline and returned exit 2 with missing-SDK guidance from `doctor`. The local workbench rendered Android PASS and FAIL reports with matching JSON verdicts and no page errors. Type checks, the build, and all 53 contract/browser tests passed.
+
+The [10-second video](docs/assets/mobile-demo-10s.mp4) and [real-time recorded segments](docs/assets/mobile-demo-real-time.mp4) show an additional, longer 12-check cart journey on both devices, captured from the same implementation SHA. Full case elapsed time was 54.535 s / $0.000603498 on iOS and 70.640 s / $0.000615846 on Android. Both passed 12/12. The 10-second edit uses **3.47×** iOS and **11.25×** Android playback for the eligible clips; full-run timers jump over private input and relaunch gaps. The 58.93-second companion plays only the shareable segments at 1×. Neither video is a claim that the full tests ran in 10 seconds. The recorded segments start after credential/search entry, and the artifact verifier plus manual frame inspection excluded input/known-secret screens.
+
+The 300-case matrix, interpretation cohort, and filmed runs remain attributed to `96a275e8c452fbc40ad5b52d83c538664edc0b64`. Subsequent review fixes to preflight wording, saved build identity, and live preview publication have focused tests and separate final-candidate smoke checks; they do not retroactively change these measured trials.
+
+To reproduce the controlled matrix after [building and installing the fixture](docs/MOBILE.md#reproduce-the-owned-shopping-fixture), use the opt-in command below. It makes paid calls and needs your own OpenRouter key, booted dedicated devices, and a running local fixture baseline. The linked public data retains the source SHA, timing phases, and every first attempt; exact device IDs and OS build details remain in private maintainer logs.
+
+```sh
+npm run build
+node scripts/evaluate-mobile.mjs --live --platform ios \
+ --ios-device IOS_ID --rounds 10 --max-cost 2 \
+ --out .jev-e2e/mobile-evaluation/ios
+node scripts/evaluate-mobile.mjs --live --platform android \
+ --android-device emulator-5554 --rounds 10 --max-cost 2 \
+ --out .jev-e2e/mobile-evaluation/android
+```
+
+Native accessibility is still a boundary: sparse or incomplete trees, ambiguous controls, unexposed switch state, and unsupported custom surfaces produce BLOCKED rather than a guessed PASS. Intermittent host simulator startup/lease trouble occurred while preparing the benchmark; the published 300-case run used healthy isolated devices and includes every first attempt in those registered rounds. No claims are made for hosted devices, physical phones, payments, biometrics, or complex WebViews.
diff --git a/README.md b/README.md
index 6398a58..03c8bce 100644
--- a/README.md
+++ b/README.md
@@ -2,19 +2,29 @@
# jev-e2e
-**Test your website in plain English. Get evidence for every result.**
+**Test websites and native apps in plain English. Get evidence for every result.**
[](TEST_RESULTS.md)
-[](https://nodejs.org/)
+[](https://nodejs.org/)
[](LICENSE)
-[Quick start](#quick-start) · [Write a test](#write-a-test) · [Benchmarks](#live-ebay-benchmark) · [CLI reference](docs/USAGE.md) · [Contribute](CONTRIBUTING.md)
+[Quick start](#quick-start) · [Native mobile](docs/MOBILE.md) · [Write a test](#write-a-test) · [Results](MOBILE_TEST_RESULTS.md) · [CLI reference](docs/USAGE.md) · [Contribute](CONTRIBUTING.md)
-Describe a flow and what should be true at the end. jev-e2e turns it into a test plan, uses Jev to select controls on the page, and runs the test with Playwright. Each result is **PASS**, **FAIL**, or **BLOCKED**, with an HTML report, JSON, and masked screenshots.
+Describe a flow and what should be true. jev-e2e turns it into a test plan, uses Jev to select accessible controls, and runs it with Playwright or a local simulator/emulator. Each result is **PASS**, **FAIL**, or **BLOCKED**, with an HTML report, JSON, and privacy-aware evidence.
-**Local alpha:** CLI and browser workbench for Chromium websites. Install from source; an npm release is not yet available.
+**Local alpha:** CLI and workbench for Chromium websites, iOS Simulator, and Android Emulator. Install from source; an npm release is not yet available.
+
+## Watch one test on iOS and Android
+
+
+
+[Watch the 10-second edit](docs/assets/mobile-demo-10s.mp4) · [Watch the real-time recorded segments](docs/assets/mobile-demo-real-time.mp4) · [Read the native setup](docs/MOBILE.md)
+
+One authored case signs in, searches for a lamp, adds it to the cart, changes the quantity, checks the total, relaunches, verifies persistence, removes it, and enables notifications. The same React Native fixture ran on **iOS Simulator and Android Emulator**; all **12 explicit checks passed** on each recorded run. The timers and billed Jev costs come from those runs. The short edit speeds up the iOS and Android footage separately, while the second video plays the shareable recorded segments in real time. Screens with input fields (including sign-in and search) and transient relaunch screens are excluded for privacy, so the footage has capture cuts. These two runs are a demonstration; repeated reliability results are reported separately in [native validation](MOBILE_TEST_RESULTS.md).
+
+In a separate controlled evaluation of five cases × ten first attempts per mode and platform, healthy runs passed **50/50** on each device, seeded faults produced **50/50 correct FAIL** on each, and saved replay passed **50/50** on each. iOS replay used Jev to repair 30 stale controls; Android replay used no model calls. See the [method, cost, timing, and limitations](MOBILE_TEST_RESULTS.md) and [all 300 sanitized case results](docs/benchmarks/native-mobile-2026-09-19.json).
## Watch the eBay comparison
@@ -29,14 +39,14 @@ This is a UI execution experiment with a shared human-authored plan and an exten
## Why jev-e2e?
- **Write cases in plain English.** Use an optional planner for prose, or explicit `Goal`, `Step`, and `Expect` templates without it.
-- **Check the outcome.** Playwright verifies expectations independently. Missing evidence or unsupported requirements produce BLOCKED.
+- **Check the outcome.** The runner verifies expectations independently of Jev's choices. Missing evidence or unsupported requirements produce BLOCKED.
- **See what happened.** Reports include expected and observed values, actions, timing, provider usage, and screenshots.
- **Replay successful flows.** Reuse saved controls and recheck assertions. An unchanged flow can replay with zero model calls; stale targets require Jev to repair them.
- **Run locally with limits.** Use your own OpenRouter key, authentication fixtures, request limits, deadlines, and cost budget. Stop execution from the workbench or with Ctrl+C.
## Quick start
-Requires **Node.js 22+** and one **OpenRouter API key**.
+Requires **Node.js 22.12+** and one **OpenRouter API key**.
### 1. Install from source
@@ -82,6 +92,18 @@ npm run ui
Open the printed workbench URL, normally **http://127.0.0.1:4007**. Point it at the demo on **http://127.0.0.1:4177**, review a plan, run it, and inspect the evidence. The demo command creates demo-only fixtures under `.jev-e2e/demo`. Use a fresh project name for repeated create tests; a fresh browser context does not reset application data.
+### 5. Test a native app
+
+```sh
+node dist/cli.js doctor --platform ios
+node dist/cli.js devices --platform ios
+node dist/cli.js plan --platform ios --app com.example.app \
+ --cases mobile.cases --fixtures fixtures.json --out reviewed.json
+node dist/cli.js run --plan reviewed.json --device EXACT_ID
+```
+
+Replace `ios` with `android` for an Android Emulator. Native tests use the same case, review, replay, and report flow; the local app needs accessible controls. Explicit `Step:` lines bypass the optional prose planner; `--planner off` makes that choice explicit. See the [native setup and case reference](docs/MOBILE.md).
+
## Write a test
Save a case in a `.cases` file. With `--planner on`, describe the flow and give a concrete expectation:
@@ -125,16 +147,17 @@ For product validation, see the separate [controlled-demo test results](TEST_RES
| --- | --- |
| Optional prose planner | Converts your case into semantic steps, input bindings, and explicit expectations. Saved plans need no new interpretation. |
| Jev | Selects from observed controls and navigation choices using OpenRouter's native Decisions API. |
-| Playwright | Executes actions and checks expectations independently. |
+| Playwright / agent-device | Executes browser or local native actions. |
+| Evidence checker | Verifies authored browser or accessibility expectations independently of Jev's choice. |
| CLI + local workbench | Share the runner, budgets, cancellation, saved plans, and evidence reports. |
Jev uses `POST /api/alpha/decisions`; the optional planner uses `POST /api/v1/chat/completions`. Both use standard `fetch`. Direct TypeSafe transport is not implemented. [Provider setup](OPENROUTER_SETUP.md) · [Technical plan](TECHNICAL_PLAN.md)
## Scope and privacy
-The alpha supports common Chromium forms, buttons, links, native selects, checkboxes, authenticated fixtures, and async results. Native desktop/mobile apps, CAPTCHA, canvas, complex frames, payment-provider flows, and subjective visual judgments are outside this release. Hosted infrastructure is a later stage.
+The alpha supports common Chromium flows plus accessible local iOS and Android apps. Physical phones, hosted devices, native desktop apps, CAPTCHA, arbitrary canvas controls, complex WebViews/frames, payment-provider flows, biometrics, and subjective visual judgments remain outside this release. Hosted infrastructure is a later stage.
-API keys stay in the server process. Known fixture/auth values are redacted from observations and reports; input fields are masked in screenshots. Visible application text is sent to OpenRouter, and unrelated page content can remain in reports. Inspect evidence before sharing it. Reports stay under your local `.jev-e2e/runs`; raw trace recording is not implemented. No telemetry is required.
+API keys stay in the server process. Known fixture/auth values are redacted from observations and reports; input screens are omitted from screenshots. Visible application text is sent to OpenRouter, and unrelated app or page content can remain in reports. Native recording is explicit, local, and starts after credential-entry steps. If a later screen exposes an input or known secret, the whole report clip is discarded. Inspect evidence before sharing it. Reports and recordings stay under your local `.jev-e2e/runs`; nothing uploads automatically. No telemetry is required.
## Help shape the project
diff --git a/TEST_PLAN.md b/TEST_PLAN.md
index 3421619..10fb16e 100644
--- a/TEST_PLAN.md
+++ b/TEST_PLAN.md
@@ -1,10 +1,10 @@
# Test plan and exit criteria
-Updated September 18, 2026. These remain the gates for the local open-source product. The alpha runner, CLI, UI, demo, and provider transports are implemented. Focused checks and repeated paid benchmarks are recorded separately in [TEST_RESULTS.md](TEST_RESULTS.md). Original provider smoke checks remain in [LIVE_PROVIDER_CHECK.md](LIVE_PROVIDER_CHECK.md). Gates must be assessed from recorded results, not inferred from implementation status.
+Updated September 19, 2026. These remain the gates for the local open-source product. The alpha runner, CLI, UI, demo, and provider transports are implemented. Browser checks are recorded in [TEST_RESULTS.md](TEST_RESULTS.md), and the native alpha gates in [MOBILE_TEST_RESULTS.md](MOBILE_TEST_RESULTS.md). Original provider smoke checks remain in [LIVE_PROVIDER_CHECK.md](LIVE_PROVIDER_CHECK.md). Gates must be assessed from recorded results, not inferred from implementation status.
## Scope and verdict contract
-Test ordinary Chromium websites: forms, buttons, links, checkboxes, native selects, authenticated fixtures, and asynchronous rendering. Native desktop/mobile apps, CAPTCHA, payment-provider flows, visual layout judgments, canvas controls, and complex cross-origin frames are outside the first release's advertised scope. Unsupported requirements must receive a useful BLOCKED reason.
+Test ordinary Chromium websites plus accessible local apps on an iOS Simulator or Android Emulator. Browser coverage includes forms, buttons, links, checkboxes, native selects, authenticated fixtures, and asynchronous rendering. Native coverage includes exact accessible taps, fills, switches, scrolling, back, keyboard dismissal, relaunch/persistence, local recording, and checked milestones. Physical phones, hosted devices, native desktop apps, CAPTCHA, payment-provider flows, biometrics, arbitrary canvas/visual judgments, complex WebViews, and complex cross-origin frames remain outside this release. Unsupported requirements must receive a useful BLOCKED reason.
PASS requires every required milestone and assertion to be checked and satisfied on fresh evidence. FAIL requires observed behavior that contradicts a required expectation. BLOCKED records an inability to execute or verify, including missing data, ambiguity, provider errors, limits, and cancellation. Never treat a model's DONE or confidence as a test verdict. A canceled suite remains non-passing even if its already completed cases passed.
@@ -37,6 +37,23 @@ The general model is optional. Free-form cases use a configured interpreter thro
| UI and installation | Keyboard/focus/contrast pass; usable at 1440px, 768px, and 390px. Clean Node 22+ macOS/Linux installations run UI and CLI via the documented setup | Responsive UI verification and packed-package installation smoke tests |
| Configuration and limits | Planner-off needs no generative configuration. Invalid/missing selected-provider configuration is actionable; request/action/deadline/spending limits remain non-passing rather than silently changing models or expectations | Configuration, error, and limit tests; retain provider usage and obey the project key cap during evaluation |
+## Native mobile alpha exit criteria
+
+These gates apply independently to iOS Simulator and Android Emulator unless a row says otherwise. Every paid run is first-attempt evidence; BLOCKED does not count as a detected fault.
+
+| Gate | Exit criterion | How verified |
+| --- | --- | --- |
+| SDK contract and ownership | The real pinned SDK can open, observe, fill, tap, check, record, and close the owned fixture. Stale references reject before dispatch; ambiguous/physical-device selection blocks; a competing lease cannot disturb the owner | Live SDK gate on the exact project-owned simulator/emulator, including Unicode replacement and idempotent switch state |
+| Natural-language fidelity | At least 19/20 independently authored prose cases compile faithfully on each platform, preserving action order, exact literals, fixtures, and expectations | Fresh one-case-per-request paid cohort; retain all outputs and provider usage |
+| Healthy discovery | Five representative flows × 10 first attempts produce at least 48/50 PASS per platform and at least 9/10 for every flow | Reset the owned fixture baseline before each run; use the same cases, limits, and evaluation rules |
+| Fault detection | Five observable faults × 10 first attempts produce zero PASS and at least 48/50 correct FAIL per platform | Seed one known contradiction at a time; a BLOCKED result is reported separately and does not count as detection |
+| Saved replay | 50 first-attempt replays per platform produce at least 48/50 PASS and make zero planner requests | Freeze only a complete healthy discovery flow, restore the same baseline, and re-run every authored assertion |
+| Evidence agreement | CLI exit status, JSON, HTML, and workbench show the same PASS/FAIL/BLOCKED verdict and expected-versus-observed checks | Inspect representative pass, fault, block, cancellation, recording, and replay results |
+| Stop and release | Stop prevents any later action dispatch. Cancellation during provider selection, snapshot, fill, press/settle, and metadata releases the owned session within five seconds; unrelated sessions remain untouched | Live cancellation/reopen gates plus exact-device inventory before and after |
+| Privacy and artifacts | Keys and fixture values are absent from frontend/model/shareable output. Recording is opt-in/local, starts after credentials, and is discarded when any later or final screen contains an input/known secret or cannot be verified | Fake-secret scans, malformed-recorder tests, final-screen checks, file permissions, and manual clip inspection |
+| Limits, cost, and speed | Request/action/deadline/cost limits stay non-passing. For healthy flows with at most ten authored actions, warm discovery median is at most 60 seconds per platform | Publish full-run timing phases, request counts, billed provider cost, cold setup separately, and every first attempt |
+| Distribution and demonstration | Type/build/browser regressions pass; packed installs work with and without the optional SDK as documented; native smoke runs use the installed package. README includes real-time playback of every shareable recording segment, discloses excluded private screens/cuts, and links a roughly ten-second edit with a large readable phone view | Clean temporary installs, real browser/workbench flow, native CLI smoke, decoded video/frame QA, and independent final-SHA review |
+
Zero false passes on this controlled benchmark is a release gate, not a guarantee for all websites. If a gate fails, keep the product labeled as a development preview and publish the limitation rather than implying the release is validated. Do not drop difficult benchmark cases to improve the score.
## Owned benchmark app
@@ -76,4 +93,4 @@ For each trial retain app seed/fault, case/plan version, package SHA, model IDs,
After the usable-alpha gate passes, recruit five developers to test three cases on their own apps while the repeated beta evaluation proceeds. Proposed demand milestone: at least four reach a meaningful result within 10 minutes after dependencies/downloads are ready, at least three voluntarily rerun within a week, and every disputed verdict is reviewed against evidence. Also ask which cases they wanted, what setup blocked them, and whether hosted execution would remove a recurring obstacle. Gather this through voluntary feedback; no telemetry service is required. This informs investment in the hosted product and is separate from software correctness. Full beta gates are still required before advertising validated beta results.
-Before any PR is presented as ready, obtain the independent regression review required by the workspace instructions. Review the final intended SHA against the latest target branch, resolve findings, repeat after material fixes, and record the scope, verification, and remaining risks. No PR has been created during this implementation.
+Before any PR is presented as ready, obtain the independent regression review required by the workspace instructions. Review the final intended SHA against the latest target branch, resolve findings, repeat after material fixes, and record the scope, verification, and remaining risks in the PR description.
diff --git a/docs/MOBILE.md b/docs/MOBILE.md
new file mode 100644
index 0000000..3ef4aaa
--- /dev/null
+++ b/docs/MOBILE.md
@@ -0,0 +1,175 @@
+# Native mobile tests
+
+Use the same `run` command for websites, iOS Simulator, and Android Emulator. Jev chooses controls from native accessibility snapshots; the runner checks your expectations independently. This is native app automation, rather than a phone-sized browser.
+
+## Quick start
+
+```sh
+git clone https://github.com/perixtar/jev-e2e.git
+cd jev-e2e
+npm ci && npm run build
+npm link
+jev-e2e doctor --platform ios
+jev-e2e devices --platform ios
+jev-e2e run --platform ios --device EXACT_ID \
+ --app com.example.app --cases mobile.cases --fixtures fixtures.json
+```
+
+An installed bundle/package ID is easiest. A simulator `.app` or emulator `.apk` path also works; it is installed on the selected device. Device names work only when unique. Ambiguous names and physical devices are BLOCKED.
+
+| Target | Local prerequisites | App build |
+| --- | --- | --- |
+| iOS | macOS, Xcode selected by `xcode-select`, installed iOS runtime | Simulator `.app`, or installed bundle ID |
+| Android | Java, Android SDK, `adb` on PATH, booted emulator | Emulator `.apk`, or installed package ID |
+| Website | Node and Chromium (`jev-e2e setup`) | HTTP(S) URL |
+
+Mobile requires Node >=22.12 and the pinned optional `agent-device@0.21.6` package. A source checkout must use the documented `npm ci` before building because the compiler reads the SDK types. After `npm pack` produces a prebuilt tarball, a browser-only consumer may install that tarball with `--omit=optional`; native commands then give an actionable missing-SDK error. Browser-only use needs neither Xcode nor Android tools.
+
+`doctor` checks local tools without opening your app. It does not install host toolchains or open accounts. For Android, export `ANDROID_HOME` and add `$ANDROID_HOME/platform-tools` to PATH **before** the first run; the local SDK daemon retains its startup environment.
+
+## Describe a case
+
+For free-form goals, leave the optional planner on:
+
+```text
+Case: A lamp survives a restart
+Goal: Fill "Email" using @email, fill "Password" using @password, then tap "Sign in". Tap "Open Desk Lamp", tap "Add to cart", relaunch the app, then tap "Cart".
+Expect: text "Desk Lamp" is visible
+Expect: text "Quantity: 1" is visible
+```
+
+Review it without opening your app:
+
+```sh
+jev-e2e plan --platform ios --app com.example.app \
+ --cases mobile.cases --fixtures fixtures.json --out reviewed.json
+jev-e2e run --plan reviewed.json --device EXACT_ID
+```
+
+Keep each `Goal:` on one physical line. A wrapped continuation, including an unprefixed action or credential, blocks before any provider call; use explicit `Step:` lines when a flow is long.
+Free-form actions need their supported verb each time: `tap "Increase", then tap "Increase"` means two taps. A bare repeated label such as `tap "Increase", "Increase"` cannot express a second action safely. Use two `Step:` lines if repetition matters.
+
+For explicit steps, use `--planner off`. Explicit cases and saved plans need no prose-planner call. An unchanged saved flow can run with zero model calls; a stale target uses Jev for repair. Live discovery uses Jev through `OPENROUTER_API_KEY`; a separate OpenAI key is unnecessary.
+
+```text
+Case: Quantity and persistence
+Goal: Two lamps should cost 72 and survive a restart
+Step: Fill "Email" with @email
+Step: Fill "Password" with @password
+Step: Tap "Sign in"
+Step: Tap "Open Desk Lamp"
+Step: Tap "Add to cart"
+Expect: text "Quantity: 1" is visible
+Step: Tap "Increase Desk Lamp quantity"
+Expect: text "Quantity: 2" is visible
+Expect: number in id "cart-total" equals 72
+Step: Relaunch
+Step: Tap "Cart"
+Expect: text "Quantity: 2" is visible
+```
+
+Each Expect is checked after the preceding Step, before a later screen hides the evidence. A failed milestone stops that case. Other cases remain independent; the runner never turns navigation success into a passing verdict.
+With explicit cases, the `Step:` lines define the required actions and `Goal:` summarizes them. If the Goal also names a supported `Tap`/`Fill`/`Check` action, that action must appear in order among the Steps. An extra imperative that cannot be bound safely blocks; write it as an explicit supported Step instead. The compiler cannot infer an unlisted action from a broad Goal summary.
+
+| Step | Meaning |
+| --- | --- |
+| `Tap "Add to cart"` | Tap a named observed control |
+| `Fill "Search" with "lamp"` | Replace field text, rather than append |
+| `Fill "Password" with @password` | Resolve a credential locally |
+| `Check "Notifications"` / `Uncheck "Notifications"` | Set a readable switch/checkbox state |
+| `Scroll down` / `up` / `left` / `right` | One bounded scroll pass |
+| `Back` | Native back navigation |
+| `Dismiss keyboard` | Observed dismiss control or the platform's supported dismiss action |
+| `Wait for text "Ready"` | Wait for exact visible accessibility text |
+| `Relaunch` | Terminate and reopen the app, preserving data |
+
+Relaunch is different from browser Reload. Mobile plans reject web Reload/Select and browser Auth/storageState. Native menus should use their observed option buttons.
+
+Supported expectations: exact text visibility/absence, readable field values, strict numeric values, switch state, identifiers (`Expect: id "cart-screen" is visible`), and counts with a complete visible accessibility tree. Semantic record checks need actual accessible record containers. Scroll-hidden or truncated trees cannot prove absence or whole-collection counts. Missing/ambiguous evidence is BLOCKED; an observed contradiction is FAIL.
+The pinned iOS SDK can omit its optional quality verdict. In that case the runner requires two fresh, matching app-owned XCTest trees with explicit nontruncation and complete visibility metadata. A sparse tree, missing completeness metadata, or a warning about hierarchy limits blocks the check. Custom-rendered content that never appears in accessibility remains outside this proof.
+
+Use `Expect: number in id "cart-total" equals 72` when an app exposes a stable accessibility identifier. Native backends can expose different labels for the same value; an identifier avoids guessing or matching a nearby number.
+For switches, use `Expect: switch id "notifications" is checked` (or `unchecked`) when the state is exposed under an identifier.
+The pinned Android SDK omits the checked flag. For switches/checkboxes, the driver supplements the snapshot with `adb uiautomator` evidence and accepts it only when the app, identifier, class, and bounds uniquely agree. Android permits one accessibility reader: the driver temporarily pauses the SDK snapshot helper on its leased device, then the SDK restarts it on the next capture. The tested app and its data stay intact. Missing or conflicting state blocks; `selected=false` is never treated as unchecked.
+
+On Android, clearing a controlled text field can replace its native input connection. For a populated field with a stable ID, jev-e2e clears once, confirms the same field is empty and focused with exact accessibility evidence, then types once through the new connection and verifies the final value. Any unconfirmed stage blocks; it does not retry the mutation.
+
+## Fixtures and baseline
+
+```json
+{
+ "inputs": {
+ "email": { "env": "E2E_TEST_EMAIL" },
+ "password": { "env": "E2E_TEST_PASSWORD" }
+ },
+ "auth": {}
+}
+```
+
+Keep actual credentials in local environment variables. Fixture values never belong in cases or saved plans. Even a field labeled only `Code` requires a fixture: it may be a one-time password. Field-name checks cannot recognize every app-specific secret label, so always use a fixture for credentials and private values. Native tests sign in through the UI; browser storageState cannot preload native authentication.
+Do not assert the literal value of a credential field, even a short code; check a non-secret success/error state instead.
+
+Prepare your app's baseline yourself before each independent case. Opening or relaunching preserves data; uninstalling an iOS app does not guarantee Keychain reset. The CLI does not run arbitrary reset shell commands or clear user data automatically. Use dedicated test devices and test accounts.
+
+## Reports, replay, limits, and Stop
+
+```sh
+jev-e2e run --platform android --device emulator-5554 \
+ --app com.example.app --cases mobile.cases --planner off \
+ --fixtures fixtures.json --record --out ./local-report
+jev-e2e run --replay ./local-report/plan.json --device emulator-5554
+```
+
+Reports include expected/observed milestones, unchecked expectations, confirmed or uncertain action dispatches, versions, model usage/cost, and planning/setup/observation/model/action/check/artifact/cleanup timings. A target rejected by the final freshness check is not reported as dispatched. Version-2 native replay plans bind app, platform, and a preserve-data baseline. They store semantic controls and accessibility identifiers, rather than coordinates or ephemeral refs. A successful run from a `.app` or `.apk` path also pins the installed bundle/package ID; replay blocks before an action if the build at that path now installs a different app. Older build-path plans without a pinned identity must be run with `--plan` once to create a new replay artifact. A stale missing control may be repaired by Jev; ambiguous or unsafe controls block. Existing version-1 web plans retain browser behavior.
+
+| Outcome | Exit | Meaning |
+| --- | --- | --- |
+| PASS | 0 | All required actions and expectations checked |
+| FAIL | 1 | Observed behavior contradicted an expectation |
+| BLOCKED | 2 | Setup, missing evidence/control, ambiguity, deadline, or limit |
+| Canceled | 130 | Ctrl-C stopped owned work |
+
+Defaults: 60 seconds/case, 30 actions/case, 100 requests/run, $0.05/run. Override with `--timeout`, `--max-actions`, `--max-requests`, `--max-cost`. Request reservations enforce the budget before dispatch. Unknown billing is conservatively reserved. Stop closes the owned worker connection, cancels its native request, then releases its uniquely named session. The runner never retries an uncertain mutation or closes another user's session.
+
+## Workbench and recording
+
+`jev-e2e ui` offers Website/iOS/Android target selection, a device inventory, reviewed plans, Stop, a large portrait preview, local video playback, and report links. Changing the app, device, platform, recording preference, or saved source invalidates the review.
+
+`--record` is explicit and local. Recording begins only after the last fixture/credential-entry step and after a screen without private fields/known values. Credential-entry segments are excluded. If a later screen exposes an input or known secret, the entire clip is discarded. Native screenshots conservatively omit screens containing text fields or known secrets. Raw SDK logs/recordings remain private local artifacts; nothing uploads automatically. Inspect footage before sharing: text redaction alone cannot remove secrets from pixels.
+
+## Reproduce the owned shopping fixture
+
+The fixture is React Native with Expo SDK 57. Its build dependencies are separate from the CLI. It has a fixed catalog and evaluator-only fault/reset service.
+
+```sh
+cd examples/mobile-app
+npm ci
+npx expo prebuild --no-install
+# iOS
+cd ios && pod install
+xcodebuild -workspace JevShop.xcworkspace -scheme JevShop \
+ -configuration Release -sdk iphonesimulator \
+ -destination 'generic/platform=iOS Simulator' \
+ -derivedDataPath ./build CODE_SIGNING_ALLOWED=NO
+# Android, from examples/mobile-app/android
+./gradlew :app:assembleRelease -PreactNativeArchitectures=arm64-v8a
+```
+
+Start `node examples/mobile-app/control.mjs` from the repository root for manual tests. Synthetic credentials: `demo@example.test` / `correct-horse`; wrong password: `wrong-horse`. Export these into the variables in `examples/mobile.fixtures.example.json`. Install the builds on dedicated devices and use the cases in `examples/mobile.cases`.
+
+Run one platform at a time, as in the published acceptance cohort. The evaluator owns its baseline service and retains every first attempt:
+
+```sh
+npm run build
+node scripts/evaluate-mobile.mjs --live --platform ios \
+ --ios-device IOS_ID --rounds 10 --max-cost 2 \
+ --out .jev-e2e/mobile-evaluation/ios
+node scripts/evaluate-mobile.mjs --live --platform android \
+ --android-device emulator-5554 --rounds 10 --max-cost 2 \
+ --out .jev-e2e/mobile-evaluation/android
+```
+
+It verifies that each trial consumed its intended baseline/fault configuration. Healthy execution, bug detection, and replay are reported separately; BLOCKED is never counted as detected failure.
+
+Current scope: local virtual devices and accessible native/React Native controls. Physical phones, hosted devices, complex WebViews, arbitrary canvas controls, subjective appearance, biometrics, and payments require separate validation.
+Free-form goals fail closed when an action cannot be bound to the supported verbs, including some read-only phrases with words such as “confirm” or “filter.” In that case, put concrete actions in `Step:` lines and keep the `Goal:` a short summary.
diff --git a/docs/USAGE.md b/docs/USAGE.md
index 0f936cf..454bdc8 100644
--- a/docs/USAGE.md
+++ b/docs/USAGE.md
@@ -1,6 +1,7 @@
# CLI and case reference
Commands below run from the repository root after the [source installation](../README.md#quick-start).
+For iOS Simulator and Android Emulator setup, steps, expectations, recording, and replay, use the [native mobile guide](MOBILE.md).
```sh
# Read-only public-site example; no auth fixtures needed.
diff --git a/docs/assets/mobile-demo-10s.mp4 b/docs/assets/mobile-demo-10s.mp4
new file mode 100644
index 0000000..2f4b360
Binary files /dev/null and b/docs/assets/mobile-demo-10s.mp4 differ
diff --git a/docs/assets/mobile-demo-poster.jpg b/docs/assets/mobile-demo-poster.jpg
new file mode 100644
index 0000000..091cc95
Binary files /dev/null and b/docs/assets/mobile-demo-poster.jpg differ
diff --git a/docs/assets/mobile-demo-real-time.mp4 b/docs/assets/mobile-demo-real-time.mp4
new file mode 100644
index 0000000..925f48a
Binary files /dev/null and b/docs/assets/mobile-demo-real-time.mp4 differ
diff --git a/docs/benchmarks/native-mobile-2026-09-19.json b/docs/benchmarks/native-mobile-2026-09-19.json
new file mode 100644
index 0000000..9db5534
--- /dev/null
+++ b/docs/benchmarks/native-mobile-2026-09-19.json
@@ -0,0 +1,5425 @@
+{
+ "measuredAt": "2026-09-19T09:31:13.610Z",
+ "implementationSha": "96a275e8c452fbc40ad5b52d83c538664edc0b64",
+ "fixture": "examples/mobile-app (Jev Shop)",
+ "cases": "examples/mobile.cases",
+ "provider": "OpenRouter",
+ "evaluation": "Five cases × ten first attempts per mode and platform within two isolated registered 30-suite cohorts; no retries or omitted trials within those cohorts. Earlier host/SDK diagnostic attempts are excluded.",
+ "aggregate": [
+ {
+ "platform": "ios",
+ "passed": true,
+ "groups": {
+ "healthy": {
+ "PASS": 50,
+ "FAIL": 0,
+ "BLOCKED": 0,
+ "perFlow": [
+ 10,
+ 10,
+ 10,
+ 10,
+ 10
+ ],
+ "medianMs": 27214,
+ "p95Ms": 30238,
+ "warmMedianMs": 27198,
+ "artifactMs": 40742,
+ "modelCost": 0.014206877999999996,
+ "plannerRequests": 0,
+ "jevRequests": 250
+ },
+ "broken": {
+ "PASS": 0,
+ "FAIL": 50,
+ "BLOCKED": 0,
+ "correctFAIL": 50,
+ "perFlow": [
+ 10,
+ 10,
+ 10,
+ 10,
+ 10
+ ],
+ "medianMs": 29166,
+ "p95Ms": 31655,
+ "warmMedianMs": 29166,
+ "artifactMs": 37672,
+ "modelCost": 0.014237999999999995,
+ "plannerRequests": 0,
+ "jevRequests": 250
+ },
+ "replay": {
+ "PASS": 50,
+ "FAIL": 0,
+ "BLOCKED": 0,
+ "perFlow": [
+ 10,
+ 10,
+ 10,
+ 10,
+ 10
+ ],
+ "medianMs": 25242,
+ "p95Ms": 36574,
+ "warmMedianMs": 25242,
+ "artifactMs": 36739,
+ "modelCost": 0.0016774800000000003,
+ "plannerRequests": 0,
+ "jevRequests": 30
+ }
+ },
+ "originalStrictEvaluatorPassed": false,
+ "strictZeroJevReplayDiagnosticPassed": false
+ },
+ {
+ "platform": "android",
+ "passed": true,
+ "groups": {
+ "healthy": {
+ "PASS": 50,
+ "FAIL": 0,
+ "BLOCKED": 0,
+ "perFlow": [
+ 10,
+ 10,
+ 10,
+ 10,
+ 10
+ ],
+ "medianMs": 10438,
+ "p95Ms": 13104,
+ "warmMedianMs": 10570,
+ "artifactMs": 46702,
+ "modelCost": 0.012789000000000002,
+ "plannerRequests": 0,
+ "jevRequests": 259
+ },
+ "broken": {
+ "PASS": 0,
+ "FAIL": 50,
+ "BLOCKED": 0,
+ "correctFAIL": 50,
+ "perFlow": [
+ 10,
+ 10,
+ 10,
+ 10,
+ 10
+ ],
+ "medianMs": 12356,
+ "p95Ms": 14939,
+ "warmMedianMs": 12396,
+ "artifactMs": 46160,
+ "modelCost": 0.012834864000000001,
+ "plannerRequests": 0,
+ "jevRequests": 261
+ },
+ "replay": {
+ "PASS": 50,
+ "FAIL": 0,
+ "BLOCKED": 0,
+ "perFlow": [
+ 10,
+ 10,
+ 10,
+ 10,
+ 10
+ ],
+ "medianMs": 8700,
+ "p95Ms": 11121,
+ "warmMedianMs": 8704,
+ "artifactMs": 46486,
+ "modelCost": 0,
+ "plannerRequests": 0,
+ "jevRequests": 0
+ }
+ },
+ "originalStrictEvaluatorPassed": true,
+ "strictZeroJevReplayDiagnosticPassed": true
+ }
+ ],
+ "totalBilledApiCostUsd": 0.05574622199999998,
+ "trials": [
+ {
+ "platform": "ios",
+ "mode": "healthy",
+ "round": 1,
+ "baselineFaults": [
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy"
+ ],
+ "baselineVerified": true,
+ "verdict": "PASS",
+ "durationMs": 140990,
+ "phasesMs": {
+ "planning": 18,
+ "setup": 19761,
+ "observation": 4937,
+ "model": 9634,
+ "action": 101181,
+ "check": 1438,
+ "artifact": 3963,
+ "cleanup": 51
+ },
+ "model": {
+ "requests": 25,
+ "plannerRequests": 0,
+ "jevRequests": 25,
+ "cost": 0.001392678,
+ "models": [
+ "typesafe/jev-1.13-20260917"
+ ]
+ },
+ "cases": [
+ {
+ "name": "Invalid login is rejected",
+ "verdict": "PASS",
+ "durationMs": 25569,
+ "passedChecks": 1,
+ "totalChecks": 1,
+ "failedChecks": []
+ },
+ {
+ "name": "Search filters the catalog",
+ "verdict": "PASS",
+ "durationMs": 28967,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Quantity updates the total",
+ "verdict": "PASS",
+ "durationMs": 27631,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Removal empties the cart",
+ "verdict": "PASS",
+ "durationMs": 28563,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Cart persists after relaunch",
+ "verdict": "PASS",
+ "durationMs": 30238,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ }
+ ]
+ },
+ {
+ "platform": "ios",
+ "mode": "healthy",
+ "round": 2,
+ "baselineFaults": [
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy"
+ ],
+ "baselineVerified": true,
+ "verdict": "PASS",
+ "durationMs": 132485,
+ "phasesMs": {
+ "planning": 12,
+ "setup": 18001,
+ "observation": 2923,
+ "model": 7894,
+ "action": 98661,
+ "check": 1109,
+ "artifact": 3839,
+ "cleanup": 43
+ },
+ "model": {
+ "requests": 25,
+ "plannerRequests": 0,
+ "jevRequests": 25,
+ "cost": 0.0014237999999999998,
+ "models": [
+ "typesafe/jev-1.13-20260917"
+ ]
+ },
+ "cases": [
+ {
+ "name": "Invalid login is rejected",
+ "verdict": "PASS",
+ "durationMs": 21370,
+ "passedChecks": 1,
+ "totalChecks": 1,
+ "failedChecks": []
+ },
+ {
+ "name": "Search filters the catalog",
+ "verdict": "PASS",
+ "durationMs": 27192,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Quantity updates the total",
+ "verdict": "PASS",
+ "durationMs": 27144,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Removal empties the cart",
+ "verdict": "PASS",
+ "durationMs": 26848,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Cart persists after relaunch",
+ "verdict": "PASS",
+ "durationMs": 29916,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ }
+ ]
+ },
+ {
+ "platform": "ios",
+ "mode": "healthy",
+ "round": 3,
+ "baselineFaults": [
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy"
+ ],
+ "baselineVerified": true,
+ "verdict": "PASS",
+ "durationMs": 133732,
+ "phasesMs": {
+ "planning": 2,
+ "setup": 18780,
+ "observation": 2912,
+ "model": 7727,
+ "action": 99043,
+ "check": 1078,
+ "artifact": 4133,
+ "cleanup": 56
+ },
+ "model": {
+ "requests": 25,
+ "plannerRequests": 0,
+ "jevRequests": 25,
+ "cost": 0.0014237999999999998,
+ "models": [
+ "typesafe/jev-1.13-20260917"
+ ]
+ },
+ "cases": [
+ {
+ "name": "Invalid login is rejected",
+ "verdict": "PASS",
+ "durationMs": 21464,
+ "passedChecks": 1,
+ "totalChecks": 1,
+ "failedChecks": []
+ },
+ {
+ "name": "Search filters the catalog",
+ "verdict": "PASS",
+ "durationMs": 27085,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Quantity updates the total",
+ "verdict": "PASS",
+ "durationMs": 27425,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Removal empties the cart",
+ "verdict": "PASS",
+ "durationMs": 27788,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Cart persists after relaunch",
+ "verdict": "PASS",
+ "durationMs": 29967,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ }
+ ]
+ },
+ {
+ "platform": "ios",
+ "mode": "healthy",
+ "round": 4,
+ "baselineFaults": [
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy"
+ ],
+ "baselineVerified": true,
+ "verdict": "PASS",
+ "durationMs": 136010,
+ "phasesMs": {
+ "planning": 2,
+ "setup": 19411,
+ "observation": 2953,
+ "model": 8551,
+ "action": 99460,
+ "check": 1096,
+ "artifact": 4482,
+ "cleanup": 52
+ },
+ "model": {
+ "requests": 25,
+ "plannerRequests": 0,
+ "jevRequests": 25,
+ "cost": 0.0014237999999999998,
+ "models": [
+ "typesafe/jev-1.13-20260917"
+ ]
+ },
+ "cases": [
+ {
+ "name": "Invalid login is rejected",
+ "verdict": "PASS",
+ "durationMs": 21166,
+ "passedChecks": 1,
+ "totalChecks": 1,
+ "failedChecks": []
+ },
+ {
+ "name": "Search filters the catalog",
+ "verdict": "PASS",
+ "durationMs": 28067,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Quantity updates the total",
+ "verdict": "PASS",
+ "durationMs": 27804,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Removal empties the cart",
+ "verdict": "PASS",
+ "durationMs": 28793,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Cart persists after relaunch",
+ "verdict": "PASS",
+ "durationMs": 30175,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ }
+ ]
+ },
+ {
+ "platform": "ios",
+ "mode": "healthy",
+ "round": 5,
+ "baselineFaults": [
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy"
+ ],
+ "baselineVerified": true,
+ "verdict": "PASS",
+ "durationMs": 134575,
+ "phasesMs": {
+ "planning": 1,
+ "setup": 19352,
+ "observation": 2879,
+ "model": 8119,
+ "action": 98978,
+ "check": 1069,
+ "artifact": 4123,
+ "cleanup": 52
+ },
+ "model": {
+ "requests": 25,
+ "plannerRequests": 0,
+ "jevRequests": 25,
+ "cost": 0.0014237999999999998,
+ "models": [
+ "typesafe/jev-1.13-20260917"
+ ]
+ },
+ "cases": [
+ {
+ "name": "Invalid login is rejected",
+ "verdict": "PASS",
+ "durationMs": 21518,
+ "passedChecks": 1,
+ "totalChecks": 1,
+ "failedChecks": []
+ },
+ {
+ "name": "Search filters the catalog",
+ "verdict": "PASS",
+ "durationMs": 27377,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Quantity updates the total",
+ "verdict": "PASS",
+ "durationMs": 27430,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Removal empties the cart",
+ "verdict": "PASS",
+ "durationMs": 27638,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Cart persists after relaunch",
+ "verdict": "PASS",
+ "durationMs": 30609,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ }
+ ]
+ },
+ {
+ "platform": "ios",
+ "mode": "healthy",
+ "round": 6,
+ "baselineFaults": [
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy"
+ ],
+ "baselineVerified": true,
+ "verdict": "PASS",
+ "durationMs": 132936,
+ "phasesMs": {
+ "planning": 1,
+ "setup": 18807,
+ "observation": 2894,
+ "model": 8001,
+ "action": 98422,
+ "check": 1085,
+ "artifact": 3674,
+ "cleanup": 50
+ },
+ "model": {
+ "requests": 25,
+ "plannerRequests": 0,
+ "jevRequests": 25,
+ "cost": 0.0014237999999999998,
+ "models": [
+ "typesafe/jev-1.13-20260917"
+ ]
+ },
+ "cases": [
+ {
+ "name": "Invalid login is rejected",
+ "verdict": "PASS",
+ "durationMs": 21361,
+ "passedChecks": 1,
+ "totalChecks": 1,
+ "failedChecks": []
+ },
+ {
+ "name": "Search filters the catalog",
+ "verdict": "PASS",
+ "durationMs": 26871,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Quantity updates the total",
+ "verdict": "PASS",
+ "durationMs": 27443,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Removal empties the cart",
+ "verdict": "PASS",
+ "durationMs": 27546,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Cart persists after relaunch",
+ "verdict": "PASS",
+ "durationMs": 29713,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ }
+ ]
+ },
+ {
+ "platform": "ios",
+ "mode": "healthy",
+ "round": 7,
+ "baselineFaults": [
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy"
+ ],
+ "baselineVerified": true,
+ "verdict": "PASS",
+ "durationMs": 132088,
+ "phasesMs": {
+ "planning": 1,
+ "setup": 17747,
+ "observation": 2937,
+ "model": 7909,
+ "action": 98761,
+ "check": 1078,
+ "artifact": 3611,
+ "cleanup": 42
+ },
+ "model": {
+ "requests": 25,
+ "plannerRequests": 0,
+ "jevRequests": 25,
+ "cost": 0.0014237999999999998,
+ "models": [
+ "typesafe/jev-1.13-20260917"
+ ]
+ },
+ "cases": [
+ {
+ "name": "Invalid login is rejected",
+ "verdict": "PASS",
+ "durationMs": 21332,
+ "passedChecks": 1,
+ "totalChecks": 1,
+ "failedChecks": []
+ },
+ {
+ "name": "Search filters the catalog",
+ "verdict": "PASS",
+ "durationMs": 26859,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Quantity updates the total",
+ "verdict": "PASS",
+ "durationMs": 27214,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Removal empties the cart",
+ "verdict": "PASS",
+ "durationMs": 27024,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Cart persists after relaunch",
+ "verdict": "PASS",
+ "durationMs": 29655,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ }
+ ]
+ },
+ {
+ "platform": "ios",
+ "mode": "healthy",
+ "round": 8,
+ "baselineFaults": [
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy"
+ ],
+ "baselineVerified": true,
+ "verdict": "PASS",
+ "durationMs": 134191,
+ "phasesMs": {
+ "planning": 1,
+ "setup": 17808,
+ "observation": 2934,
+ "model": 8343,
+ "action": 99144,
+ "check": 1089,
+ "artifact": 4827,
+ "cleanup": 40
+ },
+ "model": {
+ "requests": 25,
+ "plannerRequests": 0,
+ "jevRequests": 25,
+ "cost": 0.0014237999999999998,
+ "models": [
+ "typesafe/jev-1.13-20260917"
+ ]
+ },
+ "cases": [
+ {
+ "name": "Invalid login is rejected",
+ "verdict": "PASS",
+ "durationMs": 21270,
+ "passedChecks": 1,
+ "totalChecks": 1,
+ "failedChecks": []
+ },
+ {
+ "name": "Search filters the catalog",
+ "verdict": "PASS",
+ "durationMs": 26928,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Quantity updates the total",
+ "verdict": "PASS",
+ "durationMs": 27641,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Removal empties the cart",
+ "verdict": "PASS",
+ "durationMs": 27067,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Cart persists after relaunch",
+ "verdict": "PASS",
+ "durationMs": 31282,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ }
+ ]
+ },
+ {
+ "platform": "ios",
+ "mode": "healthy",
+ "round": 9,
+ "baselineFaults": [
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy"
+ ],
+ "baselineVerified": true,
+ "verdict": "PASS",
+ "durationMs": 132375,
+ "phasesMs": {
+ "planning": 1,
+ "setup": 17654,
+ "observation": 2934,
+ "model": 7476,
+ "action": 98786,
+ "check": 1079,
+ "artifact": 4386,
+ "cleanup": 54
+ },
+ "model": {
+ "requests": 25,
+ "plannerRequests": 0,
+ "jevRequests": 25,
+ "cost": 0.0014237999999999998,
+ "models": [
+ "typesafe/jev-1.13-20260917"
+ ]
+ },
+ "cases": [
+ {
+ "name": "Invalid login is rejected",
+ "verdict": "PASS",
+ "durationMs": 21134,
+ "passedChecks": 1,
+ "totalChecks": 1,
+ "failedChecks": []
+ },
+ {
+ "name": "Search filters the catalog",
+ "verdict": "PASS",
+ "durationMs": 26735,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Quantity updates the total",
+ "verdict": "PASS",
+ "durationMs": 26979,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Removal empties the cart",
+ "verdict": "PASS",
+ "durationMs": 28043,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Cart persists after relaunch",
+ "verdict": "PASS",
+ "durationMs": 29479,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ }
+ ]
+ },
+ {
+ "platform": "ios",
+ "mode": "healthy",
+ "round": 10,
+ "baselineFaults": [
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy"
+ ],
+ "baselineVerified": true,
+ "verdict": "PASS",
+ "durationMs": 132287,
+ "phasesMs": {
+ "planning": 1,
+ "setup": 17731,
+ "observation": 2942,
+ "model": 7762,
+ "action": 98998,
+ "check": 1098,
+ "artifact": 3704,
+ "cleanup": 49
+ },
+ "model": {
+ "requests": 25,
+ "plannerRequests": 0,
+ "jevRequests": 25,
+ "cost": 0.0014237999999999998,
+ "models": [
+ "typesafe/jev-1.13-20260917"
+ ]
+ },
+ "cases": [
+ {
+ "name": "Invalid login is rejected",
+ "verdict": "PASS",
+ "durationMs": 21305,
+ "passedChecks": 1,
+ "totalChecks": 1,
+ "failedChecks": []
+ },
+ {
+ "name": "Search filters the catalog",
+ "verdict": "PASS",
+ "durationMs": 26973,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Quantity updates the total",
+ "verdict": "PASS",
+ "durationMs": 27084,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Removal empties the cart",
+ "verdict": "PASS",
+ "durationMs": 27198,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Cart persists after relaunch",
+ "verdict": "PASS",
+ "durationMs": 29724,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ }
+ ]
+ },
+ {
+ "platform": "ios",
+ "mode": "broken",
+ "round": 1,
+ "baselineFaults": [
+ "invalid-login",
+ "wrong-filter",
+ "wrong-total",
+ "ineffective-removal",
+ "lost-persistence"
+ ],
+ "baselineVerified": true,
+ "correctFaults": [
+ true,
+ true,
+ true,
+ true,
+ true
+ ],
+ "verdict": "FAIL",
+ "durationMs": 142294,
+ "phasesMs": {
+ "planning": 1,
+ "setup": 17704,
+ "observation": 2948,
+ "model": 8113,
+ "action": 98835,
+ "check": 10761,
+ "artifact": 3889,
+ "cleanup": 42
+ },
+ "model": {
+ "requests": 25,
+ "plannerRequests": 0,
+ "jevRequests": 25,
+ "cost": 0.0014237999999999998,
+ "models": [
+ "typesafe/jev-1.13-20260917"
+ ]
+ },
+ "cases": [
+ {
+ "name": "Invalid login is rejected",
+ "verdict": "FAIL",
+ "durationMs": 23233,
+ "passedChecks": 0,
+ "totalChecks": 1,
+ "failedChecks": [
+ {
+ "kind": "visible",
+ "expected": true,
+ "observed": false
+ }
+ ]
+ },
+ {
+ "name": "Search filters the catalog",
+ "verdict": "FAIL",
+ "durationMs": 28866,
+ "passedChecks": 2,
+ "totalChecks": 3,
+ "failedChecks": [
+ {
+ "kind": "absent",
+ "expected": false,
+ "observed": true
+ }
+ ]
+ },
+ {
+ "name": "Quantity updates the total",
+ "verdict": "FAIL",
+ "durationMs": 29337,
+ "passedChecks": 2,
+ "totalChecks": 3,
+ "failedChecks": [
+ {
+ "kind": "number",
+ "expected": 72,
+ "observed": 77
+ }
+ ]
+ },
+ {
+ "name": "Removal empties the cart",
+ "verdict": "FAIL",
+ "durationMs": 29405,
+ "passedChecks": 1,
+ "totalChecks": 2,
+ "failedChecks": [
+ {
+ "kind": "visible",
+ "expected": true,
+ "observed": false
+ }
+ ]
+ },
+ {
+ "name": "Cart persists after relaunch",
+ "verdict": "FAIL",
+ "durationMs": 31450,
+ "passedChecks": 1,
+ "totalChecks": 2,
+ "failedChecks": [
+ {
+ "kind": "visible",
+ "expected": true,
+ "observed": false
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "platform": "ios",
+ "mode": "broken",
+ "round": 2,
+ "baselineFaults": [
+ "invalid-login",
+ "wrong-filter",
+ "wrong-total",
+ "ineffective-removal",
+ "lost-persistence"
+ ],
+ "baselineVerified": true,
+ "correctFaults": [
+ true,
+ true,
+ true,
+ true,
+ true
+ ],
+ "verdict": "FAIL",
+ "durationMs": 142417,
+ "phasesMs": {
+ "planning": 2,
+ "setup": 17608,
+ "observation": 3018,
+ "model": 7886,
+ "action": 99131,
+ "check": 10893,
+ "artifact": 3830,
+ "cleanup": 48
+ },
+ "model": {
+ "requests": 25,
+ "plannerRequests": 0,
+ "jevRequests": 25,
+ "cost": 0.0014237999999999998,
+ "models": [
+ "typesafe/jev-1.13-20260917"
+ ]
+ },
+ "cases": [
+ {
+ "name": "Invalid login is rejected",
+ "verdict": "FAIL",
+ "durationMs": 23045,
+ "passedChecks": 0,
+ "totalChecks": 1,
+ "failedChecks": [
+ {
+ "kind": "visible",
+ "expected": true,
+ "observed": false
+ }
+ ]
+ },
+ {
+ "name": "Search filters the catalog",
+ "verdict": "FAIL",
+ "durationMs": 29085,
+ "passedChecks": 2,
+ "totalChecks": 3,
+ "failedChecks": [
+ {
+ "kind": "absent",
+ "expected": false,
+ "observed": true
+ }
+ ]
+ },
+ {
+ "name": "Quantity updates the total",
+ "verdict": "FAIL",
+ "durationMs": 29435,
+ "passedChecks": 2,
+ "totalChecks": 3,
+ "failedChecks": [
+ {
+ "kind": "number",
+ "expected": 72,
+ "observed": 77
+ }
+ ]
+ },
+ {
+ "name": "Removal empties the cart",
+ "verdict": "FAIL",
+ "durationMs": 29257,
+ "passedChecks": 1,
+ "totalChecks": 2,
+ "failedChecks": [
+ {
+ "kind": "visible",
+ "expected": true,
+ "observed": false
+ }
+ ]
+ },
+ {
+ "name": "Cart persists after relaunch",
+ "verdict": "FAIL",
+ "durationMs": 31591,
+ "passedChecks": 1,
+ "totalChecks": 2,
+ "failedChecks": [
+ {
+ "kind": "visible",
+ "expected": true,
+ "observed": false
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "platform": "ios",
+ "mode": "broken",
+ "round": 3,
+ "baselineFaults": [
+ "invalid-login",
+ "wrong-filter",
+ "wrong-total",
+ "ineffective-removal",
+ "lost-persistence"
+ ],
+ "baselineVerified": true,
+ "correctFaults": [
+ true,
+ true,
+ true,
+ true,
+ true
+ ],
+ "verdict": "FAIL",
+ "durationMs": 142234,
+ "phasesMs": {
+ "planning": 1,
+ "setup": 17642,
+ "observation": 2913,
+ "model": 7569,
+ "action": 99310,
+ "check": 10953,
+ "artifact": 3788,
+ "cleanup": 55
+ },
+ "model": {
+ "requests": 25,
+ "plannerRequests": 0,
+ "jevRequests": 25,
+ "cost": 0.0014237999999999998,
+ "models": [
+ "typesafe/jev-1.13-20260917"
+ ]
+ },
+ "cases": [
+ {
+ "name": "Invalid login is rejected",
+ "verdict": "FAIL",
+ "durationMs": 23179,
+ "passedChecks": 0,
+ "totalChecks": 1,
+ "failedChecks": [
+ {
+ "kind": "visible",
+ "expected": true,
+ "observed": false
+ }
+ ]
+ },
+ {
+ "name": "Search filters the catalog",
+ "verdict": "FAIL",
+ "durationMs": 29166,
+ "passedChecks": 2,
+ "totalChecks": 3,
+ "failedChecks": [
+ {
+ "kind": "absent",
+ "expected": false,
+ "observed": true
+ }
+ ]
+ },
+ {
+ "name": "Quantity updates the total",
+ "verdict": "FAIL",
+ "durationMs": 29131,
+ "passedChecks": 2,
+ "totalChecks": 3,
+ "failedChecks": [
+ {
+ "kind": "number",
+ "expected": 72,
+ "observed": 77
+ }
+ ]
+ },
+ {
+ "name": "Removal empties the cart",
+ "verdict": "FAIL",
+ "durationMs": 29164,
+ "passedChecks": 1,
+ "totalChecks": 2,
+ "failedChecks": [
+ {
+ "kind": "visible",
+ "expected": true,
+ "observed": false
+ }
+ ]
+ },
+ {
+ "name": "Cart persists after relaunch",
+ "verdict": "FAIL",
+ "durationMs": 31591,
+ "passedChecks": 1,
+ "totalChecks": 2,
+ "failedChecks": [
+ {
+ "kind": "visible",
+ "expected": true,
+ "observed": false
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "platform": "ios",
+ "mode": "broken",
+ "round": 4,
+ "baselineFaults": [
+ "invalid-login",
+ "wrong-filter",
+ "wrong-total",
+ "ineffective-removal",
+ "lost-persistence"
+ ],
+ "baselineVerified": true,
+ "correctFaults": [
+ true,
+ true,
+ true,
+ true,
+ true
+ ],
+ "verdict": "FAIL",
+ "durationMs": 142395,
+ "phasesMs": {
+ "planning": 0,
+ "setup": 17668,
+ "observation": 2919,
+ "model": 7756,
+ "action": 99213,
+ "check": 11042,
+ "artifact": 3738,
+ "cleanup": 55
+ },
+ "model": {
+ "requests": 25,
+ "plannerRequests": 0,
+ "jevRequests": 25,
+ "cost": 0.0014237999999999998,
+ "models": [
+ "typesafe/jev-1.13-20260917"
+ ]
+ },
+ "cases": [
+ {
+ "name": "Invalid login is rejected",
+ "verdict": "FAIL",
+ "durationMs": 23349,
+ "passedChecks": 0,
+ "totalChecks": 1,
+ "failedChecks": [
+ {
+ "kind": "visible",
+ "expected": true,
+ "observed": false
+ }
+ ]
+ },
+ {
+ "name": "Search filters the catalog",
+ "verdict": "FAIL",
+ "durationMs": 29180,
+ "passedChecks": 2,
+ "totalChecks": 3,
+ "failedChecks": [
+ {
+ "kind": "absent",
+ "expected": false,
+ "observed": true
+ }
+ ]
+ },
+ {
+ "name": "Quantity updates the total",
+ "verdict": "FAIL",
+ "durationMs": 29256,
+ "passedChecks": 2,
+ "totalChecks": 3,
+ "failedChecks": [
+ {
+ "kind": "number",
+ "expected": 72,
+ "observed": 77
+ }
+ ]
+ },
+ {
+ "name": "Removal empties the cart",
+ "verdict": "FAIL",
+ "durationMs": 28942,
+ "passedChecks": 1,
+ "totalChecks": 2,
+ "failedChecks": [
+ {
+ "kind": "visible",
+ "expected": true,
+ "observed": false
+ }
+ ]
+ },
+ {
+ "name": "Cart persists after relaunch",
+ "verdict": "FAIL",
+ "durationMs": 31665,
+ "passedChecks": 1,
+ "totalChecks": 2,
+ "failedChecks": [
+ {
+ "kind": "visible",
+ "expected": true,
+ "observed": false
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "platform": "ios",
+ "mode": "broken",
+ "round": 5,
+ "baselineFaults": [
+ "invalid-login",
+ "wrong-filter",
+ "wrong-total",
+ "ineffective-removal",
+ "lost-persistence"
+ ],
+ "baselineVerified": true,
+ "correctFaults": [
+ true,
+ true,
+ true,
+ true,
+ true
+ ],
+ "verdict": "FAIL",
+ "durationMs": 141559,
+ "phasesMs": {
+ "planning": 1,
+ "setup": 17661,
+ "observation": 2926,
+ "model": 7378,
+ "action": 99117,
+ "check": 10765,
+ "artifact": 3657,
+ "cleanup": 51
+ },
+ "model": {
+ "requests": 25,
+ "plannerRequests": 0,
+ "jevRequests": 25,
+ "cost": 0.0014237999999999998,
+ "models": [
+ "typesafe/jev-1.13-20260917"
+ ]
+ },
+ "cases": [
+ {
+ "name": "Invalid login is rejected",
+ "verdict": "FAIL",
+ "durationMs": 23219,
+ "passedChecks": 0,
+ "totalChecks": 1,
+ "failedChecks": [
+ {
+ "kind": "visible",
+ "expected": true,
+ "observed": false
+ }
+ ]
+ },
+ {
+ "name": "Search filters the catalog",
+ "verdict": "FAIL",
+ "durationMs": 29100,
+ "passedChecks": 2,
+ "totalChecks": 3,
+ "failedChecks": [
+ {
+ "kind": "absent",
+ "expected": false,
+ "observed": true
+ }
+ ]
+ },
+ {
+ "name": "Quantity updates the total",
+ "verdict": "FAIL",
+ "durationMs": 28912,
+ "passedChecks": 2,
+ "totalChecks": 3,
+ "failedChecks": [
+ {
+ "kind": "number",
+ "expected": 72,
+ "observed": 77
+ }
+ ]
+ },
+ {
+ "name": "Removal empties the cart",
+ "verdict": "FAIL",
+ "durationMs": 28867,
+ "passedChecks": 1,
+ "totalChecks": 2,
+ "failedChecks": [
+ {
+ "kind": "visible",
+ "expected": true,
+ "observed": false
+ }
+ ]
+ },
+ {
+ "name": "Cart persists after relaunch",
+ "verdict": "FAIL",
+ "durationMs": 31459,
+ "passedChecks": 1,
+ "totalChecks": 2,
+ "failedChecks": [
+ {
+ "kind": "visible",
+ "expected": true,
+ "observed": false
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "platform": "ios",
+ "mode": "broken",
+ "round": 6,
+ "baselineFaults": [
+ "invalid-login",
+ "wrong-filter",
+ "wrong-total",
+ "ineffective-removal",
+ "lost-persistence"
+ ],
+ "baselineVerified": true,
+ "correctFaults": [
+ true,
+ true,
+ true,
+ true,
+ true
+ ],
+ "verdict": "FAIL",
+ "durationMs": 142909,
+ "phasesMs": {
+ "planning": 1,
+ "setup": 17753,
+ "observation": 2955,
+ "model": 8189,
+ "action": 99391,
+ "check": 10763,
+ "artifact": 3805,
+ "cleanup": 50
+ },
+ "model": {
+ "requests": 25,
+ "plannerRequests": 0,
+ "jevRequests": 25,
+ "cost": 0.0014237999999999998,
+ "models": [
+ "typesafe/jev-1.13-20260917"
+ ]
+ },
+ "cases": [
+ {
+ "name": "Invalid login is rejected",
+ "verdict": "FAIL",
+ "durationMs": 23289,
+ "passedChecks": 0,
+ "totalChecks": 1,
+ "failedChecks": [
+ {
+ "kind": "visible",
+ "expected": true,
+ "observed": false
+ }
+ ]
+ },
+ {
+ "name": "Search filters the catalog",
+ "verdict": "FAIL",
+ "durationMs": 29409,
+ "passedChecks": 2,
+ "totalChecks": 3,
+ "failedChecks": [
+ {
+ "kind": "absent",
+ "expected": false,
+ "observed": true
+ }
+ ]
+ },
+ {
+ "name": "Quantity updates the total",
+ "verdict": "FAIL",
+ "durationMs": 29458,
+ "passedChecks": 2,
+ "totalChecks": 3,
+ "failedChecks": [
+ {
+ "kind": "number",
+ "expected": 72,
+ "observed": 77
+ }
+ ]
+ },
+ {
+ "name": "Removal empties the cart",
+ "verdict": "FAIL",
+ "durationMs": 29095,
+ "passedChecks": 1,
+ "totalChecks": 2,
+ "failedChecks": [
+ {
+ "kind": "visible",
+ "expected": true,
+ "observed": false
+ }
+ ]
+ },
+ {
+ "name": "Cart persists after relaunch",
+ "verdict": "FAIL",
+ "durationMs": 31655,
+ "passedChecks": 1,
+ "totalChecks": 2,
+ "failedChecks": [
+ {
+ "kind": "visible",
+ "expected": true,
+ "observed": false
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "platform": "ios",
+ "mode": "broken",
+ "round": 7,
+ "baselineFaults": [
+ "invalid-login",
+ "wrong-filter",
+ "wrong-total",
+ "ineffective-removal",
+ "lost-persistence"
+ ],
+ "baselineVerified": true,
+ "correctFaults": [
+ true,
+ true,
+ true,
+ true,
+ true
+ ],
+ "verdict": "FAIL",
+ "durationMs": 142461,
+ "phasesMs": {
+ "planning": 1,
+ "setup": 17755,
+ "observation": 2938,
+ "model": 7942,
+ "action": 99143,
+ "check": 10836,
+ "artifact": 3795,
+ "cleanup": 49
+ },
+ "model": {
+ "requests": 25,
+ "plannerRequests": 0,
+ "jevRequests": 25,
+ "cost": 0.0014237999999999998,
+ "models": [
+ "typesafe/jev-1.13-20260917"
+ ]
+ },
+ "cases": [
+ {
+ "name": "Invalid login is rejected",
+ "verdict": "FAIL",
+ "durationMs": 23122,
+ "passedChecks": 0,
+ "totalChecks": 1,
+ "failedChecks": [
+ {
+ "kind": "visible",
+ "expected": true,
+ "observed": false
+ }
+ ]
+ },
+ {
+ "name": "Search filters the catalog",
+ "verdict": "FAIL",
+ "durationMs": 29204,
+ "passedChecks": 2,
+ "totalChecks": 3,
+ "failedChecks": [
+ {
+ "kind": "absent",
+ "expected": false,
+ "observed": true
+ }
+ ]
+ },
+ {
+ "name": "Quantity updates the total",
+ "verdict": "FAIL",
+ "durationMs": 29291,
+ "passedChecks": 2,
+ "totalChecks": 3,
+ "failedChecks": [
+ {
+ "kind": "number",
+ "expected": 72,
+ "observed": 77
+ }
+ ]
+ },
+ {
+ "name": "Removal empties the cart",
+ "verdict": "FAIL",
+ "durationMs": 29210,
+ "passedChecks": 1,
+ "totalChecks": 2,
+ "failedChecks": [
+ {
+ "kind": "visible",
+ "expected": true,
+ "observed": false
+ }
+ ]
+ },
+ {
+ "name": "Cart persists after relaunch",
+ "verdict": "FAIL",
+ "durationMs": 31631,
+ "passedChecks": 1,
+ "totalChecks": 2,
+ "failedChecks": [
+ {
+ "kind": "visible",
+ "expected": true,
+ "observed": false
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "platform": "ios",
+ "mode": "broken",
+ "round": 8,
+ "baselineFaults": [
+ "invalid-login",
+ "wrong-filter",
+ "wrong-total",
+ "ineffective-removal",
+ "lost-persistence"
+ ],
+ "baselineVerified": true,
+ "correctFaults": [
+ true,
+ true,
+ true,
+ true,
+ true
+ ],
+ "verdict": "FAIL",
+ "durationMs": 142358,
+ "phasesMs": {
+ "planning": 1,
+ "setup": 17606,
+ "observation": 2902,
+ "model": 7972,
+ "action": 99058,
+ "check": 10975,
+ "artifact": 3795,
+ "cleanup": 48
+ },
+ "model": {
+ "requests": 25,
+ "plannerRequests": 0,
+ "jevRequests": 25,
+ "cost": 0.0014237999999999998,
+ "models": [
+ "typesafe/jev-1.13-20260917"
+ ]
+ },
+ "cases": [
+ {
+ "name": "Invalid login is rejected",
+ "verdict": "FAIL",
+ "durationMs": 23139,
+ "passedChecks": 0,
+ "totalChecks": 1,
+ "failedChecks": [
+ {
+ "kind": "visible",
+ "expected": true,
+ "observed": false
+ }
+ ]
+ },
+ {
+ "name": "Search filters the catalog",
+ "verdict": "FAIL",
+ "durationMs": 29010,
+ "passedChecks": 2,
+ "totalChecks": 3,
+ "failedChecks": [
+ {
+ "kind": "absent",
+ "expected": false,
+ "observed": true
+ }
+ ]
+ },
+ {
+ "name": "Quantity updates the total",
+ "verdict": "FAIL",
+ "durationMs": 29426,
+ "passedChecks": 2,
+ "totalChecks": 3,
+ "failedChecks": [
+ {
+ "kind": "number",
+ "expected": 72,
+ "observed": 77
+ }
+ ]
+ },
+ {
+ "name": "Removal empties the cart",
+ "verdict": "FAIL",
+ "durationMs": 29000,
+ "passedChecks": 1,
+ "totalChecks": 2,
+ "failedChecks": [
+ {
+ "kind": "visible",
+ "expected": true,
+ "observed": false
+ }
+ ]
+ },
+ {
+ "name": "Cart persists after relaunch",
+ "verdict": "FAIL",
+ "durationMs": 31780,
+ "passedChecks": 1,
+ "totalChecks": 2,
+ "failedChecks": [
+ {
+ "kind": "visible",
+ "expected": true,
+ "observed": false
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "platform": "ios",
+ "mode": "broken",
+ "round": 9,
+ "baselineFaults": [
+ "invalid-login",
+ "wrong-filter",
+ "wrong-total",
+ "ineffective-removal",
+ "lost-persistence"
+ ],
+ "baselineVerified": true,
+ "correctFaults": [
+ true,
+ true,
+ true,
+ true,
+ true
+ ],
+ "verdict": "FAIL",
+ "durationMs": 141788,
+ "phasesMs": {
+ "planning": 1,
+ "setup": 17687,
+ "observation": 2937,
+ "model": 7655,
+ "action": 98896,
+ "check": 10838,
+ "artifact": 3715,
+ "cleanup": 54
+ },
+ "model": {
+ "requests": 25,
+ "plannerRequests": 0,
+ "jevRequests": 25,
+ "cost": 0.0014237999999999998,
+ "models": [
+ "typesafe/jev-1.13-20260917"
+ ]
+ },
+ "cases": [
+ {
+ "name": "Invalid login is rejected",
+ "verdict": "FAIL",
+ "durationMs": 23287,
+ "passedChecks": 0,
+ "totalChecks": 1,
+ "failedChecks": [
+ {
+ "kind": "visible",
+ "expected": true,
+ "observed": false
+ }
+ ]
+ },
+ {
+ "name": "Search filters the catalog",
+ "verdict": "FAIL",
+ "durationMs": 28953,
+ "passedChecks": 2,
+ "totalChecks": 3,
+ "failedChecks": [
+ {
+ "kind": "absent",
+ "expected": false,
+ "observed": true
+ }
+ ]
+ },
+ {
+ "name": "Quantity updates the total",
+ "verdict": "FAIL",
+ "durationMs": 29280,
+ "passedChecks": 2,
+ "totalChecks": 3,
+ "failedChecks": [
+ {
+ "kind": "number",
+ "expected": 72,
+ "observed": 77
+ }
+ ]
+ },
+ {
+ "name": "Removal empties the cart",
+ "verdict": "FAIL",
+ "durationMs": 28908,
+ "passedChecks": 1,
+ "totalChecks": 2,
+ "failedChecks": [
+ {
+ "kind": "visible",
+ "expected": true,
+ "observed": false
+ }
+ ]
+ },
+ {
+ "name": "Cart persists after relaunch",
+ "verdict": "FAIL",
+ "durationMs": 31357,
+ "passedChecks": 1,
+ "totalChecks": 2,
+ "failedChecks": [
+ {
+ "kind": "visible",
+ "expected": true,
+ "observed": false
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "platform": "ios",
+ "mode": "broken",
+ "round": 10,
+ "baselineFaults": [
+ "invalid-login",
+ "wrong-filter",
+ "wrong-total",
+ "ineffective-removal",
+ "lost-persistence"
+ ],
+ "baselineVerified": true,
+ "correctFaults": [
+ true,
+ true,
+ true,
+ true,
+ true
+ ],
+ "verdict": "FAIL",
+ "durationMs": 141671,
+ "phasesMs": {
+ "planning": 1,
+ "setup": 17560,
+ "observation": 2876,
+ "model": 7460,
+ "action": 99197,
+ "check": 10861,
+ "artifact": 3660,
+ "cleanup": 51
+ },
+ "model": {
+ "requests": 25,
+ "plannerRequests": 0,
+ "jevRequests": 25,
+ "cost": 0.0014237999999999998,
+ "models": [
+ "typesafe/jev-1.13-20260917"
+ ]
+ },
+ "cases": [
+ {
+ "name": "Invalid login is rejected",
+ "verdict": "FAIL",
+ "durationMs": 23024,
+ "passedChecks": 0,
+ "totalChecks": 1,
+ "failedChecks": [
+ {
+ "kind": "visible",
+ "expected": true,
+ "observed": false
+ }
+ ]
+ },
+ {
+ "name": "Search filters the catalog",
+ "verdict": "FAIL",
+ "durationMs": 29181,
+ "passedChecks": 2,
+ "totalChecks": 3,
+ "failedChecks": [
+ {
+ "kind": "absent",
+ "expected": false,
+ "observed": true
+ }
+ ]
+ },
+ {
+ "name": "Quantity updates the total",
+ "verdict": "FAIL",
+ "durationMs": 29038,
+ "passedChecks": 2,
+ "totalChecks": 3,
+ "failedChecks": [
+ {
+ "kind": "number",
+ "expected": 72,
+ "observed": 77
+ }
+ ]
+ },
+ {
+ "name": "Removal empties the cart",
+ "verdict": "FAIL",
+ "durationMs": 29206,
+ "passedChecks": 1,
+ "totalChecks": 2,
+ "failedChecks": [
+ {
+ "kind": "visible",
+ "expected": true,
+ "observed": false
+ }
+ ]
+ },
+ {
+ "name": "Cart persists after relaunch",
+ "verdict": "FAIL",
+ "durationMs": 31218,
+ "passedChecks": 1,
+ "totalChecks": 2,
+ "failedChecks": [
+ {
+ "kind": "visible",
+ "expected": true,
+ "observed": false
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "platform": "ios",
+ "mode": "replay",
+ "round": 1,
+ "baselineFaults": [
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy"
+ ],
+ "baselineVerified": true,
+ "verdict": "PASS",
+ "durationMs": 134599,
+ "phasesMs": {
+ "planning": 0,
+ "setup": 17676,
+ "observation": 6783,
+ "model": 1178,
+ "action": 98324,
+ "check": 1165,
+ "artifact": 3757,
+ "cleanup": 54
+ },
+ "model": {
+ "requests": 3,
+ "plannerRequests": 0,
+ "jevRequests": 3,
+ "cost": 0.000167748,
+ "models": [
+ "typesafe/jev-1.13-20260917"
+ ]
+ },
+ "cases": [
+ {
+ "name": "Invalid login is rejected",
+ "verdict": "PASS",
+ "durationMs": 20092,
+ "passedChecks": 1,
+ "totalChecks": 1,
+ "failedChecks": []
+ },
+ {
+ "name": "Search filters the catalog",
+ "verdict": "PASS",
+ "durationMs": 36452,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Quantity updates the total",
+ "verdict": "PASS",
+ "durationMs": 25262,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Removal empties the cart",
+ "verdict": "PASS",
+ "durationMs": 25091,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Cart persists after relaunch",
+ "verdict": "PASS",
+ "durationMs": 27699,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ }
+ ]
+ },
+ {
+ "platform": "ios",
+ "mode": "replay",
+ "round": 2,
+ "baselineFaults": [
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy"
+ ],
+ "baselineVerified": true,
+ "verdict": "PASS",
+ "durationMs": 133922,
+ "phasesMs": {
+ "planning": 0,
+ "setup": 17641,
+ "observation": 6526,
+ "model": 1040,
+ "action": 98288,
+ "check": 1174,
+ "artifact": 3547,
+ "cleanup": 46
+ },
+ "model": {
+ "requests": 3,
+ "plannerRequests": 0,
+ "jevRequests": 3,
+ "cost": 0.000167748,
+ "models": [
+ "typesafe/jev-1.13-20260917"
+ ]
+ },
+ "cases": [
+ {
+ "name": "Invalid login is rejected",
+ "verdict": "PASS",
+ "durationMs": 20111,
+ "passedChecks": 1,
+ "totalChecks": 1,
+ "failedChecks": []
+ },
+ {
+ "name": "Search filters the catalog",
+ "verdict": "PASS",
+ "durationMs": 36178,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Quantity updates the total",
+ "verdict": "PASS",
+ "durationMs": 25014,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Removal empties the cart",
+ "verdict": "PASS",
+ "durationMs": 25023,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Cart persists after relaunch",
+ "verdict": "PASS",
+ "durationMs": 27593,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ }
+ ]
+ },
+ {
+ "platform": "ios",
+ "mode": "replay",
+ "round": 3,
+ "baselineFaults": [
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy"
+ ],
+ "baselineVerified": true,
+ "verdict": "PASS",
+ "durationMs": 134511,
+ "phasesMs": {
+ "planning": 0,
+ "setup": 17575,
+ "observation": 6861,
+ "model": 1204,
+ "action": 98453,
+ "check": 1163,
+ "artifact": 3544,
+ "cleanup": 46
+ },
+ "model": {
+ "requests": 3,
+ "plannerRequests": 0,
+ "jevRequests": 3,
+ "cost": 0.000167748,
+ "models": [
+ "typesafe/jev-1.13-20260917"
+ ]
+ },
+ "cases": [
+ {
+ "name": "Invalid login is rejected",
+ "verdict": "PASS",
+ "durationMs": 20048,
+ "passedChecks": 1,
+ "totalChecks": 1,
+ "failedChecks": []
+ },
+ {
+ "name": "Search filters the catalog",
+ "verdict": "PASS",
+ "durationMs": 36516,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Quantity updates the total",
+ "verdict": "PASS",
+ "durationMs": 25112,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Removal empties the cart",
+ "verdict": "PASS",
+ "durationMs": 25229,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Cart persists after relaunch",
+ "verdict": "PASS",
+ "durationMs": 27604,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ }
+ ]
+ },
+ {
+ "platform": "ios",
+ "mode": "replay",
+ "round": 4,
+ "baselineFaults": [
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy"
+ ],
+ "baselineVerified": true,
+ "verdict": "PASS",
+ "durationMs": 135215,
+ "phasesMs": {
+ "planning": 0,
+ "setup": 17765,
+ "observation": 6897,
+ "model": 1190,
+ "action": 98608,
+ "check": 1126,
+ "artifact": 3918,
+ "cleanup": 51
+ },
+ "model": {
+ "requests": 3,
+ "plannerRequests": 0,
+ "jevRequests": 3,
+ "cost": 0.000167748,
+ "models": [
+ "typesafe/jev-1.13-20260917"
+ ]
+ },
+ "cases": [
+ {
+ "name": "Invalid login is rejected",
+ "verdict": "PASS",
+ "durationMs": 20131,
+ "passedChecks": 1,
+ "totalChecks": 1,
+ "failedChecks": []
+ },
+ {
+ "name": "Search filters the catalog",
+ "verdict": "PASS",
+ "durationMs": 36579,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Quantity updates the total",
+ "verdict": "PASS",
+ "durationMs": 25360,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Removal empties the cart",
+ "verdict": "PASS",
+ "durationMs": 25319,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Cart persists after relaunch",
+ "verdict": "PASS",
+ "durationMs": 27823,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ }
+ ]
+ },
+ {
+ "platform": "ios",
+ "mode": "replay",
+ "round": 5,
+ "baselineFaults": [
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy"
+ ],
+ "baselineVerified": true,
+ "verdict": "PASS",
+ "durationMs": 134756,
+ "phasesMs": {
+ "planning": 0,
+ "setup": 17879,
+ "observation": 6951,
+ "model": 1079,
+ "action": 98269,
+ "check": 1159,
+ "artifact": 3693,
+ "cleanup": 50
+ },
+ "model": {
+ "requests": 3,
+ "plannerRequests": 0,
+ "jevRequests": 3,
+ "cost": 0.000167748,
+ "models": [
+ "typesafe/jev-1.13-20260917"
+ ]
+ },
+ "cases": [
+ {
+ "name": "Invalid login is rejected",
+ "verdict": "PASS",
+ "durationMs": 20439,
+ "passedChecks": 1,
+ "totalChecks": 1,
+ "failedChecks": []
+ },
+ {
+ "name": "Search filters the catalog",
+ "verdict": "PASS",
+ "durationMs": 36360,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Quantity updates the total",
+ "verdict": "PASS",
+ "durationMs": 25212,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Removal empties the cart",
+ "verdict": "PASS",
+ "durationMs": 25112,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Cart persists after relaunch",
+ "verdict": "PASS",
+ "durationMs": 27630,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ }
+ ]
+ },
+ {
+ "platform": "ios",
+ "mode": "replay",
+ "round": 6,
+ "baselineFaults": [
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy"
+ ],
+ "baselineVerified": true,
+ "verdict": "PASS",
+ "durationMs": 134471,
+ "phasesMs": {
+ "planning": 0,
+ "setup": 17709,
+ "observation": 6841,
+ "model": 1309,
+ "action": 98174,
+ "check": 1166,
+ "artifact": 3559,
+ "cleanup": 52
+ },
+ "model": {
+ "requests": 3,
+ "plannerRequests": 0,
+ "jevRequests": 3,
+ "cost": 0.000167748,
+ "models": [
+ "typesafe/jev-1.13-20260917"
+ ]
+ },
+ "cases": [
+ {
+ "name": "Invalid login is rejected",
+ "verdict": "PASS",
+ "durationMs": 20091,
+ "passedChecks": 1,
+ "totalChecks": 1,
+ "failedChecks": []
+ },
+ {
+ "name": "Search filters the catalog",
+ "verdict": "PASS",
+ "durationMs": 36603,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Quantity updates the total",
+ "verdict": "PASS",
+ "durationMs": 25158,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Removal empties the cart",
+ "verdict": "PASS",
+ "durationMs": 25021,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Cart persists after relaunch",
+ "verdict": "PASS",
+ "durationMs": 27597,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ }
+ ]
+ },
+ {
+ "platform": "ios",
+ "mode": "replay",
+ "round": 7,
+ "baselineFaults": [
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy"
+ ],
+ "baselineVerified": true,
+ "verdict": "PASS",
+ "durationMs": 134829,
+ "phasesMs": {
+ "planning": 0,
+ "setup": 17589,
+ "observation": 6908,
+ "model": 1113,
+ "action": 98472,
+ "check": 1174,
+ "artifact": 3666,
+ "cleanup": 46
+ },
+ "model": {
+ "requests": 3,
+ "plannerRequests": 0,
+ "jevRequests": 3,
+ "cost": 0.000167748,
+ "models": [
+ "typesafe/jev-1.13-20260917"
+ ]
+ },
+ "cases": [
+ {
+ "name": "Invalid login is rejected",
+ "verdict": "PASS",
+ "durationMs": 20291,
+ "passedChecks": 1,
+ "totalChecks": 1,
+ "failedChecks": []
+ },
+ {
+ "name": "Search filters the catalog",
+ "verdict": "PASS",
+ "durationMs": 36563,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Quantity updates the total",
+ "verdict": "PASS",
+ "durationMs": 25190,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Removal empties the cart",
+ "verdict": "PASS",
+ "durationMs": 25188,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Cart persists after relaunch",
+ "verdict": "PASS",
+ "durationMs": 27595,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ }
+ ]
+ },
+ {
+ "platform": "ios",
+ "mode": "replay",
+ "round": 8,
+ "baselineFaults": [
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy"
+ ],
+ "baselineVerified": true,
+ "verdict": "PASS",
+ "durationMs": 134732,
+ "phasesMs": {
+ "planning": 1,
+ "setup": 17666,
+ "observation": 6790,
+ "model": 1181,
+ "action": 98360,
+ "check": 1163,
+ "artifact": 3855,
+ "cleanup": 50
+ },
+ "model": {
+ "requests": 3,
+ "plannerRequests": 0,
+ "jevRequests": 3,
+ "cost": 0.000167748,
+ "models": [
+ "typesafe/jev-1.13-20260917"
+ ]
+ },
+ "cases": [
+ {
+ "name": "Invalid login is rejected",
+ "verdict": "PASS",
+ "durationMs": 20038,
+ "passedChecks": 1,
+ "totalChecks": 1,
+ "failedChecks": []
+ },
+ {
+ "name": "Search filters the catalog",
+ "verdict": "PASS",
+ "durationMs": 36574,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Quantity updates the total",
+ "verdict": "PASS",
+ "durationMs": 25334,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Removal empties the cart",
+ "verdict": "PASS",
+ "durationMs": 25120,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Cart persists after relaunch",
+ "verdict": "PASS",
+ "durationMs": 27663,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ }
+ ]
+ },
+ {
+ "platform": "ios",
+ "mode": "replay",
+ "round": 9,
+ "baselineFaults": [
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy"
+ ],
+ "baselineVerified": true,
+ "verdict": "PASS",
+ "durationMs": 134228,
+ "phasesMs": {
+ "planning": 0,
+ "setup": 17594,
+ "observation": 6942,
+ "model": 1143,
+ "action": 98203,
+ "check": 1148,
+ "artifact": 3488,
+ "cleanup": 51
+ },
+ "model": {
+ "requests": 3,
+ "plannerRequests": 0,
+ "jevRequests": 3,
+ "cost": 0.000167748,
+ "models": [
+ "typesafe/jev-1.13-20260917"
+ ]
+ },
+ "cases": [
+ {
+ "name": "Invalid login is rejected",
+ "verdict": "PASS",
+ "durationMs": 20045,
+ "passedChecks": 1,
+ "totalChecks": 1,
+ "failedChecks": []
+ },
+ {
+ "name": "Search filters the catalog",
+ "verdict": "PASS",
+ "durationMs": 36564,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Quantity updates the total",
+ "verdict": "PASS",
+ "durationMs": 25112,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Removal empties the cart",
+ "verdict": "PASS",
+ "durationMs": 25002,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Cart persists after relaunch",
+ "verdict": "PASS",
+ "durationMs": 27502,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ }
+ ]
+ },
+ {
+ "platform": "ios",
+ "mode": "replay",
+ "round": 10,
+ "baselineFaults": [
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy"
+ ],
+ "baselineVerified": true,
+ "verdict": "PASS",
+ "durationMs": 134674,
+ "phasesMs": {
+ "planning": 1,
+ "setup": 17680,
+ "observation": 6835,
+ "model": 1200,
+ "action": 98346,
+ "check": 1174,
+ "artifact": 3712,
+ "cleanup": 56
+ },
+ "model": {
+ "requests": 3,
+ "plannerRequests": 0,
+ "jevRequests": 3,
+ "cost": 0.000167748,
+ "models": [
+ "typesafe/jev-1.13-20260917"
+ ]
+ },
+ "cases": [
+ {
+ "name": "Invalid login is rejected",
+ "verdict": "PASS",
+ "durationMs": 20113,
+ "passedChecks": 1,
+ "totalChecks": 1,
+ "failedChecks": []
+ },
+ {
+ "name": "Search filters the catalog",
+ "verdict": "PASS",
+ "durationMs": 36448,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Quantity updates the total",
+ "verdict": "PASS",
+ "durationMs": 25242,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Removal empties the cart",
+ "verdict": "PASS",
+ "durationMs": 25242,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Cart persists after relaunch",
+ "verdict": "PASS",
+ "durationMs": 27626,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ }
+ ]
+ },
+ {
+ "platform": "android",
+ "mode": "healthy",
+ "round": 1,
+ "baselineFaults": [
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy"
+ ],
+ "baselineVerified": true,
+ "verdict": "PASS",
+ "durationMs": 54353,
+ "phasesMs": {
+ "planning": 17,
+ "setup": 10873,
+ "observation": 3132,
+ "model": 7552,
+ "action": 21911,
+ "check": 4761,
+ "artifact": 4653,
+ "cleanup": 1248
+ },
+ "model": {
+ "requests": 26,
+ "plannerRequests": 0,
+ "jevRequests": 26,
+ "cost": 0.001281168,
+ "models": [
+ "typesafe/jev-1.13-20260917"
+ ]
+ },
+ "cases": [
+ {
+ "name": "Invalid login is rejected",
+ "verdict": "PASS",
+ "durationMs": 8860,
+ "passedChecks": 1,
+ "totalChecks": 1,
+ "failedChecks": []
+ },
+ {
+ "name": "Search filters the catalog",
+ "verdict": "PASS",
+ "durationMs": 10403,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Quantity updates the total",
+ "verdict": "PASS",
+ "durationMs": 12121,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Removal empties the cart",
+ "verdict": "PASS",
+ "durationMs": 10396,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Cart persists after relaunch",
+ "verdict": "PASS",
+ "durationMs": 12552,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ }
+ ]
+ },
+ {
+ "platform": "android",
+ "mode": "healthy",
+ "round": 2,
+ "baselineFaults": [
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy"
+ ],
+ "baselineVerified": true,
+ "verdict": "PASS",
+ "durationMs": 53595,
+ "phasesMs": {
+ "planning": 2,
+ "setup": 10491,
+ "observation": 2712,
+ "model": 7335,
+ "action": 22288,
+ "check": 4716,
+ "artifact": 4626,
+ "cleanup": 1221
+ },
+ "model": {
+ "requests": 26,
+ "plannerRequests": 0,
+ "jevRequests": 26,
+ "cost": 0.001281168,
+ "models": [
+ "typesafe/jev-1.13-20260917"
+ ]
+ },
+ "cases": [
+ {
+ "name": "Invalid login is rejected",
+ "verdict": "PASS",
+ "durationMs": 7976,
+ "passedChecks": 1,
+ "totalChecks": 1,
+ "failedChecks": []
+ },
+ {
+ "name": "Search filters the catalog",
+ "verdict": "PASS",
+ "durationMs": 9973,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Quantity updates the total",
+ "verdict": "PASS",
+ "durationMs": 11902,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Removal empties the cart",
+ "verdict": "PASS",
+ "durationMs": 10438,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Cart persists after relaunch",
+ "verdict": "PASS",
+ "durationMs": 13302,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ }
+ ]
+ },
+ {
+ "platform": "android",
+ "mode": "healthy",
+ "round": 3,
+ "baselineFaults": [
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy"
+ ],
+ "baselineVerified": true,
+ "verdict": "PASS",
+ "durationMs": 53310,
+ "phasesMs": {
+ "planning": 1,
+ "setup": 10535,
+ "observation": 2755,
+ "model": 6638,
+ "action": 22582,
+ "check": 4705,
+ "artifact": 4650,
+ "cleanup": 1238
+ },
+ "model": {
+ "requests": 26,
+ "plannerRequests": 0,
+ "jevRequests": 26,
+ "cost": 0.001281168,
+ "models": [
+ "typesafe/jev-1.13-20260917"
+ ]
+ },
+ "cases": [
+ {
+ "name": "Invalid login is rejected",
+ "verdict": "PASS",
+ "durationMs": 7758,
+ "passedChecks": 1,
+ "totalChecks": 1,
+ "failedChecks": []
+ },
+ {
+ "name": "Search filters the catalog",
+ "verdict": "PASS",
+ "durationMs": 10359,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Quantity updates the total",
+ "verdict": "PASS",
+ "durationMs": 11784,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Removal empties the cart",
+ "verdict": "PASS",
+ "durationMs": 10607,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Cart persists after relaunch",
+ "verdict": "PASS",
+ "durationMs": 12794,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ }
+ ]
+ },
+ {
+ "platform": "android",
+ "mode": "healthy",
+ "round": 4,
+ "baselineFaults": [
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy"
+ ],
+ "baselineVerified": true,
+ "verdict": "PASS",
+ "durationMs": 53404,
+ "phasesMs": {
+ "planning": 2,
+ "setup": 10481,
+ "observation": 2783,
+ "model": 7441,
+ "action": 22222,
+ "check": 4683,
+ "artifact": 4619,
+ "cleanup": 1173
+ },
+ "model": {
+ "requests": 25,
+ "plannerRequests": 0,
+ "jevRequests": 25,
+ "cost": 0.001257984,
+ "models": [
+ "typesafe/jev-1.13-20260917"
+ ]
+ },
+ "cases": [
+ {
+ "name": "Invalid login is rejected",
+ "verdict": "PASS",
+ "durationMs": 7731,
+ "passedChecks": 1,
+ "totalChecks": 1,
+ "failedChecks": []
+ },
+ {
+ "name": "Search filters the catalog",
+ "verdict": "PASS",
+ "durationMs": 10335,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Quantity updates the total",
+ "verdict": "PASS",
+ "durationMs": 12060,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Removal empties the cart",
+ "verdict": "PASS",
+ "durationMs": 10373,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Cart persists after relaunch",
+ "verdict": "PASS",
+ "durationMs": 12901,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ }
+ ]
+ },
+ {
+ "platform": "android",
+ "mode": "healthy",
+ "round": 5,
+ "baselineFaults": [
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy"
+ ],
+ "baselineVerified": true,
+ "verdict": "PASS",
+ "durationMs": 53796,
+ "phasesMs": {
+ "planning": 1,
+ "setup": 10459,
+ "observation": 2678,
+ "model": 7669,
+ "action": 22276,
+ "check": 4698,
+ "artifact": 4781,
+ "cleanup": 1233
+ },
+ "model": {
+ "requests": 25,
+ "plannerRequests": 0,
+ "jevRequests": 25,
+ "cost": 0.0012584879999999999,
+ "models": [
+ "typesafe/jev-1.13-20260917"
+ ]
+ },
+ "cases": [
+ {
+ "name": "Invalid login is rejected",
+ "verdict": "PASS",
+ "durationMs": 8093,
+ "passedChecks": 1,
+ "totalChecks": 1,
+ "failedChecks": []
+ },
+ {
+ "name": "Search filters the catalog",
+ "verdict": "PASS",
+ "durationMs": 9873,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Quantity updates the total",
+ "verdict": "PASS",
+ "durationMs": 12383,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Removal empties the cart",
+ "verdict": "PASS",
+ "durationMs": 10570,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Cart persists after relaunch",
+ "verdict": "PASS",
+ "durationMs": 12864,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ }
+ ]
+ },
+ {
+ "platform": "android",
+ "mode": "healthy",
+ "round": 6,
+ "baselineFaults": [
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy"
+ ],
+ "baselineVerified": true,
+ "verdict": "PASS",
+ "durationMs": 53375,
+ "phasesMs": {
+ "planning": 0,
+ "setup": 10494,
+ "observation": 2645,
+ "model": 7094,
+ "action": 22262,
+ "check": 4707,
+ "artifact": 4742,
+ "cleanup": 1226
+ },
+ "model": {
+ "requests": 26,
+ "plannerRequests": 0,
+ "jevRequests": 26,
+ "cost": 0.001281168,
+ "models": [
+ "typesafe/jev-1.13-20260917"
+ ]
+ },
+ "cases": [
+ {
+ "name": "Invalid login is rejected",
+ "verdict": "PASS",
+ "durationMs": 8064,
+ "passedChecks": 1,
+ "totalChecks": 1,
+ "failedChecks": []
+ },
+ {
+ "name": "Search filters the catalog",
+ "verdict": "PASS",
+ "durationMs": 9907,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Quantity updates the total",
+ "verdict": "PASS",
+ "durationMs": 11608,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Removal empties the cart",
+ "verdict": "PASS",
+ "durationMs": 10686,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Cart persists after relaunch",
+ "verdict": "PASS",
+ "durationMs": 13104,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ }
+ ]
+ },
+ {
+ "platform": "android",
+ "mode": "healthy",
+ "round": 7,
+ "baselineFaults": [
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy"
+ ],
+ "baselineVerified": true,
+ "verdict": "PASS",
+ "durationMs": 52556,
+ "phasesMs": {
+ "planning": 1,
+ "setup": 10523,
+ "observation": 2626,
+ "model": 6773,
+ "action": 21874,
+ "check": 4692,
+ "artifact": 4603,
+ "cleanup": 1261
+ },
+ "model": {
+ "requests": 26,
+ "plannerRequests": 0,
+ "jevRequests": 26,
+ "cost": 0.001281168,
+ "models": [
+ "typesafe/jev-1.13-20260917"
+ ]
+ },
+ "cases": [
+ {
+ "name": "Invalid login is rejected",
+ "verdict": "PASS",
+ "durationMs": 7651,
+ "passedChecks": 1,
+ "totalChecks": 1,
+ "failedChecks": []
+ },
+ {
+ "name": "Search filters the catalog",
+ "verdict": "PASS",
+ "durationMs": 9902,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Quantity updates the total",
+ "verdict": "PASS",
+ "durationMs": 11598,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Removal empties the cart",
+ "verdict": "PASS",
+ "durationMs": 10672,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Cart persists after relaunch",
+ "verdict": "PASS",
+ "durationMs": 12730,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ }
+ ]
+ },
+ {
+ "platform": "android",
+ "mode": "healthy",
+ "round": 8,
+ "baselineFaults": [
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy"
+ ],
+ "baselineVerified": true,
+ "verdict": "PASS",
+ "durationMs": 53858,
+ "phasesMs": {
+ "planning": 1,
+ "setup": 10634,
+ "observation": 2780,
+ "model": 7310,
+ "action": 22393,
+ "check": 4678,
+ "artifact": 4639,
+ "cleanup": 1221
+ },
+ "model": {
+ "requests": 26,
+ "plannerRequests": 0,
+ "jevRequests": 26,
+ "cost": 0.001281168,
+ "models": [
+ "typesafe/jev-1.13-20260917"
+ ]
+ },
+ "cases": [
+ {
+ "name": "Invalid login is rejected",
+ "verdict": "PASS",
+ "durationMs": 7990,
+ "passedChecks": 1,
+ "totalChecks": 1,
+ "failedChecks": []
+ },
+ {
+ "name": "Search filters the catalog",
+ "verdict": "PASS",
+ "durationMs": 10329,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Quantity updates the total",
+ "verdict": "PASS",
+ "durationMs": 11655,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Removal empties the cart",
+ "verdict": "PASS",
+ "durationMs": 10696,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Cart persists after relaunch",
+ "verdict": "PASS",
+ "durationMs": 13184,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ }
+ ]
+ },
+ {
+ "platform": "android",
+ "mode": "healthy",
+ "round": 9,
+ "baselineFaults": [
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy"
+ ],
+ "baselineVerified": true,
+ "verdict": "PASS",
+ "durationMs": 52534,
+ "phasesMs": {
+ "planning": 1,
+ "setup": 10181,
+ "observation": 2587,
+ "model": 6971,
+ "action": 21740,
+ "check": 4745,
+ "artifact": 4656,
+ "cleanup": 1246
+ },
+ "model": {
+ "requests": 27,
+ "plannerRequests": 0,
+ "jevRequests": 27,
+ "cost": 0.001304352,
+ "models": [
+ "typesafe/jev-1.13-20260917"
+ ]
+ },
+ "cases": [
+ {
+ "name": "Invalid login is rejected",
+ "verdict": "PASS",
+ "durationMs": 8145,
+ "passedChecks": 1,
+ "totalChecks": 1,
+ "failedChecks": []
+ },
+ {
+ "name": "Search filters the catalog",
+ "verdict": "PASS",
+ "durationMs": 9671,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Quantity updates the total",
+ "verdict": "PASS",
+ "durationMs": 11521,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Removal empties the cart",
+ "verdict": "PASS",
+ "durationMs": 10143,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Cart persists after relaunch",
+ "verdict": "PASS",
+ "durationMs": 13051,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ }
+ ]
+ },
+ {
+ "platform": "android",
+ "mode": "healthy",
+ "round": 10,
+ "baselineFaults": [
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy"
+ ],
+ "baselineVerified": true,
+ "verdict": "PASS",
+ "durationMs": 52602,
+ "phasesMs": {
+ "planning": 1,
+ "setup": 10434,
+ "observation": 2573,
+ "model": 6918,
+ "action": 21910,
+ "check": 4655,
+ "artifact": 4733,
+ "cleanup": 1174
+ },
+ "model": {
+ "requests": 26,
+ "plannerRequests": 0,
+ "jevRequests": 26,
+ "cost": 0.001281168,
+ "models": [
+ "typesafe/jev-1.13-20260917"
+ ]
+ },
+ "cases": [
+ {
+ "name": "Invalid login is rejected",
+ "verdict": "PASS",
+ "durationMs": 8022,
+ "passedChecks": 1,
+ "totalChecks": 1,
+ "failedChecks": []
+ },
+ {
+ "name": "Search filters the catalog",
+ "verdict": "PASS",
+ "durationMs": 9680,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Quantity updates the total",
+ "verdict": "PASS",
+ "durationMs": 11680,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Removal empties the cart",
+ "verdict": "PASS",
+ "durationMs": 10270,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Cart persists after relaunch",
+ "verdict": "PASS",
+ "durationMs": 12946,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ }
+ ]
+ },
+ {
+ "platform": "android",
+ "mode": "broken",
+ "round": 1,
+ "baselineFaults": [
+ "invalid-login",
+ "wrong-filter",
+ "wrong-total",
+ "ineffective-removal",
+ "lost-persistence"
+ ],
+ "baselineVerified": true,
+ "correctFaults": [
+ true,
+ true,
+ true,
+ true,
+ true
+ ],
+ "verdict": "FAIL",
+ "durationMs": 62851,
+ "phasesMs": {
+ "planning": 1,
+ "setup": 10243,
+ "observation": 2610,
+ "model": 8376,
+ "action": 21993,
+ "check": 13169,
+ "artifact": 4644,
+ "cleanup": 1206
+ },
+ "model": {
+ "requests": 28,
+ "plannerRequests": 0,
+ "jevRequests": 28,
+ "cost": 0.001327536,
+ "models": [
+ "typesafe/jev-1.13-20260917"
+ ]
+ },
+ "cases": [
+ {
+ "name": "Invalid login is rejected",
+ "verdict": "FAIL",
+ "durationMs": 8519,
+ "passedChecks": 0,
+ "totalChecks": 1,
+ "failedChecks": [
+ {
+ "kind": "visible",
+ "expected": true,
+ "observed": false
+ }
+ ]
+ },
+ {
+ "name": "Search filters the catalog",
+ "verdict": "FAIL",
+ "durationMs": 11727,
+ "passedChecks": 2,
+ "totalChecks": 3,
+ "failedChecks": [
+ {
+ "kind": "absent",
+ "expected": false,
+ "observed": true
+ }
+ ]
+ },
+ {
+ "name": "Quantity updates the total",
+ "verdict": "FAIL",
+ "durationMs": 14735,
+ "passedChecks": 2,
+ "totalChecks": 3,
+ "failedChecks": [
+ {
+ "kind": "number",
+ "expected": 72,
+ "observed": 77
+ }
+ ]
+ },
+ {
+ "name": "Removal empties the cart",
+ "verdict": "FAIL",
+ "durationMs": 12356,
+ "passedChecks": 1,
+ "totalChecks": 2,
+ "failedChecks": [
+ {
+ "kind": "visible",
+ "expected": true,
+ "observed": false
+ }
+ ]
+ },
+ {
+ "name": "Cart persists after relaunch",
+ "verdict": "FAIL",
+ "durationMs": 15512,
+ "passedChecks": 1,
+ "totalChecks": 2,
+ "failedChecks": [
+ {
+ "kind": "visible",
+ "expected": true,
+ "observed": false
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "platform": "android",
+ "mode": "broken",
+ "round": 2,
+ "baselineFaults": [
+ "invalid-login",
+ "wrong-filter",
+ "wrong-total",
+ "ineffective-removal",
+ "lost-persistence"
+ ],
+ "baselineVerified": true,
+ "correctFaults": [
+ true,
+ true,
+ true,
+ true,
+ true
+ ],
+ "verdict": "FAIL",
+ "durationMs": 61507,
+ "phasesMs": {
+ "planning": 1,
+ "setup": 10332,
+ "observation": 2734,
+ "model": 7558,
+ "action": 21575,
+ "check": 13228,
+ "artifact": 4689,
+ "cleanup": 1187
+ },
+ "model": {
+ "requests": 26,
+ "plannerRequests": 0,
+ "jevRequests": 26,
+ "cost": 0.001281168,
+ "models": [
+ "typesafe/jev-1.13-20260917"
+ ]
+ },
+ "cases": [
+ {
+ "name": "Invalid login is rejected",
+ "verdict": "FAIL",
+ "durationMs": 8576,
+ "passedChecks": 0,
+ "totalChecks": 1,
+ "failedChecks": [
+ {
+ "kind": "visible",
+ "expected": true,
+ "observed": false
+ }
+ ]
+ },
+ {
+ "name": "Search filters the catalog",
+ "verdict": "FAIL",
+ "durationMs": 12048,
+ "passedChecks": 2,
+ "totalChecks": 3,
+ "failedChecks": [
+ {
+ "kind": "absent",
+ "expected": false,
+ "observed": true
+ }
+ ]
+ },
+ {
+ "name": "Quantity updates the total",
+ "verdict": "FAIL",
+ "durationMs": 13500,
+ "passedChecks": 2,
+ "totalChecks": 3,
+ "failedChecks": [
+ {
+ "kind": "number",
+ "expected": 72,
+ "observed": 77
+ }
+ ]
+ },
+ {
+ "name": "Removal empties the cart",
+ "verdict": "FAIL",
+ "durationMs": 12486,
+ "passedChecks": 1,
+ "totalChecks": 2,
+ "failedChecks": [
+ {
+ "kind": "visible",
+ "expected": true,
+ "observed": false
+ }
+ ]
+ },
+ {
+ "name": "Cart persists after relaunch",
+ "verdict": "FAIL",
+ "durationMs": 14891,
+ "passedChecks": 1,
+ "totalChecks": 2,
+ "failedChecks": [
+ {
+ "kind": "visible",
+ "expected": true,
+ "observed": false
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "platform": "android",
+ "mode": "broken",
+ "round": 3,
+ "baselineFaults": [
+ "invalid-login",
+ "wrong-filter",
+ "wrong-total",
+ "ineffective-removal",
+ "lost-persistence"
+ ],
+ "baselineVerified": true,
+ "correctFaults": [
+ true,
+ true,
+ true,
+ true,
+ true
+ ],
+ "verdict": "FAIL",
+ "durationMs": 62085,
+ "phasesMs": {
+ "planning": 1,
+ "setup": 10450,
+ "observation": 2898,
+ "model": 7294,
+ "action": 21993,
+ "check": 13141,
+ "artifact": 4662,
+ "cleanup": 1240
+ },
+ "model": {
+ "requests": 27,
+ "plannerRequests": 0,
+ "jevRequests": 27,
+ "cost": 0.0013043520000000002,
+ "models": [
+ "typesafe/jev-1.13-20260917"
+ ]
+ },
+ "cases": [
+ {
+ "name": "Invalid login is rejected",
+ "verdict": "FAIL",
+ "durationMs": 8515,
+ "passedChecks": 0,
+ "totalChecks": 1,
+ "failedChecks": [
+ {
+ "kind": "visible",
+ "expected": true,
+ "observed": false
+ }
+ ]
+ },
+ {
+ "name": "Search filters the catalog",
+ "verdict": "FAIL",
+ "durationMs": 12534,
+ "passedChecks": 2,
+ "totalChecks": 3,
+ "failedChecks": [
+ {
+ "kind": "absent",
+ "expected": false,
+ "observed": true
+ }
+ ]
+ },
+ {
+ "name": "Quantity updates the total",
+ "verdict": "FAIL",
+ "durationMs": 13953,
+ "passedChecks": 2,
+ "totalChecks": 3,
+ "failedChecks": [
+ {
+ "kind": "number",
+ "expected": 72,
+ "observed": 77
+ }
+ ]
+ },
+ {
+ "name": "Removal empties the cart",
+ "verdict": "FAIL",
+ "durationMs": 12246,
+ "passedChecks": 1,
+ "totalChecks": 2,
+ "failedChecks": [
+ {
+ "kind": "visible",
+ "expected": true,
+ "observed": false
+ }
+ ]
+ },
+ {
+ "name": "Cart persists after relaunch",
+ "verdict": "FAIL",
+ "durationMs": 14833,
+ "passedChecks": 1,
+ "totalChecks": 2,
+ "failedChecks": [
+ {
+ "kind": "visible",
+ "expected": true,
+ "observed": false
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "platform": "android",
+ "mode": "broken",
+ "round": 4,
+ "baselineFaults": [
+ "invalid-login",
+ "wrong-filter",
+ "wrong-total",
+ "ineffective-removal",
+ "lost-persistence"
+ ],
+ "baselineVerified": true,
+ "correctFaults": [
+ true,
+ true,
+ true,
+ true,
+ true
+ ],
+ "verdict": "FAIL",
+ "durationMs": 60804,
+ "phasesMs": {
+ "planning": 1,
+ "setup": 10255,
+ "observation": 2691,
+ "model": 7069,
+ "action": 21600,
+ "check": 13206,
+ "artifact": 4569,
+ "cleanup": 1210
+ },
+ "model": {
+ "requests": 26,
+ "plannerRequests": 0,
+ "jevRequests": 26,
+ "cost": 0.001281168,
+ "models": [
+ "typesafe/jev-1.13-20260917"
+ ]
+ },
+ "cases": [
+ {
+ "name": "Invalid login is rejected",
+ "verdict": "FAIL",
+ "durationMs": 8956,
+ "passedChecks": 0,
+ "totalChecks": 1,
+ "failedChecks": [
+ {
+ "kind": "visible",
+ "expected": true,
+ "observed": false
+ }
+ ]
+ },
+ {
+ "name": "Search filters the catalog",
+ "verdict": "FAIL",
+ "durationMs": 11878,
+ "passedChecks": 2,
+ "totalChecks": 3,
+ "failedChecks": [
+ {
+ "kind": "absent",
+ "expected": false,
+ "observed": true
+ }
+ ]
+ },
+ {
+ "name": "Quantity updates the total",
+ "verdict": "FAIL",
+ "durationMs": 13635,
+ "passedChecks": 2,
+ "totalChecks": 3,
+ "failedChecks": [
+ {
+ "kind": "number",
+ "expected": 72,
+ "observed": 77
+ }
+ ]
+ },
+ {
+ "name": "Removal empties the cart",
+ "verdict": "FAIL",
+ "durationMs": 12086,
+ "passedChecks": 1,
+ "totalChecks": 2,
+ "failedChecks": [
+ {
+ "kind": "visible",
+ "expected": true,
+ "observed": false
+ }
+ ]
+ },
+ {
+ "name": "Cart persists after relaunch",
+ "verdict": "FAIL",
+ "durationMs": 14246,
+ "passedChecks": 1,
+ "totalChecks": 2,
+ "failedChecks": [
+ {
+ "kind": "visible",
+ "expected": true,
+ "observed": false
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "platform": "android",
+ "mode": "broken",
+ "round": 5,
+ "baselineFaults": [
+ "invalid-login",
+ "wrong-filter",
+ "wrong-total",
+ "ineffective-removal",
+ "lost-persistence"
+ ],
+ "baselineVerified": true,
+ "correctFaults": [
+ true,
+ true,
+ true,
+ true,
+ true
+ ],
+ "verdict": "FAIL",
+ "durationMs": 61665,
+ "phasesMs": {
+ "planning": 1,
+ "setup": 10364,
+ "observation": 2839,
+ "model": 7285,
+ "action": 21964,
+ "check": 13266,
+ "artifact": 4586,
+ "cleanup": 1150
+ },
+ "model": {
+ "requests": 26,
+ "plannerRequests": 0,
+ "jevRequests": 26,
+ "cost": 0.001281168,
+ "models": [
+ "typesafe/jev-1.13-20260917"
+ ]
+ },
+ "cases": [
+ {
+ "name": "Invalid login is rejected",
+ "verdict": "FAIL",
+ "durationMs": 8404,
+ "passedChecks": 0,
+ "totalChecks": 1,
+ "failedChecks": [
+ {
+ "kind": "visible",
+ "expected": true,
+ "observed": false
+ }
+ ]
+ },
+ {
+ "name": "Search filters the catalog",
+ "verdict": "FAIL",
+ "durationMs": 11849,
+ "passedChecks": 2,
+ "totalChecks": 3,
+ "failedChecks": [
+ {
+ "kind": "absent",
+ "expected": false,
+ "observed": true
+ }
+ ]
+ },
+ {
+ "name": "Quantity updates the total",
+ "verdict": "FAIL",
+ "durationMs": 14041,
+ "passedChecks": 2,
+ "totalChecks": 3,
+ "failedChecks": [
+ {
+ "kind": "number",
+ "expected": 72,
+ "observed": 77
+ }
+ ]
+ },
+ {
+ "name": "Removal empties the cart",
+ "verdict": "FAIL",
+ "durationMs": 12561,
+ "passedChecks": 1,
+ "totalChecks": 2,
+ "failedChecks": [
+ {
+ "kind": "visible",
+ "expected": true,
+ "observed": false
+ }
+ ]
+ },
+ {
+ "name": "Cart persists after relaunch",
+ "verdict": "FAIL",
+ "durationMs": 14799,
+ "passedChecks": 1,
+ "totalChecks": 2,
+ "failedChecks": [
+ {
+ "kind": "visible",
+ "expected": true,
+ "observed": false
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "platform": "android",
+ "mode": "broken",
+ "round": 6,
+ "baselineFaults": [
+ "invalid-login",
+ "wrong-filter",
+ "wrong-total",
+ "ineffective-removal",
+ "lost-persistence"
+ ],
+ "baselineVerified": true,
+ "correctFaults": [
+ true,
+ true,
+ true,
+ true,
+ true
+ ],
+ "verdict": "FAIL",
+ "durationMs": 61612,
+ "phasesMs": {
+ "planning": 1,
+ "setup": 10474,
+ "observation": 2845,
+ "model": 7264,
+ "action": 21741,
+ "check": 13238,
+ "artifact": 4653,
+ "cleanup": 1191
+ },
+ "model": {
+ "requests": 26,
+ "plannerRequests": 0,
+ "jevRequests": 26,
+ "cost": 0.001281168,
+ "models": [
+ "typesafe/jev-1.13-20260917"
+ ]
+ },
+ "cases": [
+ {
+ "name": "Invalid login is rejected",
+ "verdict": "FAIL",
+ "durationMs": 8313,
+ "passedChecks": 0,
+ "totalChecks": 1,
+ "failedChecks": [
+ {
+ "kind": "visible",
+ "expected": true,
+ "observed": false
+ }
+ ]
+ },
+ {
+ "name": "Search filters the catalog",
+ "verdict": "FAIL",
+ "durationMs": 12158,
+ "passedChecks": 2,
+ "totalChecks": 3,
+ "failedChecks": [
+ {
+ "kind": "absent",
+ "expected": false,
+ "observed": true
+ }
+ ]
+ },
+ {
+ "name": "Quantity updates the total",
+ "verdict": "FAIL",
+ "durationMs": 13945,
+ "passedChecks": 2,
+ "totalChecks": 3,
+ "failedChecks": [
+ {
+ "kind": "number",
+ "expected": 72,
+ "observed": 77
+ }
+ ]
+ },
+ {
+ "name": "Removal empties the cart",
+ "verdict": "FAIL",
+ "durationMs": 12396,
+ "passedChecks": 1,
+ "totalChecks": 2,
+ "failedChecks": [
+ {
+ "kind": "visible",
+ "expected": true,
+ "observed": false
+ }
+ ]
+ },
+ {
+ "name": "Cart persists after relaunch",
+ "verdict": "FAIL",
+ "durationMs": 14797,
+ "passedChecks": 1,
+ "totalChecks": 2,
+ "failedChecks": [
+ {
+ "kind": "visible",
+ "expected": true,
+ "observed": false
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "platform": "android",
+ "mode": "broken",
+ "round": 7,
+ "baselineFaults": [
+ "invalid-login",
+ "wrong-filter",
+ "wrong-total",
+ "ineffective-removal",
+ "lost-persistence"
+ ],
+ "baselineVerified": true,
+ "correctFaults": [
+ true,
+ true,
+ true,
+ true,
+ true
+ ],
+ "verdict": "FAIL",
+ "durationMs": 61720,
+ "phasesMs": {
+ "planning": 1,
+ "setup": 10142,
+ "observation": 2635,
+ "model": 7882,
+ "action": 21910,
+ "check": 13174,
+ "artifact": 4557,
+ "cleanup": 1216
+ },
+ "model": {
+ "requests": 26,
+ "plannerRequests": 0,
+ "jevRequests": 26,
+ "cost": 0.001281168,
+ "models": [
+ "typesafe/jev-1.13-20260917"
+ ]
+ },
+ "cases": [
+ {
+ "name": "Invalid login is rejected",
+ "verdict": "FAIL",
+ "durationMs": 9277,
+ "passedChecks": 0,
+ "totalChecks": 1,
+ "failedChecks": [
+ {
+ "kind": "visible",
+ "expected": true,
+ "observed": false
+ }
+ ]
+ },
+ {
+ "name": "Search filters the catalog",
+ "verdict": "FAIL",
+ "durationMs": 11678,
+ "passedChecks": 2,
+ "totalChecks": 3,
+ "failedChecks": [
+ {
+ "kind": "absent",
+ "expected": false,
+ "observed": true
+ }
+ ]
+ },
+ {
+ "name": "Quantity updates the total",
+ "verdict": "FAIL",
+ "durationMs": 13420,
+ "passedChecks": 2,
+ "totalChecks": 3,
+ "failedChecks": [
+ {
+ "kind": "number",
+ "expected": 72,
+ "observed": 77
+ }
+ ]
+ },
+ {
+ "name": "Removal empties the cart",
+ "verdict": "FAIL",
+ "durationMs": 12287,
+ "passedChecks": 1,
+ "totalChecks": 2,
+ "failedChecks": [
+ {
+ "kind": "visible",
+ "expected": true,
+ "observed": false
+ }
+ ]
+ },
+ {
+ "name": "Cart persists after relaunch",
+ "verdict": "FAIL",
+ "durationMs": 15054,
+ "passedChecks": 1,
+ "totalChecks": 2,
+ "failedChecks": [
+ {
+ "kind": "visible",
+ "expected": true,
+ "observed": false
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "platform": "android",
+ "mode": "broken",
+ "round": 8,
+ "baselineFaults": [
+ "invalid-login",
+ "wrong-filter",
+ "wrong-total",
+ "ineffective-removal",
+ "lost-persistence"
+ ],
+ "baselineVerified": true,
+ "correctFaults": [
+ true,
+ true,
+ true,
+ true,
+ true
+ ],
+ "verdict": "FAIL",
+ "durationMs": 61272,
+ "phasesMs": {
+ "planning": 1,
+ "setup": 10357,
+ "observation": 2717,
+ "model": 6789,
+ "action": 22326,
+ "check": 13296,
+ "artifact": 4589,
+ "cleanup": 1195
+ },
+ "model": {
+ "requests": 25,
+ "plannerRequests": 0,
+ "jevRequests": 25,
+ "cost": 0.001257984,
+ "models": [
+ "typesafe/jev-1.13-20260917"
+ ]
+ },
+ "cases": [
+ {
+ "name": "Invalid login is rejected",
+ "verdict": "FAIL",
+ "durationMs": 8616,
+ "passedChecks": 0,
+ "totalChecks": 1,
+ "failedChecks": [
+ {
+ "kind": "visible",
+ "expected": true,
+ "observed": false
+ }
+ ]
+ },
+ {
+ "name": "Search filters the catalog",
+ "verdict": "FAIL",
+ "durationMs": 11866,
+ "passedChecks": 2,
+ "totalChecks": 3,
+ "failedChecks": [
+ {
+ "kind": "absent",
+ "expected": false,
+ "observed": true
+ }
+ ]
+ },
+ {
+ "name": "Quantity updates the total",
+ "verdict": "FAIL",
+ "durationMs": 13724,
+ "passedChecks": 2,
+ "totalChecks": 3,
+ "failedChecks": [
+ {
+ "kind": "number",
+ "expected": 72,
+ "observed": 77
+ }
+ ]
+ },
+ {
+ "name": "Removal empties the cart",
+ "verdict": "FAIL",
+ "durationMs": 12276,
+ "passedChecks": 1,
+ "totalChecks": 2,
+ "failedChecks": [
+ {
+ "kind": "visible",
+ "expected": true,
+ "observed": false
+ }
+ ]
+ },
+ {
+ "name": "Cart persists after relaunch",
+ "verdict": "FAIL",
+ "durationMs": 14787,
+ "passedChecks": 1,
+ "totalChecks": 2,
+ "failedChecks": [
+ {
+ "kind": "visible",
+ "expected": true,
+ "observed": false
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "platform": "android",
+ "mode": "broken",
+ "round": 9,
+ "baselineFaults": [
+ "invalid-login",
+ "wrong-filter",
+ "wrong-total",
+ "ineffective-removal",
+ "lost-persistence"
+ ],
+ "baselineVerified": true,
+ "correctFaults": [
+ true,
+ true,
+ true,
+ true,
+ true
+ ],
+ "verdict": "FAIL",
+ "durationMs": 61584,
+ "phasesMs": {
+ "planning": 1,
+ "setup": 10580,
+ "observation": 2707,
+ "model": 7243,
+ "action": 21884,
+ "check": 13173,
+ "artifact": 4633,
+ "cleanup": 1158
+ },
+ "model": {
+ "requests": 26,
+ "plannerRequests": 0,
+ "jevRequests": 26,
+ "cost": 0.001281168,
+ "models": [
+ "typesafe/jev-1.13-20260917"
+ ]
+ },
+ "cases": [
+ {
+ "name": "Invalid login is rejected",
+ "verdict": "FAIL",
+ "durationMs": 8761,
+ "passedChecks": 0,
+ "totalChecks": 1,
+ "failedChecks": [
+ {
+ "kind": "visible",
+ "expected": true,
+ "observed": false
+ }
+ ]
+ },
+ {
+ "name": "Search filters the catalog",
+ "verdict": "FAIL",
+ "durationMs": 11757,
+ "passedChecks": 2,
+ "totalChecks": 3,
+ "failedChecks": [
+ {
+ "kind": "absent",
+ "expected": false,
+ "observed": true
+ }
+ ]
+ },
+ {
+ "name": "Quantity updates the total",
+ "verdict": "FAIL",
+ "durationMs": 13682,
+ "passedChecks": 2,
+ "totalChecks": 3,
+ "failedChecks": [
+ {
+ "kind": "number",
+ "expected": 72,
+ "observed": 77
+ }
+ ]
+ },
+ {
+ "name": "Removal empties the cart",
+ "verdict": "FAIL",
+ "durationMs": 12636,
+ "passedChecks": 1,
+ "totalChecks": 2,
+ "failedChecks": [
+ {
+ "kind": "visible",
+ "expected": true,
+ "observed": false
+ }
+ ]
+ },
+ {
+ "name": "Cart persists after relaunch",
+ "verdict": "FAIL",
+ "durationMs": 14745,
+ "passedChecks": 1,
+ "totalChecks": 2,
+ "failedChecks": [
+ {
+ "kind": "visible",
+ "expected": true,
+ "observed": false
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "platform": "android",
+ "mode": "broken",
+ "round": 10,
+ "baselineFaults": [
+ "invalid-login",
+ "wrong-filter",
+ "wrong-total",
+ "ineffective-removal",
+ "lost-persistence"
+ ],
+ "baselineVerified": true,
+ "correctFaults": [
+ true,
+ true,
+ true,
+ true,
+ true
+ ],
+ "verdict": "FAIL",
+ "durationMs": 61016,
+ "phasesMs": {
+ "planning": 1,
+ "setup": 10268,
+ "observation": 2574,
+ "model": 7113,
+ "action": 22039,
+ "check": 13231,
+ "artifact": 4578,
+ "cleanup": 1204
+ },
+ "model": {
+ "requests": 25,
+ "plannerRequests": 0,
+ "jevRequests": 25,
+ "cost": 0.001257984,
+ "models": [
+ "typesafe/jev-1.13-20260917"
+ ]
+ },
+ "cases": [
+ {
+ "name": "Invalid login is rejected",
+ "verdict": "FAIL",
+ "durationMs": 8339,
+ "passedChecks": 0,
+ "totalChecks": 1,
+ "failedChecks": [
+ {
+ "kind": "visible",
+ "expected": true,
+ "observed": false
+ }
+ ]
+ },
+ {
+ "name": "Search filters the catalog",
+ "verdict": "FAIL",
+ "durationMs": 11898,
+ "passedChecks": 2,
+ "totalChecks": 3,
+ "failedChecks": [
+ {
+ "kind": "absent",
+ "expected": false,
+ "observed": true
+ }
+ ]
+ },
+ {
+ "name": "Quantity updates the total",
+ "verdict": "FAIL",
+ "durationMs": 13770,
+ "passedChecks": 2,
+ "totalChecks": 3,
+ "failedChecks": [
+ {
+ "kind": "number",
+ "expected": 72,
+ "observed": 77
+ }
+ ]
+ },
+ {
+ "name": "Removal empties the cart",
+ "verdict": "FAIL",
+ "durationMs": 12060,
+ "passedChecks": 1,
+ "totalChecks": 2,
+ "failedChecks": [
+ {
+ "kind": "visible",
+ "expected": true,
+ "observed": false
+ }
+ ]
+ },
+ {
+ "name": "Cart persists after relaunch",
+ "verdict": "FAIL",
+ "durationMs": 14939,
+ "passedChecks": 1,
+ "totalChecks": 2,
+ "failedChecks": [
+ {
+ "kind": "visible",
+ "expected": true,
+ "observed": false
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "platform": "android",
+ "mode": "replay",
+ "round": 1,
+ "baselineFaults": [
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy"
+ ],
+ "baselineVerified": true,
+ "verdict": "PASS",
+ "durationMs": 44806,
+ "phasesMs": {
+ "planning": 0,
+ "setup": 10174,
+ "observation": 2695,
+ "model": 0,
+ "action": 21405,
+ "check": 4679,
+ "artifact": 4592,
+ "cleanup": 1259
+ },
+ "model": {
+ "requests": 0,
+ "plannerRequests": 0,
+ "jevRequests": 0,
+ "cost": 0,
+ "models": []
+ },
+ "cases": [
+ {
+ "name": "Invalid login is rejected",
+ "verdict": "PASS",
+ "durationMs": 6807,
+ "passedChecks": 1,
+ "totalChecks": 1,
+ "failedChecks": []
+ },
+ {
+ "name": "Search filters the catalog",
+ "verdict": "PASS",
+ "durationMs": 8582,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Quantity updates the total",
+ "verdict": "PASS",
+ "durationMs": 10058,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Removal empties the cart",
+ "verdict": "PASS",
+ "durationMs": 8470,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Cart persists after relaunch",
+ "verdict": "PASS",
+ "durationMs": 10885,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ }
+ ]
+ },
+ {
+ "platform": "android",
+ "mode": "replay",
+ "round": 2,
+ "baselineFaults": [
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy"
+ ],
+ "baselineVerified": true,
+ "verdict": "PASS",
+ "durationMs": 44786,
+ "phasesMs": {
+ "planning": 0,
+ "setup": 9965,
+ "observation": 2716,
+ "model": 0,
+ "action": 21602,
+ "check": 4649,
+ "artifact": 4622,
+ "cleanup": 1228
+ },
+ "model": {
+ "requests": 0,
+ "plannerRequests": 0,
+ "jevRequests": 0,
+ "cost": 0,
+ "models": []
+ },
+ "cases": [
+ {
+ "name": "Invalid login is rejected",
+ "verdict": "PASS",
+ "durationMs": 7001,
+ "passedChecks": 1,
+ "totalChecks": 1,
+ "failedChecks": []
+ },
+ {
+ "name": "Search filters the catalog",
+ "verdict": "PASS",
+ "durationMs": 8378,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Quantity updates the total",
+ "verdict": "PASS",
+ "durationMs": 10062,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Removal empties the cart",
+ "verdict": "PASS",
+ "durationMs": 8594,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Cart persists after relaunch",
+ "verdict": "PASS",
+ "durationMs": 10748,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ }
+ ]
+ },
+ {
+ "platform": "android",
+ "mode": "replay",
+ "round": 3,
+ "baselineFaults": [
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy"
+ ],
+ "baselineVerified": true,
+ "verdict": "PASS",
+ "durationMs": 45745,
+ "phasesMs": {
+ "planning": 0,
+ "setup": 10267,
+ "observation": 2778,
+ "model": 0,
+ "action": 21989,
+ "check": 4668,
+ "artifact": 4621,
+ "cleanup": 1214
+ },
+ "model": {
+ "requests": 0,
+ "plannerRequests": 0,
+ "jevRequests": 0,
+ "cost": 0,
+ "models": []
+ },
+ "cases": [
+ {
+ "name": "Invalid login is rejected",
+ "verdict": "PASS",
+ "durationMs": 7026,
+ "passedChecks": 1,
+ "totalChecks": 1,
+ "failedChecks": []
+ },
+ {
+ "name": "Search filters the catalog",
+ "verdict": "PASS",
+ "durationMs": 8700,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Quantity updates the total",
+ "verdict": "PASS",
+ "durationMs": 9986,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Removal empties the cart",
+ "verdict": "PASS",
+ "durationMs": 8782,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Cart persists after relaunch",
+ "verdict": "PASS",
+ "durationMs": 11250,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ }
+ ]
+ },
+ {
+ "platform": "android",
+ "mode": "replay",
+ "round": 4,
+ "baselineFaults": [
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy"
+ ],
+ "baselineVerified": true,
+ "verdict": "PASS",
+ "durationMs": 45020,
+ "phasesMs": {
+ "planning": 0,
+ "setup": 10563,
+ "observation": 2588,
+ "model": 0,
+ "action": 21380,
+ "check": 4649,
+ "artifact": 4625,
+ "cleanup": 1215
+ },
+ "model": {
+ "requests": 0,
+ "plannerRequests": 0,
+ "jevRequests": 0,
+ "cost": 0,
+ "models": []
+ },
+ "cases": [
+ {
+ "name": "Invalid login is rejected",
+ "verdict": "PASS",
+ "durationMs": 6866,
+ "passedChecks": 1,
+ "totalChecks": 1,
+ "failedChecks": []
+ },
+ {
+ "name": "Search filters the catalog",
+ "verdict": "PASS",
+ "durationMs": 8567,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Quantity updates the total",
+ "verdict": "PASS",
+ "durationMs": 10026,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Removal empties the cart",
+ "verdict": "PASS",
+ "durationMs": 8441,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Cart persists after relaunch",
+ "verdict": "PASS",
+ "durationMs": 11118,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ }
+ ]
+ },
+ {
+ "platform": "android",
+ "mode": "replay",
+ "round": 5,
+ "baselineFaults": [
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy"
+ ],
+ "baselineVerified": true,
+ "verdict": "PASS",
+ "durationMs": 45216,
+ "phasesMs": {
+ "planning": 0,
+ "setup": 10317,
+ "observation": 2504,
+ "model": 0,
+ "action": 21960,
+ "check": 4635,
+ "artifact": 4600,
+ "cleanup": 1199
+ },
+ "model": {
+ "requests": 0,
+ "plannerRequests": 0,
+ "jevRequests": 0,
+ "cost": 0,
+ "models": []
+ },
+ "cases": [
+ {
+ "name": "Invalid login is rejected",
+ "verdict": "PASS",
+ "durationMs": 6802,
+ "passedChecks": 1,
+ "totalChecks": 1,
+ "failedChecks": []
+ },
+ {
+ "name": "Search filters the catalog",
+ "verdict": "PASS",
+ "durationMs": 8704,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Quantity updates the total",
+ "verdict": "PASS",
+ "durationMs": 10033,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Removal empties the cart",
+ "verdict": "PASS",
+ "durationMs": 8619,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Cart persists after relaunch",
+ "verdict": "PASS",
+ "durationMs": 11056,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ }
+ ]
+ },
+ {
+ "platform": "android",
+ "mode": "replay",
+ "round": 6,
+ "baselineFaults": [
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy"
+ ],
+ "baselineVerified": true,
+ "verdict": "PASS",
+ "durationMs": 45205,
+ "phasesMs": {
+ "planning": 0,
+ "setup": 10327,
+ "observation": 2594,
+ "model": 0,
+ "action": 21733,
+ "check": 4645,
+ "artifact": 4669,
+ "cleanup": 1235
+ },
+ "model": {
+ "requests": 0,
+ "plannerRequests": 0,
+ "jevRequests": 0,
+ "cost": 0,
+ "models": []
+ },
+ "cases": [
+ {
+ "name": "Invalid login is rejected",
+ "verdict": "PASS",
+ "durationMs": 6996,
+ "passedChecks": 1,
+ "totalChecks": 1,
+ "failedChecks": []
+ },
+ {
+ "name": "Search filters the catalog",
+ "verdict": "PASS",
+ "durationMs": 8499,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Quantity updates the total",
+ "verdict": "PASS",
+ "durationMs": 10033,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Removal empties the cart",
+ "verdict": "PASS",
+ "durationMs": 8521,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Cart persists after relaunch",
+ "verdict": "PASS",
+ "durationMs": 11154,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ }
+ ]
+ },
+ {
+ "platform": "android",
+ "mode": "replay",
+ "round": 7,
+ "baselineFaults": [
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy"
+ ],
+ "baselineVerified": true,
+ "verdict": "PASS",
+ "durationMs": 45288,
+ "phasesMs": {
+ "planning": 0,
+ "setup": 10151,
+ "observation": 2636,
+ "model": 0,
+ "action": 21463,
+ "check": 4677,
+ "artifact": 4764,
+ "cleanup": 1193
+ },
+ "model": {
+ "requests": 0,
+ "plannerRequests": 0,
+ "jevRequests": 0,
+ "cost": 0,
+ "models": []
+ },
+ "cases": [
+ {
+ "name": "Invalid login is rejected",
+ "verdict": "PASS",
+ "durationMs": 6677,
+ "passedChecks": 1,
+ "totalChecks": 1,
+ "failedChecks": []
+ },
+ {
+ "name": "Search filters the catalog",
+ "verdict": "PASS",
+ "durationMs": 8735,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Quantity updates the total",
+ "verdict": "PASS",
+ "durationMs": 10001,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Removal empties the cart",
+ "verdict": "PASS",
+ "durationMs": 8747,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Cart persists after relaunch",
+ "verdict": "PASS",
+ "durationMs": 11121,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ }
+ ]
+ },
+ {
+ "platform": "android",
+ "mode": "replay",
+ "round": 8,
+ "baselineFaults": [
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy"
+ ],
+ "baselineVerified": true,
+ "verdict": "PASS",
+ "durationMs": 45001,
+ "phasesMs": {
+ "planning": 0,
+ "setup": 10397,
+ "observation": 2772,
+ "model": 0,
+ "action": 21195,
+ "check": 4629,
+ "artifact": 4799,
+ "cleanup": 1207
+ },
+ "model": {
+ "requests": 0,
+ "plannerRequests": 0,
+ "jevRequests": 0,
+ "cost": 0,
+ "models": []
+ },
+ "cases": [
+ {
+ "name": "Invalid login is rejected",
+ "verdict": "PASS",
+ "durationMs": 6884,
+ "passedChecks": 1,
+ "totalChecks": 1,
+ "failedChecks": []
+ },
+ {
+ "name": "Search filters the catalog",
+ "verdict": "PASS",
+ "durationMs": 8625,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Quantity updates the total",
+ "verdict": "PASS",
+ "durationMs": 10062,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Removal empties the cart",
+ "verdict": "PASS",
+ "durationMs": 8578,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Cart persists after relaunch",
+ "verdict": "PASS",
+ "durationMs": 10849,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ }
+ ]
+ },
+ {
+ "platform": "android",
+ "mode": "replay",
+ "round": 9,
+ "baselineFaults": [
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy"
+ ],
+ "baselineVerified": true,
+ "verdict": "PASS",
+ "durationMs": 45019,
+ "phasesMs": {
+ "planning": 0,
+ "setup": 10158,
+ "observation": 2732,
+ "model": 0,
+ "action": 21415,
+ "check": 4693,
+ "artifact": 4632,
+ "cleanup": 1184
+ },
+ "model": {
+ "requests": 0,
+ "plannerRequests": 0,
+ "jevRequests": 0,
+ "cost": 0,
+ "models": []
+ },
+ "cases": [
+ {
+ "name": "Invalid login is rejected",
+ "verdict": "PASS",
+ "durationMs": 6918,
+ "passedChecks": 1,
+ "totalChecks": 1,
+ "failedChecks": []
+ },
+ {
+ "name": "Search filters the catalog",
+ "verdict": "PASS",
+ "durationMs": 8499,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Quantity updates the total",
+ "verdict": "PASS",
+ "durationMs": 10009,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Removal empties the cart",
+ "verdict": "PASS",
+ "durationMs": 8563,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Cart persists after relaunch",
+ "verdict": "PASS",
+ "durationMs": 11027,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ }
+ ]
+ },
+ {
+ "platform": "android",
+ "mode": "replay",
+ "round": 10,
+ "baselineFaults": [
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy",
+ "healthy"
+ ],
+ "baselineVerified": true,
+ "verdict": "PASS",
+ "durationMs": 45530,
+ "phasesMs": {
+ "planning": 0,
+ "setup": 10061,
+ "observation": 2663,
+ "model": 0,
+ "action": 22105,
+ "check": 4678,
+ "artifact": 4562,
+ "cleanup": 1257
+ },
+ "model": {
+ "requests": 0,
+ "plannerRequests": 0,
+ "jevRequests": 0,
+ "cost": 0,
+ "models": []
+ },
+ "cases": [
+ {
+ "name": "Invalid login is rejected",
+ "verdict": "PASS",
+ "durationMs": 7137,
+ "passedChecks": 1,
+ "totalChecks": 1,
+ "failedChecks": []
+ },
+ {
+ "name": "Search filters the catalog",
+ "verdict": "PASS",
+ "durationMs": 8417,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Quantity updates the total",
+ "verdict": "PASS",
+ "durationMs": 10209,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Removal empties the cart",
+ "verdict": "PASS",
+ "durationMs": 8782,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ },
+ {
+ "name": "Cart persists after relaunch",
+ "verdict": "PASS",
+ "durationMs": 10982,
+ "passedChecks": 3,
+ "totalChecks": 3,
+ "failedChecks": []
+ }
+ ]
+ }
+ ]
+}
diff --git a/examples/mobile-app/.gitignore b/examples/mobile-app/.gitignore
new file mode 100644
index 0000000..d914c32
--- /dev/null
+++ b/examples/mobile-app/.gitignore
@@ -0,0 +1,41 @@
+# Learn more https://docs.github.com/en/get-started/getting-started-with-git/ignoring-files
+
+# dependencies
+node_modules/
+
+# Expo
+.expo/
+dist/
+web-build/
+expo-env.d.ts
+
+# Native
+.kotlin/
+*.orig.*
+*.jks
+*.p8
+*.p12
+*.key
+*.mobileprovision
+
+# Metro
+.metro-health-check*
+
+# debug
+npm-debug.*
+yarn-debug.*
+yarn-error.*
+
+# macOS
+.DS_Store
+*.pem
+
+# local env files
+.env*.local
+
+# typescript
+*.tsbuildinfo
+
+# generated native folders
+/ios
+/android
diff --git a/examples/mobile-app/AGENTS.md b/examples/mobile-app/AGENTS.md
new file mode 100644
index 0000000..0e6bc80
--- /dev/null
+++ b/examples/mobile-app/AGENTS.md
@@ -0,0 +1,3 @@
+# Expo HAS CHANGED
+
+Read the exact versioned docs at https://docs.expo.dev/versions/v57.0.0/ before writing any code.
diff --git a/examples/mobile-app/App.js b/examples/mobile-app/App.js
new file mode 100644
index 0000000..66bc926
--- /dev/null
+++ b/examples/mobile-app/App.js
@@ -0,0 +1,37 @@
+import React, {useEffect, useState} from 'react';
+import {SafeAreaView, View, Text, TextInput, Pressable, ScrollView, StyleSheet, Platform, Keyboard, Switch} from 'react-native';
+import AsyncStorage from '@react-native-async-storage/async-storage';
+import {StatusBar} from 'expo-status-bar';
+
+const products=[{name:'Desk Lamp',price:36,icon:'☀',category:'Home'},{name:'AirPods',price:120,icon:'♫',category:'Audio'},{name:'Notebook',price:8,icon:'▤',category:'Office'}];
+const base={signedIn:false,cart:{},notifications:false};
+const Button=({name,onPress,subtle=false})=>{name};
+
+export default function App(){
+ const [state,setState]=useState(base),[ready,setReady]=useState(false),[screen,setScreen]=useState('catalog'),[email,setEmail]=useState(''),[password,setPassword]=useState(''),[query,setQuery]=useState(''),[error,setError]=useState(''),[product,setProduct]=useState(products[0]),[fault,setFault]=useState('healthy');
+ useEffect(()=>{(async()=>{
+ let config={id:'manual',fault:'healthy'};
+ try {config=await (await fetch(`http://${Platform.OS==='android'?'10.0.2.2':'127.0.0.1'}:8089/config?platform=${Platform.OS}`)).json();}catch{}
+ const saved=JSON.parse(await AsyncStorage.getItem('jev-lab')||'null');
+ setFault(config.fault);
+ setState(saved?.id===config.id ? {...saved.state,cart:config.fault==='lost-persistence'?{}:saved.state.cart} : base);
+ await AsyncStorage.setItem('jev-lab-id',config.id);setReady(true);
+ })();},[]);
+ useEffect(()=>{if(ready)(async()=>{const id=await AsyncStorage.getItem('jev-lab-id');await AsyncStorage.setItem('jev-lab',JSON.stringify({id,state}));})();},[state,ready]);
+ function signIn(){Keyboard.dismiss();if(email==='demo@example.test'&&password==='correct-horse'||fault==='invalid-login'){setState({...state,signedIn:true});setError('');}else setError('Invalid credentials');}
+ function add(){setState({...state,cart:{...state.cart,[product.name]:(state.cart[product.name]||0)+1}});setScreen('cart');}
+ const listed=fault==='wrong-filter'&&query?products:products.filter(p=>p.name.toLowerCase().includes(query.toLowerCase()));
+ const total=products.reduce((n,p)=>n+p.price*(state.cart[p.name]||0),0)+(fault==='wrong-total'?5:0);
+ return
+ ◆JEV SHOPNATIVE LAB
+ {!ready?Loading:!state.signedIn?Welcome back.Your next great find starts here.EmailPassword:<>
+
+ {screen==='catalog'?Find your favorite.Thoughtful essentials. Everyday prices.Keyboard.dismiss()}/>Keyboard.dismiss()}/>{listed.map(p=>{p.icon}{p.name}{p.category} · ${p.price.toFixed(2)}{Keyboard.dismiss();setProduct(p);setScreen('detail');}}/>)}{!listed.length?No products found:null}:null}
+ {screen==='detail'?{product.icon}{product.name}{product.category} collection${product.price.toFixed(2)}setScreen('catalog')}/>:null}
+ {screen==='cart'?Your cart.Good choices, all in one place.{products.filter(p=>state.cart[p.name]).map(p=>{p.name}Quantity: {state.cart[p.name]}setState({...state,cart:{...state.cart,[p.name]:state.cart[p.name]+1}})}/>{if(fault!=='ineffective-removal'){const cart={...state.cart};delete cart[p.name];setState({...state,cart});}}}/>)}{!Object.values(state.cart).some(Boolean)?Your cart is empty:null}Total{total.toFixed(2)}setScreen('catalog')}/>:null}
+ {screen==='settings'?Make it yours.Simple settings, instant updates.NotificationssetState({...state,notifications})}/>{Array.from({length:15},(_,i)=>`Preference ${i+1}\n`).join('\n')}End of preferences{setState({...state,signedIn:false});setEmail('');setPassword('');setScreen('catalog');}}/>:null}
+ >}
+ DESIGNED TO BE TESTED.
+ ;
+}
+const s=StyleSheet.create({root:{flex:1,backgroundColor:'#101215'},page:{flex:1,padding:22},brand:{flexDirection:'row',alignItems:'center',gap:8,marginTop:18,marginBottom:24},logo:{color:'#ff773e',fontSize:24},brandText:{color:'#f4f4ef',fontSize:20,fontWeight:'900',letterSpacing:2},tag:{color:'#858589',fontSize:10,letterSpacing:1,marginLeft:'auto'},title:{color:'#f4f4ef',fontSize:32,fontWeight:'800',letterSpacing:-1,marginBottom:9},caption:{color:'#aaaab0',fontSize:14,lineHeight:22,marginBottom:10},label:{color:'#dddde1',fontSize:13,marginTop:15,marginBottom:8},input:{borderColor:'#393c43',borderWidth:1,borderRadius:12,padding:14,fontSize:16,color:'#f4f4ef',backgroundColor:'#1b1e24',marginBottom:10},button:{backgroundColor:'#ff773e',paddingVertical:13,paddingHorizontal:13,borderRadius:10,marginVertical:5},buttonText:{color:'#161514',fontWeight:'700',fontSize:13},subtle:{backgroundColor:'#252930'},tabs:{flexDirection:'row',gap:10,marginBottom:18},card:{flexDirection:'row',alignItems:'center',gap:12,padding:14,backgroundColor:'#1b1e24',borderColor:'#30333a',borderWidth:1,borderRadius:16,marginVertical:7},productIcon:{fontSize:34,color:'#ffad72',width:36},product:{fontSize:17,color:'#f4f4ef',fontWeight:'700'},heroIcon:{fontSize:100,color:'#ffad72',alignSelf:'center',marginVertical:30},price:{color:'#ffad72',fontSize:28,fontWeight:'800',marginVertical:15},cartCard:{padding:18,backgroundColor:'#1b1e24',borderRadius:16,marginVertical:8},cartButtons:{flexDirection:'row',flexWrap:'wrap',gap:8},total:{flexDirection:'row',justifyContent:'space-between',alignItems:'center',borderTopWidth:1,borderTopColor:'#393c43',marginTop:12},empty:{color:'#dcdce0',fontSize:18,marginVertical:24},error:{color:'#ff8686',marginTop:14,fontSize:16},footer:{color:'#62656d',letterSpacing:2,fontSize:10,marginTop:'auto',alignSelf:'center',paddingTop:15}});
diff --git a/examples/mobile-app/LICENSE b/examples/mobile-app/LICENSE
new file mode 100644
index 0000000..30b20e3
--- /dev/null
+++ b/examples/mobile-app/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2015-present 650 Industries, Inc. (aka Expo)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/examples/mobile-app/app.json b/examples/mobile-app/app.json
new file mode 100644
index 0000000..d666a6b
--- /dev/null
+++ b/examples/mobile-app/app.json
@@ -0,0 +1,28 @@
+{
+ "expo": {
+ "name": "Jev Shop",
+ "slug": "mobile-app",
+ "version": "1.0.0",
+ "plugins": ["./with-lab-network"],
+ "orientation": "portrait",
+ "icon": "./assets/icon.png",
+ "userInterfaceStyle": "light",
+ "ios": {
+ "supportsTablet": false,
+ "bundleIdentifier": "dev.jev.e2e.shopping",
+ "infoPlist": { "NSAppTransportSecurity": { "NSAllowsArbitraryLoads": true } }
+ },
+ "android": {
+ "package": "dev.jev.e2e.shopping",
+ "adaptiveIcon": {
+ "backgroundColor": "#E6F4FE",
+ "foregroundImage": "./assets/android-icon-foreground.png",
+ "backgroundImage": "./assets/android-icon-background.png",
+ "monochromeImage": "./assets/android-icon-monochrome.png"
+ }
+ },
+ "web": {
+ "favicon": "./assets/favicon.png"
+ }
+ }
+}
diff --git a/examples/mobile-app/assets/android-icon-background.png b/examples/mobile-app/assets/android-icon-background.png
new file mode 100644
index 0000000..5ffefc5
Binary files /dev/null and b/examples/mobile-app/assets/android-icon-background.png differ
diff --git a/examples/mobile-app/assets/android-icon-foreground.png b/examples/mobile-app/assets/android-icon-foreground.png
new file mode 100644
index 0000000..3a9e501
Binary files /dev/null and b/examples/mobile-app/assets/android-icon-foreground.png differ
diff --git a/examples/mobile-app/assets/android-icon-monochrome.png b/examples/mobile-app/assets/android-icon-monochrome.png
new file mode 100644
index 0000000..77484eb
Binary files /dev/null and b/examples/mobile-app/assets/android-icon-monochrome.png differ
diff --git a/examples/mobile-app/assets/favicon.png b/examples/mobile-app/assets/favicon.png
new file mode 100644
index 0000000..408bd74
Binary files /dev/null and b/examples/mobile-app/assets/favicon.png differ
diff --git a/examples/mobile-app/assets/icon.png b/examples/mobile-app/assets/icon.png
new file mode 100644
index 0000000..7165a53
Binary files /dev/null and b/examples/mobile-app/assets/icon.png differ
diff --git a/examples/mobile-app/assets/splash-icon.png b/examples/mobile-app/assets/splash-icon.png
new file mode 100644
index 0000000..03d6f6b
Binary files /dev/null and b/examples/mobile-app/assets/splash-icon.png differ
diff --git a/examples/mobile-app/control.mjs b/examples/mobile-app/control.mjs
new file mode 100644
index 0000000..d21fe5a
--- /dev/null
+++ b/examples/mobile-app/control.mjs
@@ -0,0 +1,20 @@
+// Evaluator-only baseline/fault service. The test agent never calls this API.
+import {createServer} from 'node:http';
+import {randomUUID} from 'node:crypto';
+export async function startLab(port=8089){
+ const configs={ios:{id:randomUUID(),fault:'healthy'},android:{id:randomUUID(),fault:'healthy'}};
+ const reads=[];
+ const server=createServer((req,res)=>{
+ const url=new URL(req.url,'http://127.0.0.1');
+ if(url.pathname!=='/config'||req.method!=='GET'){res.writeHead(404).end();return;}
+ const platform=url.searchParams.get('platform')==='android'?'android':'ios';
+ reads.push({platform,id:configs[platform].id});
+ res.setHeader('Content-Type','application/json');res.end(JSON.stringify(configs[platform]));
+ });
+ await new Promise((resolve,reject)=>{server.once('error',reject);server.listen(port,'127.0.0.1',resolve);});
+ return {reads,reset(fault='healthy',platform){for(const key of platform?[platform]:['ios','android'])configs[key]={id:randomUUID(),fault};return platform?configs[platform]:configs;},close:()=>new Promise(resolve=>server.close(resolve))};
+}
+if(process.argv[1]?.endsWith('/control.mjs')){
+ const lab=await startLab();console.log('Jev Shop baseline service: http://127.0.0.1:8089/config');
+ process.once('SIGINT',()=>lab.close());process.once('SIGTERM',()=>lab.close());
+}
diff --git a/examples/mobile-app/index.js b/examples/mobile-app/index.js
new file mode 100644
index 0000000..1d6e981
--- /dev/null
+++ b/examples/mobile-app/index.js
@@ -0,0 +1,8 @@
+import { registerRootComponent } from 'expo';
+
+import App from './App';
+
+// registerRootComponent calls AppRegistry.registerComponent('main', () => App);
+// It also ensures that whether you load the app in Expo Go or in a native build,
+// the environment is set up appropriately
+registerRootComponent(App);
diff --git a/examples/mobile-app/package-lock.json b/examples/mobile-app/package-lock.json
new file mode 100644
index 0000000..37a5746
--- /dev/null
+++ b/examples/mobile-app/package-lock.json
@@ -0,0 +1,6011 @@
+{
+ "name": "mobile-app",
+ "version": "1.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "mobile-app",
+ "version": "1.0.0",
+ "dependencies": {
+ "@react-native-async-storage/async-storage": "2.2.0",
+ "expo": "~57.0.24",
+ "expo-status-bar": "~57.0.1",
+ "react": "19.2.3",
+ "react-native": "0.86.3"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz",
+ "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.29.7",
+ "js-tokens": "^4.0.0",
+ "picocolors": "^1.1.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/compat-data": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz",
+ "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/core": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz",
+ "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.29.7",
+ "@babel/generator": "^7.29.7",
+ "@babel/helper-compilation-targets": "^7.29.7",
+ "@babel/helper-module-transforms": "^7.29.7",
+ "@babel/helpers": "^7.29.7",
+ "@babel/parser": "^7.29.7",
+ "@babel/template": "^7.29.7",
+ "@babel/traverse": "^7.29.7",
+ "@babel/types": "^7.29.7",
+ "@jridgewell/remapping": "^2.3.5",
+ "convert-source-map": "^2.0.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.2.3",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/babel"
+ }
+ },
+ "node_modules/@babel/core/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/generator": {
+ "version": "7.29.8",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.8.tgz",
+ "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.29.8",
+ "@babel/types": "^7.29.8",
+ "@jridgewell/gen-mapping": "^0.3.12",
+ "@jridgewell/trace-mapping": "^0.3.28",
+ "jsesc": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-annotate-as-pure": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.29.7.tgz",
+ "integrity": "sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz",
+ "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/compat-data": "^7.29.7",
+ "@babel/helper-validator-option": "^7.29.7",
+ "browserslist": "^4.24.0",
+ "lru-cache": "^5.1.1",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/helper-create-class-features-plugin": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.29.7.tgz",
+ "integrity": "sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.29.7",
+ "@babel/helper-member-expression-to-functions": "^7.29.7",
+ "@babel/helper-optimise-call-expression": "^7.29.7",
+ "@babel/helper-replace-supers": "^7.29.7",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7",
+ "@babel/traverse": "^7.29.7",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/helper-create-regexp-features-plugin": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.29.7.tgz",
+ "integrity": "sha512-907Uymvqgg1dwUA+7IGwFAOSYzQOuzPXKNJ1yxzwPffzkYFg2q2eHi1fIOs6sXkG9NbIUMunnUlkYsfRFNvomg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.29.7",
+ "regexpu-core": "^6.3.1",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/helper-define-polyfill-provider": {
+ "version": "0.6.8",
+ "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.8.tgz",
+ "integrity": "sha512-47UwBLPpQi1NoWzLuHNjRoHlYXMwIJoBf7MFou6viC/sIHWYygpvr0B6IAyh5sBdA2nr2LPIRww8lfaUVQINBA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-compilation-targets": "^7.28.6",
+ "@babel/helper-plugin-utils": "^7.28.6",
+ "debug": "^4.4.3",
+ "lodash.debounce": "^4.0.8",
+ "resolve": "^1.22.11"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/@babel/helper-globals": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz",
+ "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-member-expression-to-functions": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.29.7.tgz",
+ "integrity": "sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/traverse": "^7.29.7",
+ "@babel/types": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-imports": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz",
+ "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/traverse": "^7.29.7",
+ "@babel/types": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-transforms": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz",
+ "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.29.7",
+ "@babel/helper-validator-identifier": "^7.29.7",
+ "@babel/traverse": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-optimise-call-expression": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.29.7.tgz",
+ "integrity": "sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-plugin-utils": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz",
+ "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-remap-async-to-generator": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.29.7.tgz",
+ "integrity": "sha512-16AMiW26DbXWBbr3B8wNozKM0ydMLB892vaOaJW/fPJdnT8vJk5sdkQcU/isqUxyCE0cEoa8wZOcbgDuC4b6Og==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.29.7",
+ "@babel/helper-wrap-function": "^7.29.7",
+ "@babel/traverse": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-replace-supers": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.29.7.tgz",
+ "integrity": "sha512-atfGXWSeCiF4DnKZIfmJfQRkSw9b9gNNXR1kqKjbhG4pGYCOnkp8OcTB8E3NXjBu8NpheSnOeNKz8KT7UNFTmQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-member-expression-to-functions": "^7.29.7",
+ "@babel/helper-optimise-call-expression": "^7.29.7",
+ "@babel/traverse": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-skip-transparent-expression-wrappers": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.29.7.tgz",
+ "integrity": "sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/traverse": "^7.29.7",
+ "@babel/types": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz",
+ "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz",
+ "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-option": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz",
+ "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-wrap-function": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.29.7.tgz",
+ "integrity": "sha512-iES0Skag9ERIF68aXadpO6dbXa03mNWK3sEqJaMnLNs/eC3l0lkImdfoy6Y09/SfkpawdAB4RjQ7PVA7TcVGdw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/template": "^7.29.7",
+ "@babel/traverse": "^7.29.7",
+ "@babel/types": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helpers": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz",
+ "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/template": "^7.29.7",
+ "@babel/types": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.29.9",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.9.tgz",
+ "integrity": "sha512-CjXrNHTnvqBVqHgdBysY3vk2T8tpJHb5/RMeHJBTyVa9xgugCB0CJTx/3oO8RV2QRQP391RWpB7D6hLjm8V9uA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.29.8"
+ },
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-decorators": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.29.7.tgz",
+ "integrity": "sha512-EtU0Hi3GvrTqD56xKmZvV/uCXK2ZbwVNPNLAquVItcAZpUhkXwWlo3Fmj0c2LxgSf2I8IDULeAepwNP1OefLXg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.29.7",
+ "@babel/helper-plugin-utils": "^7.29.7",
+ "@babel/plugin-syntax-decorators": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-export-default-from": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.29.7.tgz",
+ "integrity": "sha512-p+G5BNXDcy3bOXplhY4HybQ1GxH3i2Tppmdm/3epyRu2VgJJZuUlZ61MqRTg582Q7ZLBdP7fePYvsumSEkMxcQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-decorators": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.29.7.tgz",
+ "integrity": "sha512-9MTTLbF39X6sqM92JPEsoI7++26hjZvzkxKZy64aMhWLH2mPkJ/Q3AV4QLmls3R14FpSpkOwQQfUh962JGQxxg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-dynamic-import": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz",
+ "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-export-default-from": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.29.7.tgz",
+ "integrity": "sha512-foag0BB37ROhdeIX9O8G0jX7hw0UekJc04cHMrYLOnrErsnBKqJGHJ8eDRpoCFZBvEPPygmmtw4qyU97qa4oOw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-flow": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.29.7.tgz",
+ "integrity": "sha512-ajMX6QPcyomotqwpzhkYGxcK2i/us0rs1Qo9QvUpa+Fca0FTmqrzKrctoIYLMxcOhGZldGT/BAVkRGTWBiR8gQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-jsx": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.29.7.tgz",
+ "integrity": "sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
+ "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-optional-chaining": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
+ "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-typescript": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.29.7.tgz",
+ "integrity": "sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-async-generator-functions": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.29.7.tgz",
+ "integrity": "sha512-d98gXZkgswvkyohMBABkhm3GeXhYj8psWfwQ2C7gtfrKGTykQa/iOIi+JJhwMjPlZ6Vm2XN+DCf3Es1EoG4ZLA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7",
+ "@babel/helper-remap-async-to-generator": "^7.29.7",
+ "@babel/traverse": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-async-to-generator": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.29.7.tgz",
+ "integrity": "sha512-pcUb2SS+RMo9TWVBwKGI5ShtoG7R+zBsFmCKDa6fe8c+hPr3XJlZgoE5j6i8W7gDjhyvy+85vmYexanvXh3d1w==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.29.7",
+ "@babel/helper-plugin-utils": "^7.29.7",
+ "@babel/helper-remap-async-to-generator": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-block-scoping": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.29.7.tgz",
+ "integrity": "sha512-ONyr4+AZhKh8yKWInVxU9AXA9EbsyeLcL6V0dJy6M2/62vuvpGm29zzuymbTpdc451GEpDIdAyPLP3r+P61yKQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-class-properties": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.29.7.tgz",
+ "integrity": "sha512-GtcpjFvanPfzNQi3eTitsCqtRRmmqzpy/A+yhTR1HaZo1Ly3EA8ZXxlPyHdR8/IuRMYc3E4wdGBewB2QKQjAaA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.29.7",
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-class-static-block": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.29.7.tgz",
+ "integrity": "sha512-kibJgmEdX2iMwsHY2tSZNDgj8PwIlCQz7FK9KuGKO8zsuoUwSEhoNnNVp/emKWrbY4HeO6kkXfdMqRKKKXBm2A==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.29.7",
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.12.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-classes": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.29.7.tgz",
+ "integrity": "sha512-qV0OGGBVacduzQHE649JyCneOFI/maT+YKsO+K4Yi3xv2wTPNjM/W2o2gdzMwEAZz7fXNTHAe0NcSg30bIN69g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.29.7",
+ "@babel/helper-compilation-targets": "^7.29.7",
+ "@babel/helper-globals": "^7.29.7",
+ "@babel/helper-plugin-utils": "^7.29.7",
+ "@babel/helper-replace-supers": "^7.29.7",
+ "@babel/traverse": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-destructuring": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.29.7.tgz",
+ "integrity": "sha512-iPX8aD6H9zV5s7ZsqTdNocPN/MGQ5sSMnElKrktxjJRMnB2jN/1p2+R7GkfD6CAYoVFqy5A4XnSIUeGgJzIWpg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7",
+ "@babel/traverse": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-export-namespace-from": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.29.7.tgz",
+ "integrity": "sha512-24B2nOy2TeJSMheqwPD4DDQOV/elLSIlKxjZt4i05H5AgdPdWR3n18HnNrcJ+j76WJd9gbwb9jPjNYUy6RautA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-flow-strip-types": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.29.7.tgz",
+ "integrity": "sha512-wRHeUjUjCZnMHmiO5bRgjFLcoEh7JyTdByOW11ahhwNa4V0bmeGEaIvt51yq0zQp2yWIpqfxXXPyUP6GFJZHOQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7",
+ "@babel/plugin-syntax-flow": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-for-of": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.29.7.tgz",
+ "integrity": "sha512-zeSIHh0+E1Um1WJRXCFlHQYu2ieJNdivLLjlBEp+dIBu3S51n+SZZmIXjxnItw6pz56Cn+KvK68BIBVsxq2JiQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-logical-assignment-operators": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.29.7.tgz",
+ "integrity": "sha512-A0H91hh6W8MFRkp5TqJmMr39jzGD1A1E1Ysiv2O06Sfbhkapm+XyIzxWCEh5kqwOZ1/8QZ0dY3SeQ7XBqfJd5Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-commonjs": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.29.7.tgz",
+ "integrity": "sha512-j0vCldybPC5b5dwCQOJ21uKtHzt7hxLygJTg9eF1ScfaikEDNfzn94XoW5Fi+seBR0nCyL23xaBFFkq7dTM8XQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.29.7",
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-named-capturing-groups-regex": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.29.7.tgz",
+ "integrity": "sha512-vuFoLwr4qnv2xbZ16SQd6uPcH5FNrLHhk/Jzo++0XJFcaDsr4gjJVg6j398oMHiC+83k/GiBzviwF5KBJkPUtQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.29.7",
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-nullish-coalescing-operator": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.29.7.tgz",
+ "integrity": "sha512-idmp1dFaekP9GbcMvG24Kvw2BfhFZjHnNJCkV4WuIY4PskJzwI3f1N5OdgYke38T7rftO6ERulFRn2cFeZwRkg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-object-rest-spread": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.29.7.tgz",
+ "integrity": "sha512-Ld98jn4c0smUywL57m7SgsHq3OpThOa6LqZJif3G6jYOovPleoFhVrBJ1WegRApSFB2wu4+RelAj9AC9G08Z4A==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-compilation-targets": "^7.29.7",
+ "@babel/helper-plugin-utils": "^7.29.7",
+ "@babel/plugin-transform-destructuring": "^7.29.7",
+ "@babel/plugin-transform-parameters": "^7.29.7",
+ "@babel/traverse": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-optional-catch-binding": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.29.7.tgz",
+ "integrity": "sha512-sLsyndxK2VwX6yNUOakMb7Sh553ZTe/vVM1XJ+9Z5aW1ytsc8xOIwmyk05NNjN60vkc5/KqoTH6hB4V41LJhng==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-optional-chaining": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.29.7.tgz",
+ "integrity": "sha512-6GM1dhvK3gNODkXcEcMCOLEDCLSoZ/sBbro2Ax8HURyasQ4NshagQixkRFdh5niI6E4gmA/jYI/4aT7rRos3ZQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-parameters": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.29.7.tgz",
+ "integrity": "sha512-ZDOBqV/qLYJI0YElr8DcENEyARsFQeESqWXH6gZlghYXuPPjvweuDhP4VyEi4BlUBlLRFZVjxoZDMjxhLW766g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-private-methods": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.29.7.tgz",
+ "integrity": "sha512-/6Rz4DK1ETDEM/bWHsPHcaEe7ZaT1EqSXjtSP/L0DijOYuaUhiRiOKcwpZ8P7zR4xXEHc2ITdiCgBm9Tpyv9ug==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.29.7",
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-private-property-in-object": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.29.7.tgz",
+ "integrity": "sha512-+BNo06dnrzdNNqCm1X6YUaVv0DKk8Q+JYcoZfOkLhYWNCXzlwTSRq8zGWayT1csjcpNXV9CQTBRRbmTLZac5cA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.29.7",
+ "@babel/helper-create-class-features-plugin": "^7.29.7",
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-display-name": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.29.7.tgz",
+ "integrity": "sha512-+1wdDMGNb4UPeY3Q4L5yLiYe6TXPXubs4NjrgRFw13hPRLJfEMw2Q5OXkee6/IfdqePIeW4Jjwe3aBh7SdKz4Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.29.7.tgz",
+ "integrity": "sha512-WsZulLVBUHXVj2cUcPVx6UE21TpalB6bHbSFErKT0Ib++ax24jjXe73FqlWvdylFOjiuPHYi6VCcgRad1ItN+A==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.29.7",
+ "@babel/helper-module-imports": "^7.29.7",
+ "@babel/helper-plugin-utils": "^7.29.7",
+ "@babel/plugin-syntax-jsx": "^7.29.7",
+ "@babel/types": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx-development": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.29.7.tgz",
+ "integrity": "sha512-Xfy3UVMF04+ypnFbkhvfqtmvwfe92qwQdbGZVonhE+6v35GzlofmOnA1szaZqzb9xYWr0nl1e5EMmzi0DNON1g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/plugin-transform-react-jsx": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-pure-annotations": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.29.7.tgz",
+ "integrity": "sha512-H5E+HBgDpr6Q5t+Aj11tL7XkIui1jhbIoArVQnqjgXo5/3YxkN7ZEBcWF4RQlB0T4rrxJQbXS6kiFV6B7XTqUA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.29.7",
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-runtime": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.29.7.tgz",
+ "integrity": "sha512-xmAscdE/AsqRW7vutbPNoUmu/nF5SrLKPs7aoJgEjo35lLKA/Bc0i2rMv/hr1+Y0o1bQCiVtith3u2vdgRL39Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.29.7",
+ "@babel/helper-plugin-utils": "^7.29.7",
+ "babel-plugin-polyfill-corejs2": "^0.4.14",
+ "babel-plugin-polyfill-corejs3": "^0.13.0",
+ "babel-plugin-polyfill-regenerator": "^0.6.5",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-runtime/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/plugin-transform-typescript": {
+ "version": "7.29.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.29.9.tgz",
+ "integrity": "sha512-FFwIwzU+7SCOuxxV4YtJql6T9981ZVTm+FHO5GhVsRqCTdy0WwrEZh3l42ARpXruJUDGOptdduHW6Zr7pNPLNg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.29.7",
+ "@babel/helper-create-class-features-plugin": "^7.29.7",
+ "@babel/helper-plugin-utils": "^7.29.7",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7",
+ "@babel/plugin-syntax-typescript": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-regex": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.29.7.tgz",
+ "integrity": "sha512-7D/x/23/d/3VqZ0QA+LGbZMlGwZjztBygSWWWsfTPoQ1oQ6Q1P6Mr3d0kk42XabyUVw+fha3LqdRsFqeKqvCyA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.29.7",
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/preset-typescript": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.29.7.tgz",
+ "integrity": "sha512-/Foi8vKY2EVbed/1eZx0gJEEwHAIxogrySI7rULcRIvhZzbvoE/b5qG5Ghc0WKAFKOHA9SD1x7RsFlOYdutIiQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7",
+ "@babel/helper-validator-option": "^7.29.7",
+ "@babel/plugin-syntax-jsx": "^7.29.7",
+ "@babel/plugin-transform-modules-commonjs": "^7.29.7",
+ "@babel/plugin-transform-typescript": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/runtime": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz",
+ "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/template": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz",
+ "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.29.7",
+ "@babel/parser": "^7.29.7",
+ "@babel/types": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/traverse": {
+ "version": "7.29.8",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.8.tgz",
+ "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.29.7",
+ "@babel/generator": "^7.29.8",
+ "@babel/helper-globals": "^7.29.7",
+ "@babel/parser": "^7.29.8",
+ "@babel/template": "^7.29.7",
+ "@babel/types": "^7.29.8",
+ "debug": "^4.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.29.8",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz",
+ "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.29.7",
+ "@babel/helper-validator-identifier": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@expo/code-signing-certificates": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/@expo/code-signing-certificates/-/code-signing-certificates-0.0.6.tgz",
+ "integrity": "sha512-iNe0puxwBNEcuua9gmTGzq+SuMDa0iATai1FlFTMHJ/vUmKvN/V//drXoLJkVb5i5H3iE/n/qIJxyoBnXouD0w==",
+ "license": "MIT",
+ "dependencies": {
+ "node-forge": "^1.3.3"
+ }
+ },
+ "node_modules/@expo/config": {
+ "version": "57.0.9",
+ "resolved": "https://registry.npmjs.org/@expo/config/-/config-57.0.9.tgz",
+ "integrity": "sha512-dmzlKraIFxa7wLwV6K7WzI8jp6QZpW6Mc5mGjLimJUFjzh4uQdYaT3m3plEutM5yxBoBEwqzks7l+I/ljCbxAQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@expo/config-plugins": "~57.0.9",
+ "@expo/config-types": "^57.0.2",
+ "@expo/json-file": "^11.0.1",
+ "@expo/require-utils": "^57.0.5",
+ "deepmerge": "^4.3.1",
+ "getenv": "^2.0.0",
+ "glob": "^13.0.0",
+ "resolve-workspace-root": "^2.0.0",
+ "semver": "^7.6.0",
+ "slugify": "^1.3.4"
+ }
+ },
+ "node_modules/@expo/config-plugins": {
+ "version": "57.0.9",
+ "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-57.0.9.tgz",
+ "integrity": "sha512-hHgfL1avkCdEvDSw7IwlKwRYYNgcxzbNNMIk6W6lTkJpY0MajinAfeJUS0J+wPCsjUfGbVqOJM+XhPaO5ulUxg==",
+ "license": "MIT",
+ "dependencies": {
+ "@expo/config-types": "^57.0.2",
+ "@expo/json-file": "~11.0.1",
+ "@expo/plist": "^0.8.1",
+ "@expo/require-utils": "^57.0.5",
+ "@expo/sdk-runtime-versions": "^1.0.0",
+ "chalk": "^4.1.2",
+ "debug": "^4.3.5",
+ "getenv": "^2.0.0",
+ "glob": "^13.0.0",
+ "semver": "^7.5.4",
+ "slugify": "^1.6.6",
+ "xcode": "^3.0.1",
+ "xml2js": "0.6.0"
+ }
+ },
+ "node_modules/@expo/config-types": {
+ "version": "57.0.2",
+ "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-57.0.2.tgz",
+ "integrity": "sha512-ewW08OonrcRIsRKIlFvvcmmafE5zemb1ocu3HkNwtVPyRtj2w42pZCAkMIROYpcVBaPnc3mDT9UZDzwXWC3i6g==",
+ "license": "MIT"
+ },
+ "node_modules/@expo/devcert": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@expo/devcert/-/devcert-1.2.1.tgz",
+ "integrity": "sha512-qC4eaxmKMTmJC2ahwyui6ud8f3W60Ss7pMkpBq40Hu3zyiAaugPXnZ24145U7K36qO9UHdZUVxsCvIpz2RYYCA==",
+ "license": "MIT",
+ "dependencies": {
+ "@expo/sudo-prompt": "^9.3.1",
+ "debug": "^3.1.0"
+ }
+ },
+ "node_modules/@expo/devcert/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/@expo/devtools": {
+ "version": "57.0.1",
+ "resolved": "https://registry.npmjs.org/@expo/devtools/-/devtools-57.0.1.tgz",
+ "integrity": "sha512-GyUf+wFNkbttaX0jR7MZa9bm77U0IrLg6d2AjpxdyoXw/w4abHoXG0oFufwLMgP9zLTd5+Ct4X/ffNUTnlzZgg==",
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "^4.1.2"
+ },
+ "peerDependencies": {
+ "react": "*",
+ "react-native": "*"
+ },
+ "peerDependenciesMeta": {
+ "react": {
+ "optional": true
+ },
+ "react-native": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@expo/env": {
+ "version": "2.4.3",
+ "resolved": "https://registry.npmjs.org/@expo/env/-/env-2.4.3.tgz",
+ "integrity": "sha512-M1NXeZCA1mkMkYOyIe7PlyRX0/jqFtMoJgyblnlq/vpCRfmueFT7RnGSQG8uEFDF5WHOFGijAQ3fogPh3/n5Ng==",
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "^4.0.0",
+ "debug": "^4.3.4",
+ "getenv": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=20.12.0"
+ }
+ },
+ "node_modules/@expo/expo-modules-macros-plugin": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/@expo/expo-modules-macros-plugin/-/expo-modules-macros-plugin-0.6.1.tgz",
+ "integrity": "sha512-cpsLZE4rqkc1Y3eZTkxB98jrqY1YXgetmtxFt8q89jBRmk3quRuk1BZo+VcnCSObZardjg99r1k5xijEMONFGA==",
+ "license": "MIT"
+ },
+ "node_modules/@expo/fingerprint": {
+ "version": "0.20.13",
+ "resolved": "https://registry.npmjs.org/@expo/fingerprint/-/fingerprint-0.20.13.tgz",
+ "integrity": "sha512-h1x+w+JpNRu88a/5SMZRzJs9YDGR/f7R8ApCr7OdenhqmJ00hFxQMzvxajDLL+1P2Y2g/ND0xksusqvBqWSW5Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@expo/env": "^2.4.3",
+ "@expo/spawn-async": "^1.8.0",
+ "arg": "^5.0.2",
+ "chalk": "^4.1.2",
+ "debug": "^4.3.4",
+ "getenv": "^2.0.0",
+ "glob": "^13.0.0",
+ "ignore": "^5.3.1",
+ "minimatch": "^10.2.2",
+ "resolve-from": "^5.0.0",
+ "semver": "^7.6.0"
+ },
+ "bin": {
+ "fingerprint": "bin/cli.js"
+ }
+ },
+ "node_modules/@expo/image-utils": {
+ "version": "0.11.5",
+ "resolved": "https://registry.npmjs.org/@expo/image-utils/-/image-utils-0.11.5.tgz",
+ "integrity": "sha512-KPQBTpmpAfy/Vu9y4wPW808/qtZxjYmyJg8cm2QCPAupp+qEWA3b5zmk0ulOwQ9OgeHxuCPgUqWgkwHFo7UsrQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@expo/require-utils": "^57.0.5",
+ "@expo/spawn-async": "^1.8.0",
+ "chalk": "^4.0.0",
+ "getenv": "^2.0.0",
+ "jimp-compact": "0.16.1",
+ "parse-png": "^2.1.0",
+ "semver": "^7.6.0"
+ }
+ },
+ "node_modules/@expo/inline-modules": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/@expo/inline-modules/-/inline-modules-0.1.7.tgz",
+ "integrity": "sha512-Bz/khd1gIJqDkje7t5ejD5e9jFbm4xEJzWSwRKadRo6gruepbw1xJ3Eb+e58OS8fY1ZNQYjzZbspnuph67sN0g==",
+ "license": "MIT",
+ "dependencies": {
+ "@expo/config-plugins": "~57.0.9"
+ }
+ },
+ "node_modules/@expo/json-file": {
+ "version": "11.0.1",
+ "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-11.0.1.tgz",
+ "integrity": "sha512-zxHWj4MKKMAL29ZQSY/Fssx4Thluk40JmuGNaeS078wy/NhlFhnVi+rHHunulE3xJAJ0CM73m8VK2+GkF9eRwQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.20.0",
+ "json5": "^2.2.3"
+ }
+ },
+ "node_modules/@expo/local-build-cache-provider": {
+ "version": "57.0.8",
+ "resolved": "https://registry.npmjs.org/@expo/local-build-cache-provider/-/local-build-cache-provider-57.0.8.tgz",
+ "integrity": "sha512-SEdE0pAQrr90bRh3MNR0ZuwoIBw390cYdFgbn7Vk0Mtm9EHaBfP7kYj+2hXnXZJgOEm3/JMtfoD3rV7rWA9FGg==",
+ "license": "MIT",
+ "dependencies": {
+ "@expo/config": "~57.0.9",
+ "chalk": "^4.1.2"
+ }
+ },
+ "node_modules/@expo/metro": {
+ "version": "56.0.2",
+ "resolved": "https://registry.npmjs.org/@expo/metro/-/metro-56.0.2.tgz",
+ "integrity": "sha512-Ld5AeYMCCDa8bLeWhfuLbZFFjlV3f6ORqyPz2glGh6RltIngMuLf9BTC2yvHFjkKuGxL5SynijmA8xmNNWn5iA==",
+ "license": "MIT",
+ "dependencies": {
+ "metro": "0.84.5",
+ "metro-babel-transformer": "0.84.5",
+ "metro-cache": "0.84.5",
+ "metro-cache-key": "0.84.5",
+ "metro-config": "0.84.5",
+ "metro-core": "0.84.5",
+ "metro-file-map": "0.84.5",
+ "metro-minify-terser": "0.84.5",
+ "metro-resolver": "0.84.5",
+ "metro-runtime": "0.84.5",
+ "metro-source-map": "0.84.5",
+ "metro-symbolicate": "0.84.5",
+ "metro-transform-plugins": "0.84.5",
+ "metro-transform-worker": "0.84.5"
+ }
+ },
+ "node_modules/@expo/metro-file-map": {
+ "version": "57.0.3",
+ "resolved": "https://registry.npmjs.org/@expo/metro-file-map/-/metro-file-map-57.0.3.tgz",
+ "integrity": "sha512-1OXy+uPYY5uc7Tm4VBsd2NRn+3wHhqeqNuEO/Xo4kmYgv8FjYgUAc+bUXON9FpC2ikcLn4EVlGM9ce2exx9Mlg==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.3.4",
+ "fb-watchman": "^2.0.2",
+ "invariant": "^2.2.4",
+ "jest-worker": "^29.7.0",
+ "micromatch": "^4.0.4",
+ "walker": "^1.0.8"
+ }
+ },
+ "node_modules/@expo/osascript": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/@expo/osascript/-/osascript-2.7.1.tgz",
+ "integrity": "sha512-Zn03EX6In7ts2lPUW2ESUSkEhEWQN1qqsiXjadtZMJOuZRkMiAg1ZQHuvz9DjByDWNJ2pBwAGyrts9lj9k389g==",
+ "license": "MIT",
+ "dependencies": {
+ "@expo/spawn-async": "^1.8.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@expo/package-manager": {
+ "version": "1.13.1",
+ "resolved": "https://registry.npmjs.org/@expo/package-manager/-/package-manager-1.13.1.tgz",
+ "integrity": "sha512-y/K+CaYYpZpNGZhSX4HyLT/vyIunFjNfyoxNysPBCefeLKI/VCx6f9LNPzrxayr3rCYO5bl9O8H+HRQK265Nkg==",
+ "license": "MIT",
+ "dependencies": {
+ "@expo/json-file": "^11.0.1",
+ "@expo/spawn-async": "^1.8.0",
+ "chalk": "^4.0.0",
+ "npm-package-arg": "^11.0.0",
+ "ora": "^3.4.0",
+ "resolve-workspace-root": "^2.0.0"
+ }
+ },
+ "node_modules/@expo/plist": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/@expo/plist/-/plist-0.8.1.tgz",
+ "integrity": "sha512-3gTReGIUm0oRaMClsAJYxBnVPCl6fVpsl8HS+DTVxDhW4GyVyxg9E/Znm3BvcHtUJ51RJJI14pC1wvrNilCRHw==",
+ "license": "MIT",
+ "dependencies": {
+ "@xmldom/xmldom": "^0.8.8",
+ "base64-js": "^1.5.1",
+ "xmlbuilder": "^15.1.1"
+ }
+ },
+ "node_modules/@expo/prebuild-config": {
+ "version": "57.0.16",
+ "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-57.0.16.tgz",
+ "integrity": "sha512-QA8oMZ7y70kjOzw+abhRl9uYC8Nu/abeUTHr0YVxb3pgIC14gc7w543bYtI+5gEDI3q55jKUViIauC76QvZN1w==",
+ "license": "MIT",
+ "dependencies": {
+ "@expo/config": "~57.0.9",
+ "@expo/config-plugins": "~57.0.9",
+ "@expo/config-types": "^57.0.2",
+ "@expo/image-utils": "^0.11.5",
+ "@expo/json-file": "^11.0.1",
+ "@react-native/normalize-colors": "0.86.3",
+ "debug": "^4.3.1",
+ "expo-modules-autolinking": "~57.0.13",
+ "resolve-from": "^5.0.0",
+ "semver": "^7.6.0"
+ }
+ },
+ "node_modules/@expo/require-utils": {
+ "version": "57.0.5",
+ "resolved": "https://registry.npmjs.org/@expo/require-utils/-/require-utils-57.0.5.tgz",
+ "integrity": "sha512-kTAXj9lDFEIPMsbAOGCGbjBbMF0oi7CqkYM79KOX0DDD9wSwXmlKL1z2h8OwsrBf7mbOo2DjlRvZu4BEjrIxGw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.20.0",
+ "@babel/core": "^7.25.2",
+ "@babel/plugin-transform-modules-commonjs": "^7.24.8"
+ },
+ "peerDependencies": {
+ "typescript": "^5.0.0 || ^5.0.0-0 || ^6.0.0 || ^7.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@expo/schema-utils": {
+ "version": "57.0.2",
+ "resolved": "https://registry.npmjs.org/@expo/schema-utils/-/schema-utils-57.0.2.tgz",
+ "integrity": "sha512-fMu/jyN0l1Wzv7XkeWR4IYCx1M8ryui3FdBNGrWwbRgJ7EhxXxK8E2jxP2W3pbgUwUY0V3hG8+GyfCZwny+Lxw==",
+ "license": "MIT"
+ },
+ "node_modules/@expo/sdk-runtime-versions": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@expo/sdk-runtime-versions/-/sdk-runtime-versions-1.0.0.tgz",
+ "integrity": "sha512-Doz2bfiPndXYFPMRwPyGa1k5QaKDVpY806UJj570epIiMzWaYyCtobasyfC++qfIXVb5Ocy7r3tP9d62hAQ7IQ==",
+ "license": "MIT"
+ },
+ "node_modules/@expo/spawn-async": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/@expo/spawn-async/-/spawn-async-1.8.0.tgz",
+ "integrity": "sha512-eb9xxd/LbuEGSdua4NumCu/McVB9EM+F/JxB9pWgnERw4HQ9XyTNH1KapG6oqLWR8TuRK2LQfzJlmNi94CVobw==",
+ "license": "MIT",
+ "dependencies": {
+ "cross-spawn": "^7.0.6"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@expo/sudo-prompt": {
+ "version": "9.3.2",
+ "resolved": "https://registry.npmjs.org/@expo/sudo-prompt/-/sudo-prompt-9.3.2.tgz",
+ "integrity": "sha512-HHQigo3rQWKMDzYDLkubN5WQOYXJJE2eNqIQC2axC2iO3mHdwnIR7FgZVvHWtBwAdzBgAP0ECp8KqS8TiMKvgw==",
+ "license": "MIT"
+ },
+ "node_modules/@expo/xcpretty": {
+ "version": "4.4.5",
+ "resolved": "https://registry.npmjs.org/@expo/xcpretty/-/xcpretty-4.4.5.tgz",
+ "integrity": "sha512-J3eL4n4h5QTwfD0SIz8OIk6/+sOL/hFZAMacgCM07UNlxBQfJipEpIC2AQxvGkbYeStByJ0TVhQAJo+DeNgaSQ==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@babel/code-frame": "^7.20.0",
+ "chalk": "^4.1.0",
+ "js-yaml": "^4.1.0"
+ },
+ "bin": {
+ "excpretty": "build/cli.js"
+ }
+ },
+ "node_modules/@isaacs/ttlcache": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/@isaacs/ttlcache/-/ttlcache-1.4.1.tgz",
+ "integrity": "sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@jest/schemas": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz",
+ "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==",
+ "license": "MIT",
+ "dependencies": {
+ "@sinclair/typebox": "^0.27.8"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/types": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz",
+ "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/schemas": "^29.6.3",
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^17.0.8",
+ "chalk": "^4.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.13",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
+ "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.0",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ }
+ },
+ "node_modules/@jridgewell/remapping": {
+ "version": "2.3.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz",
+ "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/source-map": {
+ "version": "0.3.11",
+ "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz",
+ "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.25"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz",
+ "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==",
+ "license": "MIT"
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.31",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
+ "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "node_modules/@react-native-async-storage/async-storage": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@react-native-async-storage/async-storage/-/async-storage-2.2.0.tgz",
+ "integrity": "sha512-gvRvjR5JAaUZF8tv2Kcq/Gbt3JHwbKFYfmb445rhOj6NUMx3qPLixmDx5pZAyb9at1bYvJ4/eTUipU5aki45xw==",
+ "license": "MIT",
+ "dependencies": {
+ "merge-options": "^3.0.4"
+ },
+ "peerDependencies": {
+ "react-native": "^0.0.0-0 || >=0.65 <1.0"
+ }
+ },
+ "node_modules/@react-native/assets-registry": {
+ "version": "0.86.3",
+ "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.86.3.tgz",
+ "integrity": "sha512-TDhgCZA4wjJg84d5A9swiOQYPIWSKEEVdg9IwMFZDupQzW/F3QoLUrfAJOcalgqTDA9/buTB8awhE3Whwg6u9Q==",
+ "license": "MIT",
+ "engines": {
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
+ }
+ },
+ "node_modules/@react-native/babel-plugin-codegen": {
+ "version": "0.86.3",
+ "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.86.3.tgz",
+ "integrity": "sha512-O6Xza4JBGPIU8J7YbKTyBoYL4thpy8jMW/oaLDWdAyOwYHKIjK47pAL5HUEbOe2bWz2PEKjbYRF2ApkJv1ottQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/traverse": "^7.29.0",
+ "@react-native/codegen": "0.86.3"
+ },
+ "engines": {
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
+ }
+ },
+ "node_modules/@react-native/codegen": {
+ "version": "0.86.3",
+ "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.86.3.tgz",
+ "integrity": "sha512-Ux4jHi0fh+bdtVEcL0gaPLbY56V+SvFUDl/8sRAE1jdb4k+o7fT/4Nc29yz4X+qfjstkSqObQTMBGhdzxH9JvA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.25.2",
+ "@babel/parser": "^7.29.0",
+ "hermes-parser": "0.36.0",
+ "invariant": "^2.2.4",
+ "nullthrows": "^1.1.1",
+ "tinyglobby": "^0.2.15",
+ "yargs": "^17.6.2"
+ },
+ "engines": {
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "*"
+ }
+ },
+ "node_modules/@react-native/codegen/node_modules/hermes-estree": {
+ "version": "0.36.0",
+ "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.36.0.tgz",
+ "integrity": "sha512-A1+8zn5oss2CFP7pKsOaxorQG6FNIz1WU1VDqruLPPZl3LVgeE2C5xfFg8Ow6/Ow4mSslLLtYP1J3n38eKyW9w==",
+ "license": "MIT"
+ },
+ "node_modules/@react-native/codegen/node_modules/hermes-parser": {
+ "version": "0.36.0",
+ "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.36.0.tgz",
+ "integrity": "sha512-GdpwMmH5x6IpC1cijvcvYnlPB60Mh6kTSF/NFdYV/j56gYdi+0RIakYs+eqOV+bbO0SW7mgVVGSsTJxyPQfo3w==",
+ "license": "MIT",
+ "dependencies": {
+ "hermes-estree": "0.36.0"
+ }
+ },
+ "node_modules/@react-native/community-cli-plugin": {
+ "version": "0.86.3",
+ "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.86.3.tgz",
+ "integrity": "sha512-qSDL9LQc5mZSZPNczT95WU9YQuPzxBklgON9vLhhqfI0yWIwKInqFx88dQ/uiEXBtf0yossthaQIqA4Ml6bF6g==",
+ "license": "MIT",
+ "dependencies": {
+ "@react-native/dev-middleware": "0.86.3",
+ "debug": "^4.4.0",
+ "invariant": "^2.2.4",
+ "metro": "^0.84.3",
+ "metro-config": "^0.84.3",
+ "metro-core": "^0.84.3",
+ "semver": "^7.1.3"
+ },
+ "engines": {
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
+ },
+ "peerDependencies": {
+ "@react-native-community/cli": "*",
+ "@react-native/metro-config": "0.86.3"
+ },
+ "peerDependenciesMeta": {
+ "@react-native-community/cli": {
+ "optional": true
+ },
+ "@react-native/metro-config": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@react-native/debugger-frontend": {
+ "version": "0.86.3",
+ "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.86.3.tgz",
+ "integrity": "sha512-TQmeofQ0PcuylhhlleOeuzHYZfbrgm3gayXzowqUEzgRisTm1D40/J3ggqs7XkQi5HP5ZA3n8dHmKL9vIzPcsw==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
+ }
+ },
+ "node_modules/@react-native/debugger-shell": {
+ "version": "0.86.3",
+ "resolved": "https://registry.npmjs.org/@react-native/debugger-shell/-/debugger-shell-0.86.3.tgz",
+ "integrity": "sha512-O4ds+J7xZfxkbih9T+cAGegBdvKSPKYJm/lDgC9CpEjFMkmzWTpVLU3Qsv9sqZuo58z+sGhIcJfPsCFFWHpqbQ==",
+ "license": "MIT",
+ "dependencies": {
+ "cross-spawn": "^7.0.6",
+ "debug": "^4.4.0",
+ "fb-dotslash": "0.5.8"
+ },
+ "engines": {
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
+ }
+ },
+ "node_modules/@react-native/dev-middleware": {
+ "version": "0.86.3",
+ "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.86.3.tgz",
+ "integrity": "sha512-LiEPTqTg/63bYUnrPyHLfjTDCNhA/+CUqI1+DsA9tYyewtSbULd5awsva6SgE10I+2iMhgKXS3ymkhU/kSCrGA==",
+ "license": "MIT",
+ "dependencies": {
+ "@isaacs/ttlcache": "^1.4.1",
+ "@react-native/debugger-frontend": "0.86.3",
+ "@react-native/debugger-shell": "0.86.3",
+ "chrome-launcher": "^0.15.2",
+ "chromium-edge-launcher": "^0.3.0",
+ "connect": "^3.6.5",
+ "debug": "^4.4.0",
+ "invariant": "^2.2.4",
+ "nullthrows": "^1.1.1",
+ "open": "^7.0.3",
+ "serve-static": "^1.16.2",
+ "ws": "^7.5.10"
+ },
+ "engines": {
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
+ }
+ },
+ "node_modules/@react-native/gradle-plugin": {
+ "version": "0.86.3",
+ "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.86.3.tgz",
+ "integrity": "sha512-lxmx0GqLEWRIpZfpYFXlYVIs3ENQwaW6Vmp6oi29l2GoQJ1wZfFZRdMimDWlGEk8LKfHar3QH3iaPMkTcK9lEQ==",
+ "license": "MIT",
+ "engines": {
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
+ }
+ },
+ "node_modules/@react-native/js-polyfills": {
+ "version": "0.86.3",
+ "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.86.3.tgz",
+ "integrity": "sha512-eYIJ0es967+tePBFQDnl/gidVFxLns3fnbiK6rxscQrGodvuUO6hwxpQnfNynJ8MjbbndImXihXjcnJdc7SzJg==",
+ "license": "MIT",
+ "engines": {
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
+ }
+ },
+ "node_modules/@react-native/normalize-colors": {
+ "version": "0.86.3",
+ "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.86.3.tgz",
+ "integrity": "sha512-Cv3CDkprb67GrzuaS9BGbBJC/6G4lIw3nyKOHRKTqTTum4bn37y5+R0Z04L8mcbQN85eEohNrRwb7IOM4j6uvg==",
+ "license": "MIT"
+ },
+ "node_modules/@react-native/virtualized-lists": {
+ "version": "0.86.3",
+ "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.86.3.tgz",
+ "integrity": "sha512-1j44NEyNn05Ut40vHAmoSWbsIcybFkMAOBTwQt1PrESyfSS+qBoyU1LGIogNva0VIa0rQyEC5PzbA7R4/7Nhyw==",
+ "license": "MIT",
+ "dependencies": {
+ "invariant": "^2.2.4",
+ "nullthrows": "^1.1.1"
+ },
+ "engines": {
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
+ },
+ "peerDependencies": {
+ "@types/react": "^19.2.0",
+ "react": "*",
+ "react-native": "0.86.3"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@sinclair/typebox": {
+ "version": "0.27.12",
+ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.12.tgz",
+ "integrity": "sha512-hhyNJ+nbR6ZR7pToHvllEFun9TL0sbL+tk/ON75lo+Xas054uez98qRbsuNt7MBCyZKK4+8Yli/OAGZhmfBZ/g==",
+ "license": "MIT"
+ },
+ "node_modules/@types/istanbul-lib-coverage": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz",
+ "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==",
+ "license": "MIT"
+ },
+ "node_modules/@types/istanbul-lib-report": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz",
+ "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "*"
+ }
+ },
+ "node_modules/@types/istanbul-reports": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz",
+ "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/istanbul-lib-report": "*"
+ }
+ },
+ "node_modules/@types/node": {
+ "version": "26.6.1",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-26.6.1.tgz",
+ "integrity": "sha512-VqGJBMCtdhqkBUCcBLvywI0NJ+KLuVzgNnlBUNFOQjqVxzo2lxLUNg1DSey8+u2u6ktswSAxg+s68QLzWHNOuA==",
+ "license": "MIT",
+ "dependencies": {
+ "undici-types": "~8.9.0"
+ }
+ },
+ "node_modules/@types/yargs": {
+ "version": "17.0.35",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz",
+ "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/@types/yargs-parser": {
+ "version": "21.0.3",
+ "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz",
+ "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==",
+ "license": "MIT"
+ },
+ "node_modules/@ungap/structured-clone": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.4.0.tgz",
+ "integrity": "sha512-1mEZtMKPM09vDmQt5y7YvmN2+DFTP7Tg0EWXdic8/C6VRnpb33e4ghisCIE3WZjsE2N8mf+QV1Zqh7ZFYLWInQ==",
+ "license": "ISC"
+ },
+ "node_modules/@xmldom/xmldom": {
+ "version": "0.8.15",
+ "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.15.tgz",
+ "integrity": "sha512-/5NV/vDALVFDXgLmfsy9TRCBlKwO2LNBFzpzvb9iIj+jR+eSc6DLYYvVOdivT/jm7MtU6TebYuRmzEOI7w40UA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/abort-controller": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
+ "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==",
+ "license": "MIT",
+ "dependencies": {
+ "event-target-shim": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=6.5"
+ }
+ },
+ "node_modules/accepts": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz",
+ "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==",
+ "license": "MIT",
+ "dependencies": {
+ "mime-types": "^3.0.0",
+ "negotiator": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "8.18.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz",
+ "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==",
+ "license": "MIT",
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/agent-base": {
+ "version": "7.1.4",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz",
+ "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/agent-cli-detector": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/agent-cli-detector/-/agent-cli-detector-0.1.7.tgz",
+ "integrity": "sha512-d8OWDVdZMgjhLUT9ZPgSv/BdFFF9pVuscC0JdUSz3bjwE15gcp6u/o0/JooM2yyAWC49KThFhXlgTXRa9B7yng==",
+ "license": "MIT",
+ "bin": {
+ "agent-cli-detector": "dist/cli.js"
+ },
+ "engines": {
+ "node": ">=18.18"
+ }
+ },
+ "node_modules/anser": {
+ "version": "1.4.10",
+ "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.10.tgz",
+ "integrity": "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==",
+ "license": "MIT"
+ },
+ "node_modules/ansi-escapes": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
+ "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
+ "license": "MIT",
+ "dependencies": {
+ "type-fest": "^0.21.3"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ansi-escapes/node_modules/type-fest": {
+ "version": "0.21.3",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
+ "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/arg": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
+ "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
+ "license": "MIT"
+ },
+ "node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "license": "Python-2.0"
+ },
+ "node_modules/asap": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
+ "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==",
+ "license": "MIT"
+ },
+ "node_modules/babel-plugin-polyfill-corejs2": {
+ "version": "0.4.17",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.17.tgz",
+ "integrity": "sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/compat-data": "^7.28.6",
+ "@babel/helper-define-polyfill-provider": "^0.6.8",
+ "semver": "^6.3.1"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-corejs3": {
+ "version": "0.13.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz",
+ "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-define-polyfill-provider": "^0.6.5",
+ "core-js-compat": "^3.43.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-regenerator": {
+ "version": "0.6.8",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.8.tgz",
+ "integrity": "sha512-M762rNHfSF1EV3SLtnCJXFoQbbIIz0OyRwnCmV0KPC7qosSfCO0QLTSuJX3ayAebubhE6oYBAYPrBA5ljowaZg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-define-polyfill-provider": "^0.6.8"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/babel-plugin-react-compiler": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-react-compiler/-/babel-plugin-react-compiler-1.0.0.tgz",
+ "integrity": "sha512-Ixm8tFfoKKIPYdCCKYTsqv+Fd4IJ0DQqMyEimo+pxUOMUR9cVPlwTrFt9Avu+3cb6Zp3mAzl+t1MrG2fxxKsxw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.26.0"
+ }
+ },
+ "node_modules/babel-plugin-react-native-web": {
+ "version": "0.21.2",
+ "resolved": "https://registry.npmjs.org/babel-plugin-react-native-web/-/babel-plugin-react-native-web-0.21.2.tgz",
+ "integrity": "sha512-SPD0J6qjJn8231i0HZhlAGH6NORe+QvRSQM2mwQEzJ2Fb3E4ruWTiiicPlHjmeWShDXLcvoorOCXjeR7k/lyWA==",
+ "license": "MIT"
+ },
+ "node_modules/babel-plugin-syntax-hermes-parser": {
+ "version": "0.36.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.36.0.tgz",
+ "integrity": "sha512-LhD0xdoedDw7ansQgXbB2DADLZIK/LRXuWNBPuVzMc5S2WK5GyT89tCM+cQzxFGO0mGyLK6D5TrVOJJzAoDy8Q==",
+ "license": "MIT",
+ "dependencies": {
+ "hermes-parser": "0.36.0"
+ }
+ },
+ "node_modules/babel-plugin-syntax-hermes-parser/node_modules/hermes-estree": {
+ "version": "0.36.0",
+ "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.36.0.tgz",
+ "integrity": "sha512-A1+8zn5oss2CFP7pKsOaxorQG6FNIz1WU1VDqruLPPZl3LVgeE2C5xfFg8Ow6/Ow4mSslLLtYP1J3n38eKyW9w==",
+ "license": "MIT"
+ },
+ "node_modules/babel-plugin-syntax-hermes-parser/node_modules/hermes-parser": {
+ "version": "0.36.0",
+ "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.36.0.tgz",
+ "integrity": "sha512-GdpwMmH5x6IpC1cijvcvYnlPB60Mh6kTSF/NFdYV/j56gYdi+0RIakYs+eqOV+bbO0SW7mgVVGSsTJxyPQfo3w==",
+ "license": "MIT",
+ "dependencies": {
+ "hermes-estree": "0.36.0"
+ }
+ },
+ "node_modules/babel-plugin-transform-flow-enums": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-enums/-/babel-plugin-transform-flow-enums-0.0.2.tgz",
+ "integrity": "sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/plugin-syntax-flow": "^7.12.1"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
+ "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==",
+ "license": "MIT",
+ "engines": {
+ "node": "18 || 20 || >=22"
+ }
+ },
+ "node_modules/base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/baseline-browser-mapping": {
+ "version": "2.11.25",
+ "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.25.tgz",
+ "integrity": "sha512-gMmEShwwq7FJqMwvfRwvCl00v4kN+KOfJqXn+f4nrufak5gNHJOksd/60Dvjuz7sI8Y5WiSFBa8FEYr+zoyqCw==",
+ "license": "Apache-2.0",
+ "bin": {
+ "baseline-browser-mapping": "dist/cli.cjs"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/big-integer": {
+ "version": "1.6.52",
+ "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz",
+ "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==",
+ "license": "Unlicense",
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
+ "node_modules/bplist-creator": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.1.0.tgz",
+ "integrity": "sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg==",
+ "license": "MIT",
+ "dependencies": {
+ "stream-buffers": "2.2.x"
+ }
+ },
+ "node_modules/bplist-parser": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.1.tgz",
+ "integrity": "sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA==",
+ "license": "MIT",
+ "dependencies": {
+ "big-integer": "1.6.x"
+ },
+ "engines": {
+ "node": ">= 5.10.0"
+ }
+ },
+ "node_modules/brace-expansion": {
+ "version": "5.0.12",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.12.tgz",
+ "integrity": "sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==",
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^4.0.2"
+ },
+ "engines": {
+ "node": "20 || >=22"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+ "license": "MIT",
+ "dependencies": {
+ "fill-range": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/browserslist": {
+ "version": "4.29.0",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.29.0.tgz",
+ "integrity": "sha512-3GSvyjvDI4Dur1Meg2BekJquu5uF+9R9a1+5M1Mde192eZoXbeXjzgOsgqPS2V8D5wrrip0gR5Hf/GhWQ9ZzaA==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "baseline-browser-mapping": "^2.11.23",
+ "caniuse-lite": "^1.0.30001810",
+ "electron-to-chromium": "^1.5.427",
+ "node-releases": "^2.0.55",
+ "update-browserslist-db": "^1.3.3"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/bser": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz",
+ "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "node-int64": "^0.4.0"
+ }
+ },
+ "node_modules/buffer-from": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
+ "license": "MIT"
+ },
+ "node_modules/bytes": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/camelcase": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
+ "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001810",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001810.tgz",
+ "integrity": "sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "CC-BY-4.0"
+ },
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/chrome-launcher": {
+ "version": "0.15.2",
+ "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.15.2.tgz",
+ "integrity": "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@types/node": "*",
+ "escape-string-regexp": "^4.0.0",
+ "is-wsl": "^2.2.0",
+ "lighthouse-logger": "^1.0.0"
+ },
+ "bin": {
+ "print-chrome-path": "bin/print-chrome-path.js"
+ },
+ "engines": {
+ "node": ">=12.13.0"
+ }
+ },
+ "node_modules/chromium-edge-launcher": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/chromium-edge-launcher/-/chromium-edge-launcher-0.3.0.tgz",
+ "integrity": "sha512-p03azHlGjtyRvFEee3cyvtsRYdniSkwjkzmM/KmVnqT5d7QkkwpJBhis/zCLMYdQMVJ5tt140TBNqqrZPaWeFA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@types/node": "*",
+ "escape-string-regexp": "^4.0.0",
+ "is-wsl": "^2.2.0",
+ "lighthouse-logger": "^1.0.0",
+ "mkdirp": "^1.0.4"
+ }
+ },
+ "node_modules/ci-info": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
+ "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==",
+ "license": "MIT"
+ },
+ "node_modules/cli-cursor": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
+ "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==",
+ "license": "MIT",
+ "dependencies": {
+ "restore-cursor": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/cli-spinners": {
+ "version": "2.9.2",
+ "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz",
+ "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/cliui": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
+ "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.1",
+ "wrap-ansi": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/clone": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
+ "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "license": "MIT"
+ },
+ "node_modules/commander": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
+ "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/compressible": {
+ "version": "2.0.18",
+ "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
+ "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": ">= 1.43.0 < 2"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/compression": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.2.tgz",
+ "integrity": "sha512-o8vI5RE5A6EVVOd9o41jKp41aJom+QTEO/Bx8MYNjexMo/Bv2WOjUfZr+aL0WnYSgymUy6zeguqLTsIhV0gMvQ==",
+ "license": "MIT",
+ "dependencies": {
+ "bytes": "3.1.2",
+ "compressible": "~2.0.18",
+ "debug": "2.6.9",
+ "destroy": "1.2.0",
+ "negotiator": "~0.6.4",
+ "on-headers": "~1.1.0",
+ "safe-buffer": "5.2.1",
+ "vary": "~1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/compression/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/compression/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "license": "MIT"
+ },
+ "node_modules/compression/node_modules/negotiator": {
+ "version": "0.6.4",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz",
+ "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/connect": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz",
+ "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "2.6.9",
+ "finalhandler": "1.1.2",
+ "parseurl": "~1.3.3",
+ "utils-merge": "1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.10.0"
+ }
+ },
+ "node_modules/connect/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/connect/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "license": "MIT"
+ },
+ "node_modules/content-type": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.1.0.tgz",
+ "integrity": "sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/convert-source-map": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
+ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
+ "license": "MIT"
+ },
+ "node_modules/core-js-compat": {
+ "version": "3.50.0",
+ "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.50.0.tgz",
+ "integrity": "sha512-XGpFGbMLHwSt74YLTKho7Ib242qi6O8MSX+sRokV4oz7iKXvQWGYZthjIhjRGMxjzVkAubBO512dKGYcefmX3Q==",
+ "license": "MIT",
+ "dependencies": {
+ "browserslist": "^4.28.7"
+ },
+ "engines": {
+ "node": ">=6.4.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/core-js"
+ }
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/debug": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/deepmerge": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
+ "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/defaults": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz",
+ "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==",
+ "license": "MIT",
+ "dependencies": {
+ "clone": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/depd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/destroy": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
+ "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8",
+ "npm": "1.2.8000 || >= 1.4.16"
+ }
+ },
+ "node_modules/detect-libc": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
+ "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/dnssd-advertise": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/dnssd-advertise/-/dnssd-advertise-1.1.6.tgz",
+ "integrity": "sha512-Ndrrf6BMPalkQPd/zubL+4YghH2J9NspapQ09uDXwYbvOPkP0oaqf5CkcwJ0b50kS2O3ul6yVu+jz+RY62Cejg==",
+ "license": "MIT"
+ },
+ "node_modules/ee-first": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
+ "license": "MIT"
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.5.433",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.433.tgz",
+ "integrity": "sha512-5lCAbyZBjtmUt/RAGHRqrL2q0oEFRThDAsZHHDn9XHa89Qw7gMYOeSicBTy+AHfvo0r6vwsZvqNJTQIQy1BLzA==",
+ "license": "ISC"
+ },
+ "node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "license": "MIT"
+ },
+ "node_modules/encodeurl": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
+ "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/error-stack-parser": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz",
+ "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==",
+ "license": "MIT",
+ "dependencies": {
+ "stackframe": "^1.3.4"
+ }
+ },
+ "node_modules/es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-html": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
+ "license": "MIT"
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/etag": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/event-target-shim": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz",
+ "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/expo": {
+ "version": "57.0.24",
+ "resolved": "https://registry.npmjs.org/expo/-/expo-57.0.24.tgz",
+ "integrity": "sha512-LxSnKMv7en/w4XDNxW3VOx7SbtQ2Bs4MyGhtoZCToDsEsBPO7pJXlv5GnQUCd7Wi8118QV/VDwsDLBKTB3Z3iQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.20.0",
+ "@expo/cli": "^57.0.26",
+ "@expo/config": "~57.0.9",
+ "@expo/config-plugins": "~57.0.9",
+ "@expo/devtools": "~57.0.1",
+ "@expo/dom-webview": "~57.0.1",
+ "@expo/fingerprint": "^0.20.13",
+ "@expo/local-build-cache-provider": "^57.0.8",
+ "@expo/log-box": "^57.0.4",
+ "@expo/metro": "~56.0.2",
+ "@expo/metro-config": "~57.0.12",
+ "@ungap/structured-clone": "^1.3.0",
+ "babel-preset-expo": "~57.0.12",
+ "expo-asset": "~57.0.18",
+ "expo-constants": "~57.0.19",
+ "expo-file-system": "~57.0.7",
+ "expo-font": "~57.0.4",
+ "expo-keep-awake": "~57.0.2",
+ "expo-modules-autolinking": "~57.0.13",
+ "expo-modules-core": "~57.0.18",
+ "pretty-format": "^29.7.0",
+ "react-refresh": "^0.14.2",
+ "whatwg-url-minimum": "^0.1.2"
+ },
+ "bin": {
+ "expo": "bin/cli",
+ "expo-modules-autolinking": "bin/autolinking",
+ "fingerprint": "bin/fingerprint"
+ },
+ "peerDependencies": {
+ "@expo/dom-webview": "*",
+ "@expo/metro-runtime": "*",
+ "react": "*",
+ "react-dom": "*",
+ "react-native": "*",
+ "react-native-web": "*",
+ "react-native-webview": "*"
+ },
+ "peerDependenciesMeta": {
+ "@expo/dom-webview": {
+ "optional": true
+ },
+ "@expo/metro-runtime": {
+ "optional": true
+ },
+ "react-dom": {
+ "optional": true
+ },
+ "react-native-web": {
+ "optional": true
+ },
+ "react-native-webview": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/expo-modules-autolinking": {
+ "version": "57.0.13",
+ "resolved": "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-57.0.13.tgz",
+ "integrity": "sha512-Hj5NjZRlfccazhKab+wK19leRVUr1Y/PUERaRvegIbUSkq4GVxKq6lU9QHlKQyC16MdD/VS4iwsiLivB4o7lvQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@expo/require-utils": "^57.0.5",
+ "@expo/spawn-async": "^1.8.0",
+ "chalk": "^4.1.0",
+ "commander": "^7.2.0"
+ },
+ "bin": {
+ "expo-modules-autolinking": "bin/expo-modules-autolinking.js"
+ }
+ },
+ "node_modules/expo-modules-core": {
+ "version": "57.0.18",
+ "resolved": "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-57.0.18.tgz",
+ "integrity": "sha512-ovB7C+GVQTlKAOIsOIHJVVXN9Mn0ljf2SYBS+afrRaGqq+HZEn1D3o+HReIVeH1NjCn/xDBb7I4HjldHs6luZA==",
+ "license": "MIT",
+ "dependencies": {
+ "@expo/expo-modules-macros-plugin": "0.6.1",
+ "expo-modules-jsi": "~57.1.0",
+ "invariant": "^2.2.4"
+ },
+ "peerDependencies": {
+ "react": "*",
+ "react-native": "*",
+ "react-native-worklets": "^0.7.4 || ^0.8.0 || ^0.9.0 || ^0.10.0"
+ },
+ "peerDependenciesMeta": {
+ "react-native-worklets": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/expo-modules-jsi": {
+ "version": "57.1.0",
+ "resolved": "https://registry.npmjs.org/expo-modules-jsi/-/expo-modules-jsi-57.1.0.tgz",
+ "integrity": "sha512-a5ckeHfnbYfonhcHGkM0EU/a0Keh+/OufXy/HyFS+spr5Ib0N4Oh1ZsSYFQhp5xdOUFkVofKRhfH+VmcccIIpA==",
+ "license": "MIT",
+ "peerDependencies": {
+ "react-native": "*"
+ }
+ },
+ "node_modules/expo-server": {
+ "version": "57.0.3",
+ "resolved": "https://registry.npmjs.org/expo-server/-/expo-server-57.0.3.tgz",
+ "integrity": "sha512-aK+LdKzauHSGmsOStZtyxdzv0zWssCkxTw3m4QuOhfDSJsZaMRTd9O41d8ixU/QfELTbaJ0oRNcF7JFV/7O9YQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=20.16.0"
+ }
+ },
+ "node_modules/expo-status-bar": {
+ "version": "57.0.1",
+ "resolved": "https://registry.npmjs.org/expo-status-bar/-/expo-status-bar-57.0.1.tgz",
+ "integrity": "sha512-Xwaq1gAoVRWx5dPG5VhT5RSbnI9OilhZnO5qoPBnUaBAa5VzRzfdS8q0/bsPt0jR2DKLtGuP0bQ6efMJ4RIMDg==",
+ "license": "MIT",
+ "peerDependencies": {
+ "expo": "*",
+ "react": "*",
+ "react-native": "*"
+ }
+ },
+ "node_modules/expo/node_modules/@expo/cli": {
+ "version": "57.0.26",
+ "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-57.0.26.tgz",
+ "integrity": "sha512-vm769xuEyHMToi3uY66JLzRA2GGK+3WzdH71HNn67FuVhry82dKTvMUoeHYtHiindyeieiWfEvHT8Kr1VyEVPQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@expo/code-signing-certificates": "^0.0.6",
+ "@expo/config": "~57.0.9",
+ "@expo/config-plugins": "~57.0.9",
+ "@expo/devcert": "^1.2.1",
+ "@expo/env": "~2.4.3",
+ "@expo/image-utils": "^0.11.5",
+ "@expo/inline-modules": "^0.1.7",
+ "@expo/json-file": "^11.0.1",
+ "@expo/log-box": "^57.0.4",
+ "@expo/metro": "~56.0.2",
+ "@expo/metro-config": "~57.0.12",
+ "@expo/metro-file-map": "^57.0.3",
+ "@expo/osascript": "^2.7.1",
+ "@expo/package-manager": "^1.13.1",
+ "@expo/plist": "^0.8.1",
+ "@expo/prebuild-config": "^57.0.16",
+ "@expo/require-utils": "^57.0.5",
+ "@expo/router-server": "^57.0.10",
+ "@expo/schema-utils": "^57.0.2",
+ "@expo/spawn-async": "^1.8.0",
+ "@expo/ws-tunnel": "^2.0.0",
+ "@expo/xcpretty": "^4.4.4",
+ "@react-native/dev-middleware": "0.86.3",
+ "accepts": "^1.3.8",
+ "agent-cli-detector": "0.1.7",
+ "arg": "^5.0.2",
+ "bplist-creator": "0.1.0",
+ "bplist-parser": "^0.3.1",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.3.0",
+ "compression": "^1.7.4",
+ "connect": "^3.7.0",
+ "debug": "^4.3.4",
+ "dnssd-advertise": "^1.1.4",
+ "expo-server": "^57.0.3",
+ "fetch-nodeshim": "^0.4.10",
+ "getenv": "^2.0.0",
+ "glob": "^13.0.0",
+ "lan-network": "^0.2.1",
+ "multitars": "^1.0.2",
+ "node-forge": "^1.3.3",
+ "npm-package-arg": "^11.0.0",
+ "ora": "^3.4.0",
+ "picomatch": "^4.0.4",
+ "pretty-format": "^29.7.0",
+ "progress": "^2.0.3",
+ "prompts": "^2.3.2",
+ "resolve-from": "^5.0.0",
+ "sandbox-cli-detector": "^0.2.0",
+ "semver": "^7.6.0",
+ "send": "^0.19.0",
+ "slugify": "^1.3.4",
+ "stacktrace-parser": "^0.1.10",
+ "structured-headers": "^0.4.1",
+ "terminal-link": "^2.1.1",
+ "toqr": "^0.1.1",
+ "wrap-ansi": "^7.0.0",
+ "ws": "^8.12.1",
+ "zod": "^3.25.76"
+ },
+ "bin": {
+ "expo-internal": "main.js"
+ },
+ "peerDependencies": {
+ "expo": "*",
+ "expo-router": "*",
+ "react-native": "*"
+ },
+ "peerDependenciesMeta": {
+ "expo-router": {
+ "optional": true
+ },
+ "react-native": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/expo/node_modules/@expo/cli/node_modules/@expo/router-server": {
+ "version": "57.0.10",
+ "resolved": "https://registry.npmjs.org/@expo/router-server/-/router-server-57.0.10.tgz",
+ "integrity": "sha512-8rGh6N5di7jzu7UC1SuIA1TWmVd+vBwOHwC7/1ww+FA6CcxcWyQlcPl39h2+Jpnul78CVzWpIjOcdKsZsp2zXw==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.3.4"
+ },
+ "peerDependencies": {
+ "@expo/metro-runtime": "^57.0.15",
+ "expo": "*",
+ "expo-constants": "^57.0.18",
+ "expo-font": "^57.0.4",
+ "expo-router": "*",
+ "expo-server": "^57.0.3",
+ "react": "*",
+ "react-dom": "*",
+ "react-server-dom-webpack": "~19.0.1 || ~19.1.2 || ~19.2.1"
+ },
+ "peerDependenciesMeta": {
+ "@expo/metro-runtime": {
+ "optional": true
+ },
+ "expo-router": {
+ "optional": true
+ },
+ "react-dom": {
+ "optional": true
+ },
+ "react-server-dom-webpack": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/expo/node_modules/@expo/dom-webview": {
+ "version": "57.0.1",
+ "resolved": "https://registry.npmjs.org/@expo/dom-webview/-/dom-webview-57.0.1.tgz",
+ "integrity": "sha512-lAKsME4SAq+8sf56oN0DX5TBYyruupoRxbWbD2xf9RnKY8y6x8eb9LCE5pxSN0qyWdqnp+0wmyWzDkKboThKAw==",
+ "license": "MIT",
+ "peerDependencies": {
+ "expo": "*",
+ "react": "*",
+ "react-native": "*"
+ }
+ },
+ "node_modules/expo/node_modules/@expo/log-box": {
+ "version": "57.0.4",
+ "resolved": "https://registry.npmjs.org/@expo/log-box/-/log-box-57.0.4.tgz",
+ "integrity": "sha512-IxwS9s1L2muj8mj8AQSuiy7u8OFJdc02NRFo2me/Tj6DiaeG5SREqmpBE4rQpR2cadqSg5jl8Qab8Cjie616dg==",
+ "license": "MIT",
+ "dependencies": {
+ "@expo/dom-webview": "^57.0.1",
+ "anser": "^1.4.9",
+ "stacktrace-parser": "^0.1.10"
+ },
+ "peerDependencies": {
+ "@expo/dom-webview": "^57.0.1",
+ "expo": "*",
+ "react": "*",
+ "react-native": "*"
+ }
+ },
+ "node_modules/expo/node_modules/@expo/metro-config": {
+ "version": "57.0.12",
+ "resolved": "https://registry.npmjs.org/@expo/metro-config/-/metro-config-57.0.12.tgz",
+ "integrity": "sha512-S62Lrq35HZqBFD55423pmWb8PjaiR/W02zQC1uECBmw1vTN8WZaFz4TJ0i21EeJzwfebMb9MLxL8JZ102Z6VbA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.20.0",
+ "@babel/core": "^7.20.0",
+ "@babel/generator": "^7.20.5",
+ "@expo/config": "~57.0.9",
+ "@expo/env": "~2.4.3",
+ "@expo/json-file": "~11.0.1",
+ "@expo/metro": "~56.0.2",
+ "@expo/require-utils": "^57.0.5",
+ "@expo/spawn-async": "^1.8.0",
+ "@jridgewell/gen-mapping": "^0.3.13",
+ "@jridgewell/remapping": "^2.3.5",
+ "@jridgewell/sourcemap-codec": "^1.5.5",
+ "browserslist": "^4.25.0",
+ "chalk": "^4.1.0",
+ "debug": "^4.3.2",
+ "getenv": "^2.0.0",
+ "glob": "^13.0.0",
+ "hermes-parser": "^0.36.0",
+ "jsc-safe-url": "^0.2.4",
+ "lightningcss": "^1.30.1",
+ "picomatch": "^4.0.4",
+ "postcss": "^8.5.14",
+ "resolve-from": "^5.0.0"
+ },
+ "peerDependencies": {
+ "expo": "*"
+ },
+ "peerDependenciesMeta": {
+ "expo": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/expo/node_modules/@expo/ws-tunnel": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@expo/ws-tunnel/-/ws-tunnel-2.0.0.tgz",
+ "integrity": "sha512-j+JfTRdCk820J9dU0sA2SqshQIKFOMo7ED84w9MJFcebfbNQgsLztEY/SABDkGnjatrW4xGqnUhVRxSBVyCkXw==",
+ "license": "MIT",
+ "peerDependencies": {
+ "ws": "^8.0.0"
+ }
+ },
+ "node_modules/expo/node_modules/accepts": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
+ "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
+ "license": "MIT",
+ "dependencies": {
+ "mime-types": "~2.1.34",
+ "negotiator": "0.6.3"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/expo/node_modules/babel-preset-expo": {
+ "version": "57.0.12",
+ "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-57.0.12.tgz",
+ "integrity": "sha512-rrZqJPYbVevy7rqibJZQFd3AsleGslJ63vmB3Qs8b5poOO5AHaehUGbZHjb0HoOZO59d86BEifYbq0/ncoM2UQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/generator": "^7.20.5",
+ "@babel/helper-module-imports": "^7.25.9",
+ "@babel/plugin-proposal-decorators": "^7.12.9",
+ "@babel/plugin-proposal-export-default-from": "^7.24.7",
+ "@babel/plugin-syntax-dynamic-import": "^7.8.3",
+ "@babel/plugin-syntax-export-default-from": "^7.24.7",
+ "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
+ "@babel/plugin-syntax-optional-chaining": "^7.8.3",
+ "@babel/plugin-transform-async-generator-functions": "^7.25.4",
+ "@babel/plugin-transform-async-to-generator": "^7.24.7",
+ "@babel/plugin-transform-block-scoping": "^7.25.0",
+ "@babel/plugin-transform-class-properties": "^7.25.4",
+ "@babel/plugin-transform-class-static-block": "^7.27.1",
+ "@babel/plugin-transform-classes": "^7.25.4",
+ "@babel/plugin-transform-destructuring": "^7.24.8",
+ "@babel/plugin-transform-export-namespace-from": "^7.25.9",
+ "@babel/plugin-transform-flow-strip-types": "^7.25.2",
+ "@babel/plugin-transform-for-of": "^7.24.7",
+ "@babel/plugin-transform-logical-assignment-operators": "^7.24.7",
+ "@babel/plugin-transform-modules-commonjs": "^7.24.8",
+ "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7",
+ "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7",
+ "@babel/plugin-transform-object-rest-spread": "^7.24.7",
+ "@babel/plugin-transform-optional-catch-binding": "^7.24.7",
+ "@babel/plugin-transform-optional-chaining": "^7.24.8",
+ "@babel/plugin-transform-parameters": "^7.24.7",
+ "@babel/plugin-transform-private-methods": "^7.24.7",
+ "@babel/plugin-transform-private-property-in-object": "^7.24.7",
+ "@babel/plugin-transform-react-display-name": "^7.24.7",
+ "@babel/plugin-transform-react-jsx": "^7.28.6",
+ "@babel/plugin-transform-react-jsx-development": "^7.27.1",
+ "@babel/plugin-transform-react-pure-annotations": "^7.27.1",
+ "@babel/plugin-transform-runtime": "^7.24.7",
+ "@babel/plugin-transform-typescript": "^7.25.2",
+ "@babel/plugin-transform-unicode-regex": "^7.24.7",
+ "@babel/preset-typescript": "^7.23.0",
+ "@react-native/babel-plugin-codegen": "0.86.3",
+ "babel-plugin-react-compiler": "^1.0.0",
+ "babel-plugin-react-native-web": "~0.21.0",
+ "babel-plugin-syntax-hermes-parser": "^0.36.0",
+ "babel-plugin-transform-flow-enums": "^0.0.2",
+ "debug": "^4.3.4"
+ },
+ "peerDependencies": {
+ "@babel/runtime": "^7.20.0",
+ "expo": "*",
+ "expo-widgets": "^57.0.19",
+ "react-refresh": ">=0.14.0 <1.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@babel/runtime": {
+ "optional": true
+ },
+ "expo": {
+ "optional": true
+ },
+ "expo-widgets": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/expo/node_modules/ci-info": {
+ "version": "3.9.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
+ "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/sibiraj-s"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/expo/node_modules/expo-asset": {
+ "version": "57.0.18",
+ "resolved": "https://registry.npmjs.org/expo-asset/-/expo-asset-57.0.18.tgz",
+ "integrity": "sha512-zDIQkUr0NM2S7YRj98Zohf/OBuM1q0o4ctxLz1C1oe4/33lHNLjp+2v3qUtBWVwn0zKka8UGADmS8M+83Wi6pw==",
+ "license": "MIT",
+ "dependencies": {
+ "@expo/image-utils": "^0.11.5",
+ "expo-constants": "~57.0.19"
+ },
+ "peerDependencies": {
+ "expo": "*",
+ "react": "*",
+ "react-native": "*"
+ }
+ },
+ "node_modules/expo/node_modules/expo-constants": {
+ "version": "57.0.19",
+ "resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-57.0.19.tgz",
+ "integrity": "sha512-3eK1kZRwCdMizQLlM/PPlPwjaPnB5qKvdRDMBMnB1ZxmvWJBf9TB4uEO4DMMfIPaFUxYFs29dsR5fPr1gh3FTQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@expo/env": "~2.4.3"
+ },
+ "peerDependencies": {
+ "expo": "*",
+ "react-native": "*"
+ }
+ },
+ "node_modules/expo/node_modules/expo-file-system": {
+ "version": "57.0.7",
+ "resolved": "https://registry.npmjs.org/expo-file-system/-/expo-file-system-57.0.7.tgz",
+ "integrity": "sha512-1vkZRadOsIputFDBcclqBa1pO3iXOO6iIsdqJipQWw4V5TSnWgmRTuOF7ro8IzrVue+PHbum++KCG3Tawem4cg==",
+ "license": "MIT",
+ "peerDependencies": {
+ "expo": "*",
+ "react-native": "*"
+ }
+ },
+ "node_modules/expo/node_modules/expo-font": {
+ "version": "57.0.4",
+ "resolved": "https://registry.npmjs.org/expo-font/-/expo-font-57.0.4.tgz",
+ "integrity": "sha512-7WOMC2oA6xCfOm8bbofqWn2bIqyWFm7YLEnpc/gA1MJH0Ll0TfT/3+CqRkoW2eNRWMS8sxrz5WukUmSvmNquHA==",
+ "license": "MIT",
+ "dependencies": {
+ "fontfaceobserver": "^2.1.0"
+ },
+ "peerDependencies": {
+ "expo": "*",
+ "react": "*",
+ "react-native": "*"
+ }
+ },
+ "node_modules/expo/node_modules/expo-keep-awake": {
+ "version": "57.0.2",
+ "resolved": "https://registry.npmjs.org/expo-keep-awake/-/expo-keep-awake-57.0.2.tgz",
+ "integrity": "sha512-GqgH746wtJImmsbyHmCQoi7cOslKuWQBbJHXr53S35Bpf5UvxCAztvnitUEd7D0QvFN2rvkOhylbZpgZZfBLlQ==",
+ "license": "MIT",
+ "peerDependencies": {
+ "expo": "*",
+ "react": "*"
+ }
+ },
+ "node_modules/expo/node_modules/hermes-estree": {
+ "version": "0.36.1",
+ "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.36.1.tgz",
+ "integrity": "sha512-guv1nQ6IJ7S83NRFPWc3SA7IBZrdNC9kapwOq6uXvF4wP+sDCgjzQbKPCoyYmoyZRzztF/n/c36l/rccCZSiCw==",
+ "license": "MIT"
+ },
+ "node_modules/expo/node_modules/hermes-parser": {
+ "version": "0.36.1",
+ "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.36.1.tgz",
+ "integrity": "sha512-GApNk4zLHi2UWoWZZkx7LNCOSzLSc5lB55pZ/PhK7ycFeg7u5LcF88p/WbpIi1XUDtE0MpHE3uRR3u3KB7TjSQ==",
+ "license": "MIT",
+ "dependencies": {
+ "hermes-estree": "0.36.1"
+ }
+ },
+ "node_modules/expo/node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/expo/node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/expo/node_modules/negotiator": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
+ "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/expo/node_modules/picomatch": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz",
+ "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/expo/node_modules/ws": {
+ "version": "8.21.3",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.3.tgz",
+ "integrity": "sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": ">=5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/exponential-backoff": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz",
+ "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==",
+ "license": "Apache-2.0"
+ },
+ "node_modules/fb-dotslash": {
+ "version": "0.5.8",
+ "resolved": "https://registry.npmjs.org/fb-dotslash/-/fb-dotslash-0.5.8.tgz",
+ "integrity": "sha512-XHYLKk9J4BupDxi9bSEhkfss0m+Vr9ChTrjhf9l2iw3jB5C7BnY4GVPoMcqbrTutsKJso6yj2nAB6BI/F2oZaA==",
+ "license": "(MIT OR Apache-2.0)",
+ "bin": {
+ "dotslash": "bin/dotslash"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/fb-watchman": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz",
+ "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "bser": "2.1.1"
+ }
+ },
+ "node_modules/fetch-nodeshim": {
+ "version": "0.4.10",
+ "resolved": "https://registry.npmjs.org/fetch-nodeshim/-/fetch-nodeshim-0.4.10.tgz",
+ "integrity": "sha512-m6I8ALe4L4XpdETy7MJZWs6L1IVMbjs99bwbpIKphxX+0CTns4IKDWJY0LWfr4YsFjfg+z1TjzTMU8lKl8rG0w==",
+ "license": "MIT"
+ },
+ "node_modules/fill-range": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "license": "MIT",
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/finalhandler": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
+ "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "2.6.9",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "on-finished": "~2.3.0",
+ "parseurl": "~1.3.3",
+ "statuses": "~1.5.0",
+ "unpipe": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/finalhandler/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/finalhandler/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "license": "MIT"
+ },
+ "node_modules/flow-enums-runtime": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/flow-enums-runtime/-/flow-enums-runtime-0.0.6.tgz",
+ "integrity": "sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==",
+ "license": "MIT"
+ },
+ "node_modules/fontfaceobserver": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/fontfaceobserver/-/fontfaceobserver-2.3.0.tgz",
+ "integrity": "sha512-6FPvD/IVyT4ZlNe7Wcn5Fb/4ChigpucKYSvD6a+0iMoLn2inpo711eyIcKjmDtE5XNcgAkSH9uN/nfAeZzHEfg==",
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/fresh": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+ "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "license": "ISC",
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
+ },
+ "node_modules/getenv": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/getenv/-/getenv-2.0.0.tgz",
+ "integrity": "sha512-VilgtJj/ALgGY77fiLam5iD336eSWi96Q15JSAG1zi8NRBysm3LXKdGnHb4m5cuyxvOLQQKWpBZAT6ni4FI2iQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/glob": {
+ "version": "13.0.6",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz",
+ "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==",
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "minimatch": "^10.2.2",
+ "minipass": "^7.1.3",
+ "path-scurry": "^2.0.2"
+ },
+ "engines": {
+ "node": "18 || 20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+ "license": "ISC"
+ },
+ "node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/hasown": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz",
+ "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==",
+ "license": "MIT",
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/hermes-compiler": {
+ "version": "250829098.0.17",
+ "resolved": "https://registry.npmjs.org/hermes-compiler/-/hermes-compiler-250829098.0.17.tgz",
+ "integrity": "sha512-qG1PXzTEtriF6oQLZF3vyHhSMxOdW5h2TqqLri0rdpstPustd2fSvRZQMVAPdlhgFwBfYnj3OUZtiO6LjYsEFw==",
+ "license": "MIT"
+ },
+ "node_modules/hermes-estree": {
+ "version": "0.35.0",
+ "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.35.0.tgz",
+ "integrity": "sha512-xVx5Opwy8Oo1I5yGpVRhCvWL/iV3M+ylksSKVNlxxD90cpDpR/AR1jLYqK8HWihm065a6UI3HeyAmYzwS8NOOg==",
+ "license": "MIT"
+ },
+ "node_modules/hermes-parser": {
+ "version": "0.35.0",
+ "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.35.0.tgz",
+ "integrity": "sha512-9JLjeHxBx8T4CAsydZR49PNZUaix+WpQJwu9p2010lu+7Kwl6D/7wYFFJxoz+aXkaaClp9Zfg6W6/zVlSJORaA==",
+ "license": "MIT",
+ "dependencies": {
+ "hermes-estree": "0.35.0"
+ }
+ },
+ "node_modules/hosted-git-info": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz",
+ "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==",
+ "license": "ISC",
+ "dependencies": {
+ "lru-cache": "^10.0.1"
+ },
+ "engines": {
+ "node": "^16.14.0 || >=18.0.0"
+ }
+ },
+ "node_modules/hosted-git-info/node_modules/lru-cache": {
+ "version": "10.4.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
+ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
+ "license": "ISC"
+ },
+ "node_modules/http-errors": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz",
+ "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==",
+ "license": "MIT",
+ "dependencies": {
+ "depd": "~2.0.0",
+ "inherits": "~2.0.4",
+ "setprototypeof": "~1.2.0",
+ "statuses": "~2.0.2",
+ "toidentifier": "~1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/http-errors/node_modules/statuses": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz",
+ "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/https-proxy-agent": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz",
+ "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==",
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "^7.1.2",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/ignore": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
+ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "license": "ISC"
+ },
+ "node_modules/invariant": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
+ "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
+ "license": "MIT",
+ "dependencies": {
+ "loose-envify": "^1.0.0"
+ }
+ },
+ "node_modules/is-core-module": {
+ "version": "2.17.0",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.17.0.tgz",
+ "integrity": "sha512-J/vG0zBCbIKOQFfufSwyXdMrsohyJIUNkrnmo6WZGzoM7tr/lsbfW5b2BvisL6zsyMzK9UxV9L6c7AoFbyXHOA==",
+ "license": "MIT",
+ "dependencies": {
+ "hasown": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-docker": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
+ "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
+ "license": "MIT",
+ "bin": {
+ "is-docker": "cli.js"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-plain-obj": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
+ "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-wsl": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
+ "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
+ "license": "MIT",
+ "dependencies": {
+ "is-docker": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "license": "ISC"
+ },
+ "node_modules/jest-get-type": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz",
+ "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==",
+ "license": "MIT",
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-util": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz",
+ "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "graceful-fs": "^4.2.9",
+ "picomatch": "^2.2.3"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-util/node_modules/ci-info": {
+ "version": "3.9.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
+ "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/sibiraj-s"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-validate": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz",
+ "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^29.6.3",
+ "camelcase": "^6.2.0",
+ "chalk": "^4.0.0",
+ "jest-get-type": "^29.6.3",
+ "leven": "^3.1.0",
+ "pretty-format": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-worker": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz",
+ "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*",
+ "jest-util": "^29.7.0",
+ "merge-stream": "^2.0.0",
+ "supports-color": "^8.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-worker/node_modules/supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "node_modules/jimp-compact": {
+ "version": "0.16.1",
+ "resolved": "https://registry.npmjs.org/jimp-compact/-/jimp-compact-0.16.1.tgz",
+ "integrity": "sha512-dZ6Ra7u1G8c4Letq/B5EzAxj4tLFHL+cGtdpR+PVm4yzPDj+lCk+AbivWt1eOM+ikzkowtyV7qSqX6qr3t71Ww==",
+ "license": "MIT"
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "license": "MIT"
+ },
+ "node_modules/js-yaml": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.2.tgz",
+ "integrity": "sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/puzrin"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/nodeca"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/jsc-safe-url": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/jsc-safe-url/-/jsc-safe-url-0.2.4.tgz",
+ "integrity": "sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==",
+ "license": "0BSD"
+ },
+ "node_modules/jsesc": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
+ "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
+ "license": "MIT",
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "license": "MIT",
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/kleur": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
+ "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/lan-network": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/lan-network/-/lan-network-0.2.1.tgz",
+ "integrity": "sha512-ONPnazC96VKDntab9j9JKwIWhZ4ZUceB4A9Epu4Ssg0hYFmtHZSeQ+n15nIwTFmcBUKtExOer8WTJ4GF9MO64A==",
+ "license": "MIT",
+ "bin": {
+ "lan-network": "dist/lan-network-cli.js"
+ }
+ },
+ "node_modules/leven": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
+ "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/lighthouse-logger": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.4.2.tgz",
+ "integrity": "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "debug": "^2.6.9",
+ "marky": "^1.2.2"
+ }
+ },
+ "node_modules/lighthouse-logger/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/lighthouse-logger/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "license": "MIT"
+ },
+ "node_modules/lightningcss": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz",
+ "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==",
+ "license": "MPL-2.0",
+ "dependencies": {
+ "detect-libc": "^2.0.3"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ },
+ "optionalDependencies": {
+ "lightningcss-android-arm64": "1.33.0",
+ "lightningcss-darwin-arm64": "1.33.0",
+ "lightningcss-darwin-x64": "1.33.0",
+ "lightningcss-freebsd-x64": "1.33.0",
+ "lightningcss-linux-arm-gnueabihf": "1.33.0",
+ "lightningcss-linux-arm64-gnu": "1.33.0",
+ "lightningcss-linux-arm64-musl": "1.33.0",
+ "lightningcss-linux-x64-gnu": "1.33.0",
+ "lightningcss-linux-x64-musl": "1.33.0",
+ "lightningcss-win32-arm64-msvc": "1.33.0",
+ "lightningcss-win32-x64-msvc": "1.33.0"
+ }
+ },
+ "node_modules/lightningcss-android-arm64": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz",
+ "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-darwin-arm64": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz",
+ "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-darwin-x64": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz",
+ "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-freebsd-x64": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz",
+ "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-arm-gnueabihf": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz",
+ "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-arm64-gnu": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz",
+ "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==",
+ "cpu": [
+ "arm64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-arm64-musl": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz",
+ "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "libc": [
+ "musl"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-x64-gnu": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz",
+ "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==",
+ "cpu": [
+ "x64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-x64-musl": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz",
+ "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==",
+ "cpu": [
+ "x64"
+ ],
+ "libc": [
+ "musl"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-win32-arm64-msvc": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz",
+ "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-win32-x64-msvc": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz",
+ "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lodash.debounce": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
+ "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==",
+ "license": "MIT"
+ },
+ "node_modules/lodash.throttle": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz",
+ "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==",
+ "license": "MIT"
+ },
+ "node_modules/log-symbols": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz",
+ "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==",
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/log-symbols/node_modules/ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/log-symbols/node_modules/chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/log-symbols/node_modules/color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "1.1.3"
+ }
+ },
+ "node_modules/log-symbols/node_modules/color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
+ "license": "MIT"
+ },
+ "node_modules/log-symbols/node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/log-symbols/node_modules/has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/log-symbols/node_modules/supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/loose-envify": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+ "license": "MIT",
+ "dependencies": {
+ "js-tokens": "^3.0.0 || ^4.0.0"
+ },
+ "bin": {
+ "loose-envify": "cli.js"
+ }
+ },
+ "node_modules/lru-cache": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^3.0.2"
+ }
+ },
+ "node_modules/makeerror": {
+ "version": "1.0.12",
+ "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz",
+ "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "tmpl": "1.0.5"
+ }
+ },
+ "node_modules/marky": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/marky/-/marky-1.3.0.tgz",
+ "integrity": "sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ==",
+ "license": "Apache-2.0"
+ },
+ "node_modules/memoize-one": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz",
+ "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==",
+ "license": "MIT"
+ },
+ "node_modules/merge-options": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/merge-options/-/merge-options-3.0.4.tgz",
+ "integrity": "sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ==",
+ "license": "MIT",
+ "dependencies": {
+ "is-plain-obj": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/merge-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+ "license": "MIT"
+ },
+ "node_modules/metro": {
+ "version": "0.84.5",
+ "resolved": "https://registry.npmjs.org/metro/-/metro-0.84.5.tgz",
+ "integrity": "sha512-r1liLkyFZMVSEMNjU1CJU5pRzs3NdkxHqXS60O25c0rCIqAR+cGk7rPydw/g0WAIKVXojIBIF45yYBPagJGcgw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.29.0",
+ "@babel/core": "^7.25.2",
+ "@babel/generator": "^7.29.1",
+ "@babel/parser": "^7.29.0",
+ "@babel/template": "^7.28.6",
+ "@babel/traverse": "^7.29.0",
+ "@babel/types": "^7.29.0",
+ "accepts": "^2.0.0",
+ "ci-info": "^2.0.0",
+ "connect": "^3.6.5",
+ "debug": "^4.4.0",
+ "error-stack-parser": "^2.0.6",
+ "flow-enums-runtime": "^0.0.6",
+ "graceful-fs": "^4.2.4",
+ "hermes-parser": "0.35.0",
+ "invariant": "^2.2.4",
+ "jest-worker": "^29.7.0",
+ "jsc-safe-url": "^0.2.2",
+ "lodash.throttle": "^4.1.1",
+ "metro-babel-transformer": "0.84.5",
+ "metro-cache": "0.84.5",
+ "metro-cache-key": "0.84.5",
+ "metro-config": "0.84.5",
+ "metro-core": "0.84.5",
+ "metro-file-map": "0.84.5",
+ "metro-resolver": "0.84.5",
+ "metro-runtime": "0.84.5",
+ "metro-source-map": "0.84.5",
+ "metro-symbolicate": "0.84.5",
+ "metro-transform-plugins": "0.84.5",
+ "metro-transform-worker": "0.84.5",
+ "mime-types": "^3.0.1",
+ "nullthrows": "^1.1.1",
+ "serialize-error": "^2.1.0",
+ "source-map": "^0.5.6",
+ "throat": "^5.0.0",
+ "ws": "^7.5.10",
+ "yargs": "^17.6.2"
+ },
+ "bin": {
+ "metro": "src/cli.js"
+ },
+ "engines": {
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
+ }
+ },
+ "node_modules/metro-babel-transformer": {
+ "version": "0.84.5",
+ "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.84.5.tgz",
+ "integrity": "sha512-2WbHILKMiJUzfdjmGOQOqU1bWi9//gqiclc/tkk/AIsrrVw3efhZ1uhkOwMTxUEPOzqoo091H0olLmVZH5FHGQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.25.2",
+ "flow-enums-runtime": "^0.0.6",
+ "hermes-parser": "0.35.0",
+ "metro-cache-key": "0.84.5",
+ "nullthrows": "^1.1.1"
+ },
+ "engines": {
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
+ }
+ },
+ "node_modules/metro-cache": {
+ "version": "0.84.5",
+ "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.84.5.tgz",
+ "integrity": "sha512-WHS0n2OxQqtwEjSeQFPePNrMvEFhmQcUQM9cRJMHByWoi/GMWFBEWOf7hVkAM/0KRutAXNbDlSu/cZB6CyxgQQ==",
+ "license": "MIT",
+ "dependencies": {
+ "exponential-backoff": "^3.1.1",
+ "flow-enums-runtime": "^0.0.6",
+ "https-proxy-agent": "^7.0.5",
+ "metro-core": "0.84.5"
+ },
+ "engines": {
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
+ }
+ },
+ "node_modules/metro-cache-key": {
+ "version": "0.84.5",
+ "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.84.5.tgz",
+ "integrity": "sha512-3dPB2TnvGjjf0/9O7AXVQURKXuQNauTZE7WpTGTlR017Gh/B5y0m/2wcqxfveUguHSpu89KhVxCAlr2k/H7uhQ==",
+ "license": "MIT",
+ "dependencies": {
+ "flow-enums-runtime": "^0.0.6"
+ },
+ "engines": {
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
+ }
+ },
+ "node_modules/metro-config": {
+ "version": "0.84.5",
+ "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.84.5.tgz",
+ "integrity": "sha512-zie+uN6oohscowi2S7ByU+wUw6CrT4ZxW9uAbONOObSxx86RGmnIAmjXHLkfmcdYoY7jzOPEbqcI6oeVmqyBQA==",
+ "license": "MIT",
+ "dependencies": {
+ "connect": "^3.6.5",
+ "flow-enums-runtime": "^0.0.6",
+ "jest-validate": "^29.7.0",
+ "metro": "0.84.5",
+ "metro-cache": "0.84.5",
+ "metro-core": "0.84.5",
+ "metro-runtime": "0.84.5",
+ "yaml": "^2.6.1"
+ },
+ "engines": {
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
+ }
+ },
+ "node_modules/metro-core": {
+ "version": "0.84.5",
+ "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.84.5.tgz",
+ "integrity": "sha512-xwm605hCi5Y6eJTTb8ZWo6pkUcoBEIyiQOfkZh5GwtDwUrP9SNhTQZhzJHrBCwwxlf3Ptl/pxWJgQ1rsNYMnrA==",
+ "license": "MIT",
+ "dependencies": {
+ "flow-enums-runtime": "^0.0.6",
+ "lodash.throttle": "^4.1.1",
+ "metro-resolver": "0.84.5"
+ },
+ "engines": {
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
+ }
+ },
+ "node_modules/metro-file-map": {
+ "version": "0.84.5",
+ "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.84.5.tgz",
+ "integrity": "sha512-mlm/JL8toSbSc2akpKIGmzvrVRSCgZ5vkbycI34oMLoOnLGuLyC8WTyVJ6P0hZG/usDaGwZSl/s9BCRriqjGJA==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.4.0",
+ "fb-watchman": "^2.0.0",
+ "flow-enums-runtime": "^0.0.6",
+ "graceful-fs": "^4.2.4",
+ "invariant": "^2.2.4",
+ "jest-worker": "^29.7.0",
+ "micromatch": "^4.0.4",
+ "nullthrows": "^1.1.1",
+ "walker": "^1.0.7"
+ },
+ "engines": {
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
+ }
+ },
+ "node_modules/metro-minify-terser": {
+ "version": "0.84.5",
+ "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.84.5.tgz",
+ "integrity": "sha512-BJoFwCEDsYnagPqarayInv2+diCDNDdLlaof/p6s9w4gh+gc9HXYM+pDvsKGKKUumpZswNF3Z/ftTMqKl/5IBg==",
+ "license": "MIT",
+ "dependencies": {
+ "flow-enums-runtime": "^0.0.6",
+ "terser": "^5.15.0"
+ },
+ "engines": {
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
+ }
+ },
+ "node_modules/metro-resolver": {
+ "version": "0.84.5",
+ "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.84.5.tgz",
+ "integrity": "sha512-VSSnepg1k6LyCwtb6eirWdAWlpKwBG8Rdtsr1mU38rMelFyWgh3/QuMSiZIZAIjwg/fsa8GhW5/FO54CAUPCEA==",
+ "license": "MIT",
+ "dependencies": {
+ "flow-enums-runtime": "^0.0.6"
+ },
+ "engines": {
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
+ }
+ },
+ "node_modules/metro-runtime": {
+ "version": "0.84.5",
+ "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.84.5.tgz",
+ "integrity": "sha512-U1m2+d1Pr+JO2/iVXBB2OfXXityz7tqwIorxfrT15IEgaHvpJBq/OHiqnOWPKJbUl3JcxjcdviZZOKk85oK4Qg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.25.0",
+ "flow-enums-runtime": "^0.0.6"
+ },
+ "engines": {
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
+ }
+ },
+ "node_modules/metro-source-map": {
+ "version": "0.84.5",
+ "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.84.5.tgz",
+ "integrity": "sha512-2BtV5L9uPc49F13Gn5wiP6bX/EncqzqTIk2VL/0F/96Vo0YEOjluT/qktQjFODfqGFsucwnh5mPEAl/2jVEfeg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/traverse": "^7.29.0",
+ "@babel/types": "^7.29.0",
+ "flow-enums-runtime": "^0.0.6",
+ "invariant": "^2.2.4",
+ "metro-symbolicate": "0.84.5",
+ "nullthrows": "^1.1.1",
+ "ob1": "0.84.5",
+ "source-map": "^0.5.6",
+ "vlq": "^1.0.0"
+ },
+ "engines": {
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
+ }
+ },
+ "node_modules/metro-symbolicate": {
+ "version": "0.84.5",
+ "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.84.5.tgz",
+ "integrity": "sha512-rQ40zYDAkaWBN9yvjUuAD0ZpzBMZSoKyGYXnb5JrfbKjun7fTvfoLHL3KXFYenBTYZkQtlp4cKSCv/1utxFyOw==",
+ "license": "MIT",
+ "dependencies": {
+ "flow-enums-runtime": "^0.0.6",
+ "invariant": "^2.2.4",
+ "metro-source-map": "0.84.5",
+ "nullthrows": "^1.1.1",
+ "source-map": "^0.5.6",
+ "vlq": "^1.0.0"
+ },
+ "bin": {
+ "metro-symbolicate": "src/index.js"
+ },
+ "engines": {
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
+ }
+ },
+ "node_modules/metro-transform-plugins": {
+ "version": "0.84.5",
+ "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.84.5.tgz",
+ "integrity": "sha512-+InaSVGaOyt0DyRo4Y/zIdPI6CZwnbNho5LAL23tgmuGwv7fyfkF7kKfPjZcfxXBcoYdTLLFnCfCH/dHSiCqNg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.25.2",
+ "@babel/generator": "^7.29.1",
+ "@babel/template": "^7.28.6",
+ "@babel/traverse": "^7.29.0",
+ "flow-enums-runtime": "^0.0.6",
+ "nullthrows": "^1.1.1"
+ },
+ "engines": {
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
+ }
+ },
+ "node_modules/metro-transform-worker": {
+ "version": "0.84.5",
+ "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.84.5.tgz",
+ "integrity": "sha512-ui1Z8x4s5RL36gMmKLaMMO7O9NNDHNdthEZSCDQHAau3JcAsTaFOK6I+2q4I/kW5u8hSEjJk9L45TXSVJw6g1A==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.25.2",
+ "@babel/generator": "^7.29.1",
+ "@babel/parser": "^7.29.0",
+ "@babel/types": "^7.29.0",
+ "flow-enums-runtime": "^0.0.6",
+ "metro": "0.84.5",
+ "metro-babel-transformer": "0.84.5",
+ "metro-cache": "0.84.5",
+ "metro-cache-key": "0.84.5",
+ "metro-minify-terser": "0.84.5",
+ "metro-source-map": "0.84.5",
+ "metro-transform-plugins": "0.84.5",
+ "nullthrows": "^1.1.1"
+ },
+ "engines": {
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
+ }
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+ "license": "MIT",
+ "dependencies": {
+ "braces": "^3.0.3",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/mime": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+ "license": "MIT",
+ "bin": {
+ "mime": "cli.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/mime-db": {
+ "version": "1.54.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz",
+ "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz",
+ "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==",
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": "^1.54.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/mimic-fn": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
+ "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "10.2.6",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz",
+ "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==",
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "brace-expansion": "^5.0.8"
+ },
+ "engines": {
+ "node": "18 || 20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/minipass": {
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz",
+ "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==",
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
+ "node_modules/mkdirp": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+ "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+ "license": "MIT",
+ "bin": {
+ "mkdirp": "bin/cmd.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "license": "MIT"
+ },
+ "node_modules/multitars": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/multitars/-/multitars-1.0.2.tgz",
+ "integrity": "sha512-6GwVw5eLi9sThdtlS4PKwC7yRLaf45pYhIEzKBHdKxi+YOXGKFX8acIniH+Uh/+k9mS2lQOupTccjoe5r0/1IQ==",
+ "license": "MIT"
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.19",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.19.tgz",
+ "integrity": "sha512-Y2tUNy4ouw6tq5oDSKeQYGOyhkUBhNOcGV/02KC+6kd9eDGqdZd++mjMiIDilrBYvjEnCYvVtsuHCuP+okSfug==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/negotiator": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.1.0.tgz",
+ "integrity": "sha512-NMPBRMJgiQHjbd8phG3Vebdx4kZ1H121rbl5IkMqeOsahptB9BKo/d7oJ3zTXqTgagn2bWlNSXkh0QUGM31RYg==",
+ "license": "MIT",
+ "dependencies": {
+ "content-type": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/node-forge": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.4.0.tgz",
+ "integrity": "sha512-LarFH0+6VfriEhqMMcLX2F7SwSXeWwnEAJEsYm5QKWchiVYVvJyV9v7UDvUv+w5HO23ZpQTXDv/GxdDdMyOuoQ==",
+ "license": "(BSD-3-Clause OR GPL-2.0)",
+ "engines": {
+ "node": ">= 6.13.0"
+ }
+ },
+ "node_modules/node-int64": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
+ "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==",
+ "license": "MIT"
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.56",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.56.tgz",
+ "integrity": "sha512-x0InOIyzgdk+eyaWaRJFH5snEtiImgBgblZ2CyPrLmqqcuMQkEvcDPHbzqbD8eDsSeJbVOjn+crzyzHaM4D+/A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/npm-package-arg": {
+ "version": "11.0.3",
+ "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.3.tgz",
+ "integrity": "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==",
+ "license": "ISC",
+ "dependencies": {
+ "hosted-git-info": "^7.0.0",
+ "proc-log": "^4.0.0",
+ "semver": "^7.3.5",
+ "validate-npm-package-name": "^5.0.0"
+ },
+ "engines": {
+ "node": "^16.14.0 || >=18.0.0"
+ }
+ },
+ "node_modules/nullthrows": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz",
+ "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==",
+ "license": "MIT"
+ },
+ "node_modules/ob1": {
+ "version": "0.84.5",
+ "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.84.5.tgz",
+ "integrity": "sha512-aH9RkoZc7w/90HBamFxTw8ZLFr05wXS+iOnvmrgo53Ep8Pyrm5FieQSaPIVROkfFVQISeD/zo92fes26TOwe+A==",
+ "license": "MIT",
+ "dependencies": {
+ "flow-enums-runtime": "^0.0.6"
+ },
+ "engines": {
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
+ }
+ },
+ "node_modules/on-finished": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
+ "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==",
+ "license": "MIT",
+ "dependencies": {
+ "ee-first": "1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/on-headers": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz",
+ "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/onetime": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
+ "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==",
+ "license": "MIT",
+ "dependencies": {
+ "mimic-fn": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/open": {
+ "version": "7.4.2",
+ "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz",
+ "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==",
+ "license": "MIT",
+ "dependencies": {
+ "is-docker": "^2.0.0",
+ "is-wsl": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ora": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/ora/-/ora-3.4.0.tgz",
+ "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==",
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "^2.4.2",
+ "cli-cursor": "^2.1.0",
+ "cli-spinners": "^2.0.0",
+ "log-symbols": "^2.2.0",
+ "strip-ansi": "^5.2.0",
+ "wcwidth": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/ora/node_modules/ansi-regex": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz",
+ "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/ora/node_modules/ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/ora/node_modules/chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/ora/node_modules/color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "1.1.3"
+ }
+ },
+ "node_modules/ora/node_modules/color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
+ "license": "MIT"
+ },
+ "node_modules/ora/node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/ora/node_modules/has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/ora/node_modules/strip-ansi": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+ "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/ora/node_modules/supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/parse-png": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/parse-png/-/parse-png-2.1.0.tgz",
+ "integrity": "sha512-Nt/a5SfCLiTnQAjx3fHlqp8hRgTL3z7kTQZzvIMS9uCAepnCyjpdEc6M/sz69WqMBdaDBw9sF1F1UaHROYzGkQ==",
+ "license": "MIT",
+ "dependencies": {
+ "pngjs": "^3.3.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/parseurl": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+ "license": "MIT"
+ },
+ "node_modules/path-scurry": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz",
+ "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==",
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "lru-cache": "^11.0.0",
+ "minipass": "^7.1.2"
+ },
+ "engines": {
+ "node": "18 || 20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/path-scurry/node_modules/lru-cache": {
+ "version": "11.5.2",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz",
+ "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==",
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": "20 || >=22"
+ }
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "license": "ISC"
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
+ "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/plist": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.1.tgz",
+ "integrity": "sha512-ZIfcLJC+7E7FBFnDxm9MPmt7D+DidyQ26lewieO75AdhA2ayMtsJSES0iWzqJQbcVRSrTufQoy0DR94xHue0oA==",
+ "license": "MIT",
+ "dependencies": {
+ "@xmldom/xmldom": "^0.9.10",
+ "base64-js": "^1.5.1",
+ "xmlbuilder": "^15.1.1"
+ },
+ "engines": {
+ "node": ">=10.4.0"
+ }
+ },
+ "node_modules/plist/node_modules/@xmldom/xmldom": {
+ "version": "0.9.12",
+ "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.9.12.tgz",
+ "integrity": "sha512-5AXjrcMClTryPe9LgZrygpB1lj7s0S9E0+W+AHaVKAVyHanafK86iPSvG5xHVSp/jC+VH1UXu0TAEmY279xH7A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.6"
+ }
+ },
+ "node_modules/pngjs": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz",
+ "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.5.28",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.28.tgz",
+ "integrity": "sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "nanoid": "^3.3.18",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/pretty-format": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
+ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/schemas": "^29.6.3",
+ "ansi-styles": "^5.0.0",
+ "react-is": "^18.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/pretty-format/node_modules/ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/proc-log": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz",
+ "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==",
+ "license": "ISC",
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/progress": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
+ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/promise": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz",
+ "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==",
+ "license": "MIT",
+ "dependencies": {
+ "asap": "~2.0.6"
+ }
+ },
+ "node_modules/prompts": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz",
+ "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==",
+ "license": "MIT",
+ "dependencies": {
+ "kleur": "^3.0.3",
+ "sisteransi": "^1.0.5"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/range-parser": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/react": {
+ "version": "19.2.3",
+ "resolved": "https://registry.npmjs.org/react/-/react-19.2.3.tgz",
+ "integrity": "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-devtools-core": {
+ "version": "6.1.5",
+ "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-6.1.5.tgz",
+ "integrity": "sha512-ePrwPfxAnB+7hgnEr8vpKxL9cmnp7F322t8oqcPshbIQQhDKgFDW4tjhF2wjVbdXF9O/nyuy3sQWd9JGpiLPvA==",
+ "license": "MIT",
+ "dependencies": {
+ "shell-quote": "^1.6.1",
+ "ws": "^7"
+ }
+ },
+ "node_modules/react-is": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
+ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
+ "license": "MIT"
+ },
+ "node_modules/react-native": {
+ "version": "0.86.3",
+ "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.86.3.tgz",
+ "integrity": "sha512-JR5s3bM9ezud+Mw24GlNXNfthqPIKwrQgPPJcam+L97t2sKjjEavhCzBn+fyqZZRcM5+XlhYxpTxVkK7e1n38Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@react-native/assets-registry": "0.86.3",
+ "@react-native/codegen": "0.86.3",
+ "@react-native/community-cli-plugin": "0.86.3",
+ "@react-native/gradle-plugin": "0.86.3",
+ "@react-native/js-polyfills": "0.86.3",
+ "@react-native/normalize-colors": "0.86.3",
+ "@react-native/virtualized-lists": "0.86.3",
+ "abort-controller": "^3.0.0",
+ "anser": "^1.4.9",
+ "ansi-regex": "^5.0.0",
+ "babel-plugin-syntax-hermes-parser": "0.36.0",
+ "base64-js": "^1.5.1",
+ "commander": "^12.0.0",
+ "flow-enums-runtime": "^0.0.6",
+ "hermes-compiler": "250829098.0.17",
+ "invariant": "^2.2.4",
+ "memoize-one": "^5.0.0",
+ "metro-runtime": "^0.84.3",
+ "metro-source-map": "^0.84.3",
+ "nullthrows": "^1.1.1",
+ "pretty-format": "^29.7.0",
+ "promise": "^8.3.0",
+ "react-devtools-core": "^6.1.5",
+ "react-refresh": "^0.14.0",
+ "regenerator-runtime": "^0.13.2",
+ "scheduler": "0.27.0",
+ "semver": "^7.1.3",
+ "stacktrace-parser": "^0.1.10",
+ "tinyglobby": "^0.2.15",
+ "whatwg-fetch": "^3.0.0",
+ "ws": "^7.5.10",
+ "yargs": "^17.6.2"
+ },
+ "bin": {
+ "react-native": "cli.js"
+ },
+ "engines": {
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
+ },
+ "peerDependencies": {
+ "@react-native/jest-preset": "0.86.3",
+ "@types/react": "^19.1.1",
+ "react": "^19.2.3"
+ },
+ "peerDependenciesMeta": {
+ "@react-native/jest-preset": {
+ "optional": true
+ },
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/react-native/node_modules/commander": {
+ "version": "12.1.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz",
+ "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/react-refresh": {
+ "version": "0.14.2",
+ "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz",
+ "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/regenerate": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
+ "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==",
+ "license": "MIT"
+ },
+ "node_modules/regenerate-unicode-properties": {
+ "version": "10.2.2",
+ "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz",
+ "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==",
+ "license": "MIT",
+ "dependencies": {
+ "regenerate": "^1.4.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/regenerator-runtime": {
+ "version": "0.13.11",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
+ "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==",
+ "license": "MIT"
+ },
+ "node_modules/regexpu-core": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz",
+ "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==",
+ "license": "MIT",
+ "dependencies": {
+ "regenerate": "^1.4.2",
+ "regenerate-unicode-properties": "^10.2.2",
+ "regjsgen": "^0.8.0",
+ "regjsparser": "^0.13.0",
+ "unicode-match-property-ecmascript": "^2.0.0",
+ "unicode-match-property-value-ecmascript": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/regjsgen": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz",
+ "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==",
+ "license": "MIT"
+ },
+ "node_modules/regjsparser": {
+ "version": "0.13.3",
+ "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.3.tgz",
+ "integrity": "sha512-ycwFAS14Jw4mppvmK4GR/J6u3WpWpjkEApehuHtLc/8VpPNpDMbQ4WjqwplXifGeyKOzHSFLmSPqzksDQE2Sfg==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "jsesc": "~3.1.0"
+ },
+ "bin": {
+ "regjsparser": "bin/parser"
+ }
+ },
+ "node_modules/require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/resolve": {
+ "version": "1.22.12",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz",
+ "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "is-core-module": "^2.16.1",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/resolve-from": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/resolve-workspace-root": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/resolve-workspace-root/-/resolve-workspace-root-2.0.1.tgz",
+ "integrity": "sha512-nR23LHAvaI6aHtMg6RWoaHpdR4D881Nydkzi2CixINyg9T00KgaJdJI6Vwty+Ps8WLxZHuxsS0BseWjxSA4C+w==",
+ "license": "MIT"
+ },
+ "node_modules/restore-cursor": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
+ "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==",
+ "license": "MIT",
+ "dependencies": {
+ "onetime": "^2.0.0",
+ "signal-exit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/sandbox-cli-detector": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/sandbox-cli-detector/-/sandbox-cli-detector-0.2.0.tgz",
+ "integrity": "sha512-4lyHX0ZU0AZKwjgZ1InxZAa3PNpyEb8rOQ+Zss1ReYmhNzW0Q+h1zE5nvniXN0HaAWZaZE1zgVNEirb0R7LmNg==",
+ "license": "MIT",
+ "bin": {
+ "sandbox-cli-detector": "dist/cli.js"
+ },
+ "engines": {
+ "node": ">=18.18"
+ }
+ },
+ "node_modules/sax": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.1.tgz",
+ "integrity": "sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==",
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": ">=11.0.0"
+ }
+ },
+ "node_modules/scheduler": {
+ "version": "0.27.0",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz",
+ "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==",
+ "license": "MIT"
+ },
+ "node_modules/semver": {
+ "version": "7.8.5",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz",
+ "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/send": {
+ "version": "0.19.2",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz",
+ "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "destroy": "1.2.0",
+ "encodeurl": "~2.0.0",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "fresh": "~0.5.2",
+ "http-errors": "~2.0.1",
+ "mime": "1.6.0",
+ "ms": "2.1.3",
+ "on-finished": "~2.4.1",
+ "range-parser": "~1.2.1",
+ "statuses": "~2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/send/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/send/node_modules/debug/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "license": "MIT"
+ },
+ "node_modules/send/node_modules/encodeurl": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
+ "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/send/node_modules/on-finished": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
+ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
+ "license": "MIT",
+ "dependencies": {
+ "ee-first": "1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/send/node_modules/statuses": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz",
+ "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/serialize-error": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz",
+ "integrity": "sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/serve-static": {
+ "version": "1.16.3",
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz",
+ "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==",
+ "license": "MIT",
+ "dependencies": {
+ "encodeurl": "~2.0.0",
+ "escape-html": "~1.0.3",
+ "parseurl": "~1.3.3",
+ "send": "~0.19.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/serve-static/node_modules/encodeurl": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
+ "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/setprototypeof": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
+ "license": "ISC"
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "license": "MIT",
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shell-quote": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.10.0.tgz",
+ "integrity": "sha512-w1aiOKwKuRgtwAReIIj89puqg+I7GvX4IbLrvmhXbzQsj1+Zwi4VO3+fa6ZF91TWSjIxoEkKnMeHcLEODK5ZXA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "license": "ISC"
+ },
+ "node_modules/simple-plist": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/simple-plist/-/simple-plist-1.3.1.tgz",
+ "integrity": "sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw==",
+ "license": "MIT",
+ "dependencies": {
+ "bplist-creator": "0.1.0",
+ "bplist-parser": "0.3.1",
+ "plist": "^3.0.5"
+ }
+ },
+ "node_modules/sisteransi": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
+ "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==",
+ "license": "MIT"
+ },
+ "node_modules/slugify": {
+ "version": "1.6.9",
+ "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.9.tgz",
+ "integrity": "sha512-vZ7rfeehZui7wQs438JXBckYLkIIdfHOXsaVEUMyS5fHo1483l1bMdo0EDSWYclY0yZKFOipDy4KHuKs6ssvdg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/source-map-support": {
+ "version": "0.5.21",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
+ "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+ "license": "MIT",
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
+ }
+ },
+ "node_modules/source-map-support/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/stackframe": {
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz",
+ "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==",
+ "license": "MIT"
+ },
+ "node_modules/stacktrace-parser": {
+ "version": "0.1.11",
+ "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.11.tgz",
+ "integrity": "sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==",
+ "license": "MIT",
+ "dependencies": {
+ "type-fest": "^0.7.1"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/statuses": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
+ "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/stream-buffers": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz",
+ "integrity": "sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==",
+ "license": "Unlicense",
+ "engines": {
+ "node": ">= 0.10.0"
+ }
+ },
+ "node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/structured-headers": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/structured-headers/-/structured-headers-0.4.1.tgz",
+ "integrity": "sha512-0MP/Cxx5SzeeZ10p/bZI0S6MpgD+yxAhi1BOQ34jgnMXsCq3j1t6tQnZu+KdlL7dvJTLT3g9xN8tl10TqgFMcg==",
+ "license": "MIT"
+ },
+ "node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/supports-hyperlinks": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz",
+ "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==",
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0",
+ "supports-color": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/terminal-link": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz",
+ "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-escapes": "^4.2.1",
+ "supports-hyperlinks": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/terser": {
+ "version": "5.51.2",
+ "resolved": "https://registry.npmjs.org/terser/-/terser-5.51.2.tgz",
+ "integrity": "sha512-bWnjSNscmuI+GJze6ZupnHP8G/cTcsJF+bXCeQknk2SHQsgbNJnLrqiH9jZ2W4STPVXH2mDKKRX3iwPhc9Cn/Q==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "@jridgewell/source-map": "^0.3.3",
+ "acorn": "^8.15.0",
+ "commander": "^2.20.0",
+ "source-map-support": "~0.5.20"
+ },
+ "bin": {
+ "terser": "bin/terser"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/terser/node_modules/commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+ "license": "MIT"
+ },
+ "node_modules/throat": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz",
+ "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==",
+ "license": "MIT"
+ },
+ "node_modules/tinyglobby": {
+ "version": "0.2.17",
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz",
+ "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==",
+ "license": "MIT",
+ "dependencies": {
+ "fdir": "^6.5.0",
+ "picomatch": "^4.0.4"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/SuperchupuDev"
+ }
+ },
+ "node_modules/tinyglobby/node_modules/fdir": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
+ "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "picomatch": "^3 || ^4"
+ },
+ "peerDependenciesMeta": {
+ "picomatch": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/tinyglobby/node_modules/picomatch": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz",
+ "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/tmpl": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz",
+ "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "license": "MIT",
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/toidentifier": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
+ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
+ "node_modules/toqr": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/toqr/-/toqr-0.1.1.tgz",
+ "integrity": "sha512-FWAPzCIHZHnrE/5/w9MPk0kK25hSQSH2IKhYh9PyjS3SG/+IEMvlwIHbhz+oF7xl54I+ueZlVnMjyzdSwLmAwA==",
+ "license": "MIT"
+ },
+ "node_modules/type-fest": {
+ "version": "0.7.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz",
+ "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==",
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/undici-types": {
+ "version": "8.9.0",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.9.0.tgz",
+ "integrity": "sha512-KTDyRTYX8sWmKXAikPHHSyc63CRPETMctyjKFupcC6OBLXT3xsN0e9aF7m+mIXutFWpUXuedtowG7iLOzp0kQg==",
+ "license": "MIT"
+ },
+ "node_modules/unicode-canonical-property-names-ecmascript": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz",
+ "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-match-property-ecmascript": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz",
+ "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==",
+ "license": "MIT",
+ "dependencies": {
+ "unicode-canonical-property-names-ecmascript": "^2.0.0",
+ "unicode-property-aliases-ecmascript": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-match-property-value-ecmascript": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz",
+ "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-property-aliases-ecmascript": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz",
+ "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unpipe": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/update-browserslist-db": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.3.tgz",
+ "integrity": "sha512-pJ2sYawQS0R/WI928Gj5GlPhTGzbMelq0+4INtSYNDV9ErKJcX6xjGWkoG/VnB3dpUm00zALaqkrUD77pO5TDQ==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "escalade": "^3.2.0",
+ "picocolors": "^1.1.1"
+ },
+ "bin": {
+ "update-browserslist-db": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
+ }
+ },
+ "node_modules/utils-merge": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
+ "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/uuid": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz",
+ "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).",
+ "license": "MIT",
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
+ "node_modules/validate-npm-package-name": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz",
+ "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==",
+ "license": "ISC",
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/vary": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/vlq": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz",
+ "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==",
+ "license": "MIT"
+ },
+ "node_modules/walker": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz",
+ "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "makeerror": "1.0.12"
+ }
+ },
+ "node_modules/wcwidth": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
+ "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==",
+ "license": "MIT",
+ "dependencies": {
+ "defaults": "^1.0.3"
+ }
+ },
+ "node_modules/whatwg-fetch": {
+ "version": "3.6.20",
+ "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz",
+ "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==",
+ "license": "MIT"
+ },
+ "node_modules/whatwg-url-minimum": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/whatwg-url-minimum/-/whatwg-url-minimum-0.1.2.tgz",
+ "integrity": "sha512-XPEm0XFQWNVG292lII1PrRRJl3sItrs7CettZ4ncYxuDVpLyy+NwlGyut2hXI0JswcJUxeCH+CyOJK0ZzAXD6A==",
+ "license": "MIT"
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/ws": {
+ "version": "7.5.13",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.13.tgz",
+ "integrity": "sha512-rsKI6xDBFVf4r/x8XyChGK04QR/XHroxs/jUcoWvtEZM8TPU/X/uIY9B1CsSzYws9ZJb/6bbBu7dPhFW00CAoA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.3.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": "^5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/xcode": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/xcode/-/xcode-3.0.1.tgz",
+ "integrity": "sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "simple-plist": "^1.1.0",
+ "uuid": "^7.0.3"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/xml2js": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.0.tgz",
+ "integrity": "sha512-eLTh0kA8uHceqesPqSE+VvO1CDDJWMwlQfB6LuN6T8w6MaDJ8Txm8P7s5cHD0miF0V+GGTZrDQfxPZQVsur33w==",
+ "license": "MIT",
+ "dependencies": {
+ "sax": ">=0.6.0",
+ "xmlbuilder": "~11.0.0"
+ },
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/xml2js/node_modules/xmlbuilder": {
+ "version": "11.0.1",
+ "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz",
+ "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/xmlbuilder": {
+ "version": "15.1.1",
+ "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz",
+ "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yallist": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+ "license": "ISC"
+ },
+ "node_modules/yaml": {
+ "version": "2.9.1",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.1.tgz",
+ "integrity": "sha512-3NxN8+78OdzbT7C/WjGsyfPAtJaN3FNDsWxv7Y7mcDsT/oOmgW8BpyQQFFBnvZE3j9Y2Sdz1ULFLezL7Eb2yFw==",
+ "license": "ISC",
+ "bin": {
+ "yaml": "bin.mjs"
+ },
+ "engines": {
+ "node": ">= 14.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/eemeli"
+ }
+ },
+ "node_modules/yargs": {
+ "version": "17.7.3",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.3.tgz",
+ "integrity": "sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==",
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^8.0.1",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.3",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^21.1.1"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/yargs-parser": {
+ "version": "21.1.1",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
+ "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/zod": {
+ "version": "3.25.76",
+ "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
+ "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/colinhacks"
+ }
+ }
+ }
+}
diff --git a/examples/mobile-app/package.json b/examples/mobile-app/package.json
new file mode 100644
index 0000000..a208455
--- /dev/null
+++ b/examples/mobile-app/package.json
@@ -0,0 +1,19 @@
+{
+ "name": "mobile-app",
+ "version": "1.0.0",
+ "main": "index.js",
+ "dependencies": {
+ "@react-native-async-storage/async-storage": "2.2.0",
+ "expo": "~57.0.24",
+ "expo-status-bar": "~57.0.1",
+ "react": "19.2.3",
+ "react-native": "0.86.3"
+ },
+ "scripts": {
+ "start": "expo start",
+ "android": "expo run:android",
+ "ios": "expo run:ios",
+ "web": "expo start --web"
+ },
+ "private": true
+}
diff --git a/examples/mobile-app/with-lab-network.js b/examples/mobile-app/with-lab-network.js
new file mode 100644
index 0000000..f4f67be
--- /dev/null
+++ b/examples/mobile-app/with-lab-network.js
@@ -0,0 +1,6 @@
+// Only the owned fixture talks to the local evaluator over HTTP.
+const {withAndroidManifest}=require('expo/config-plugins');
+module.exports=config=>withAndroidManifest(config,config=>{
+ config.modResults.manifest.application[0].$['android:usesCleartextTraffic']='true';
+ return config;
+});
diff --git a/examples/mobile.cases b/examples/mobile.cases
new file mode 100644
index 0000000..e23ddd9
--- /dev/null
+++ b/examples/mobile.cases
@@ -0,0 +1,54 @@
+Case: Invalid login is rejected
+Goal: Verify that invalid credentials cannot sign in
+Step: Fill "Email" with @email
+Step: Fill "Password" with @invalidPassword
+Step: Tap "Sign in"
+Expect: text "Invalid credentials" is visible
+
+Case: Search filters the catalog
+Goal: Find the lamp and exclude unrelated products
+Step: Fill "Email" with @email
+Step: Fill "Password" with @password
+Step: Tap "Sign in"
+Expect: text "Find your favorite." is visible
+Step: Fill "Search products" with "lamp"
+Step: Dismiss keyboard
+Expect: text "Desk Lamp" is visible
+Expect: text "AirPods" is absent
+
+Case: Quantity updates the total
+Goal: Two lamps should cost 72
+Step: Fill "Email" with @email
+Step: Fill "Password" with @password
+Step: Tap "Sign in"
+Step: Tap "Open Desk Lamp"
+Step: Tap "Add to cart"
+Expect: text "Quantity: 1" is visible
+Step: Tap "Increase Desk Lamp quantity"
+Expect: text "Quantity: 2" is visible
+Expect: number in id "cart-total" equals 72
+
+Case: Removal empties the cart
+Goal: Remove a lamp and verify the empty state
+Step: Fill "Email" with @email
+Step: Fill "Password" with @password
+Step: Tap "Sign in"
+Step: Tap "Open Desk Lamp"
+Step: Tap "Add to cart"
+Expect: text "Desk Lamp" is visible
+Step: Tap "Remove Desk Lamp"
+Expect: text "Your cart is empty" is visible
+Expect: text "Desk Lamp" is absent
+
+Case: Cart persists after relaunch
+Goal: Restart the app and verify the saved cart
+Step: Fill "Email" with @email
+Step: Fill "Password" with @password
+Step: Tap "Sign in"
+Step: Tap "Open Desk Lamp"
+Step: Tap "Add to cart"
+Expect: text "Desk Lamp" is visible
+Step: Relaunch
+Step: Tap "Cart"
+Expect: text "Desk Lamp" is visible
+Expect: text "Quantity: 1" is visible
diff --git a/examples/mobile.fixtures.example.json b/examples/mobile.fixtures.example.json
new file mode 100644
index 0000000..83825d6
--- /dev/null
+++ b/examples/mobile.fixtures.example.json
@@ -0,0 +1,8 @@
+{
+ "inputs": {
+ "email": { "env": "E2E_TEST_EMAIL" },
+ "password": { "env": "E2E_TEST_PASSWORD" },
+ "invalidPassword": { "env": "E2E_TEST_INVALID_PASSWORD" }
+ },
+ "auth": {}
+}
diff --git a/package-lock.json b/package-lock.json
index cf7f77f..ec871cf 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -20,7 +20,10 @@
"typescript": "7.0.2"
},
"engines": {
- "node": ">=22"
+ "node": ">=22.12"
+ },
+ "optionalDependencies": {
+ "agent-device": "0.21.6"
}
},
"node_modules/@types/node": {
@@ -373,6 +376,27 @@
"node": ">=16.20.0"
}
},
+ "node_modules/agent-device": {
+ "version": "0.21.6",
+ "resolved": "https://registry.npmjs.org/agent-device/-/agent-device-0.21.6.tgz",
+ "integrity": "sha512-p0tYqpU0pATvcblhwmUaq4ayi7EQ74wU5lK5kceCrhF8R5nYqQe3OTA3cxpyN/seIRtRUgVLvpJbRB0CPkFauA==",
+ "license": "MIT",
+ "optional": true,
+ "bin": {
+ "agent-device": "bin/agent-device.mjs"
+ },
+ "engines": {
+ "node": ">=22.12"
+ },
+ "peerDependencies": {
+ "ai": "^6.0.0 || ^7.0.0"
+ },
+ "peerDependenciesMeta": {
+ "ai": {
+ "optional": true
+ }
+ }
+ },
"node_modules/playwright": {
"version": "1.63.0",
"resolved": "https://registry.npmjs.org/playwright/-/playwright-1.63.0.tgz",
diff --git a/package.json b/package.json
index 87f1792..c0a70f6 100644
--- a/package.json
+++ b/package.json
@@ -1,11 +1,11 @@
{
"name": "jev-e2e",
"version": "0.1.0-alpha.1",
- "description": "Test web apps from natural-language cases with Jev, Playwright, and checked evidence.",
+ "description": "Test websites and native mobile apps from natural-language cases with Jev and checked evidence.",
"license": "MIT",
"type": "module",
"engines": {
- "node": ">=22"
+ "node": ">=22.12"
},
"bin": {
"jev-e2e": "dist/cli.js"
@@ -20,6 +20,8 @@
"dist",
"public",
"examples",
+ "docs/MOBILE.md",
+ "MOBILE_TEST_RESULTS.md",
"README.md",
"CONTRIBUTING.md",
"TEST_RESULTS.md",
@@ -34,6 +36,9 @@
"check": "tsc --noEmit",
"test": "npm run build && node --test test/*.test.mjs",
"test:live": "npm run build && node scripts/evaluate.mjs",
+ "test:mobile": "npm run build && node scripts/evaluate-mobile.mjs",
+ "test:mobile:language": "npm run build && node scripts/evaluate-mobile-language.mjs",
+ "test:mobile:sdk": "npm run build && node test/mobile-live.mjs",
"ui": "node dist/cli.js ui",
"demo": "node dist/cli.js demo",
"prepack": "npm run build"
@@ -53,5 +58,8 @@
"bugs": {
"url": "https://github.com/perixtar/jev-e2e/issues"
},
- "homepage": "https://github.com/perixtar/jev-e2e#readme"
+ "homepage": "https://github.com/perixtar/jev-e2e#readme",
+ "optionalDependencies": {
+ "agent-device": "0.21.6"
+ }
}
diff --git a/public/app.js b/public/app.js
index 44f169c..ef5b11c 100644
--- a/public/app.js
+++ b/public/app.js
@@ -1,17 +1,32 @@
const $=id=>document.getElementById(id);let token='',jobId='',reviewed=null,savedPath='',source=null,busy=false;
+const mobileExample='Case: Cart survives restart\nGoal: Add a lamp and check persistence\nStep: Fill "Email" with @email\nStep: Fill "Password" with @password\nStep: Tap "Sign in"\nStep: Tap "Open Desk Lamp"\nStep: Tap "Add to cart"\nExpect: text "Desk Lamp" is visible\nStep: Relaunch\nStep: Tap "Cart"\nExpect: text "Desk Lamp" is visible';
const example='Case: Create and persist a project\nAuth: @signed-in\nGoal: Create project named "Acme"\nExpect: project named "Acme" exists exactly once after reload';
const node=(tag,text,cls)=>{const element=document.createElement(tag);if(text!==undefined)element.textContent=text;if(cls)element.className=cls;return element;};
async function post(path,data){const response=await fetch(path,{method:'POST',headers:{'Content-Type':'application/json','X-Jev-Token':token},body:JSON.stringify(data)});const result=await response.json();if(!response.ok)throw new Error(result.error??'Request failed.');return result;}
function status(text){$('status').textContent=text;}
-function controls(running){busy=running;for(const id of ['url','cases','planner','fixtures','saved','example','review'])$(id).disabled=running;$('stop').disabled=!running;$('run').disabled=running||!reviewed;$('save').disabled=running||!reviewed;}
-function clear(){reviewed=null;savedPath='';$('saved').value='';$('plan').replaceChildren();$('results').replaceChildren();$('empty').hidden=false;$('plan').hidden=true;$('results').hidden=true;$('report').hidden=true;$('save').disabled=true;$('run').disabled=true;status('Ready');}
-function expectation(assertion){const target=assertion.target;return `${assertion.kind} ${target?.text??'URL'}${target?.within?' within '+target.within:''} → ${JSON.stringify(assertion.expected)}`;}
-function showPlan(plan){reviewed=plan;$('empty').hidden=true;$('plan').hidden=false;$('plan').replaceChildren();for(const test of plan.cases){const card=node('article',undefined,'case-card');card.append(node('h3',test.name),node('p',test.goal));if(test.blockedReason)card.append(node('p','BLOCKED: '+test.blockedReason));const steps=node('ol');for(const step of test.steps)steps.append(node('li',`${step.action} ${step.target??'page'}${step.fixture?' with @'+step.fixture:step.value!==null?' with '+JSON.stringify(step.value):''}`));card.append(steps);for(const assertion of test.assertions)card.append(node('p',expectation(assertion),'expect'));$('plan').append(card);}}
-function showResult(result){$('empty').hidden=true;$('plan').hidden=true;$('results').hidden=false;$('results').replaceChildren();reviewed=result.plan;for(const test of result.cases){const card=node('article',undefined,'case-card');const title=node('h3');title.append(node('span',test.verdict,'verdict '+test.verdict),document.createTextNode(test.name));card.append(title,node('p',test.reason));for(const check of test.checks)card.append(node('p',`${check.passed?'✓':'✕'} ${expectation(check.assertion)} · observed ${JSON.stringify(check.observed)}`,'expect'));if(test.screenshot){const image=node('img');image.src=`/runs/${jobId}/${test.screenshot}`;image.alt='Masked final screenshot for '+test.name;image.loading='lazy';card.append(image);}$('results').append(card);}status(`${result.verdict} · ${(result.durationMs/1000).toFixed(1)}s · $${result.model.cost.toFixed(5)}`);$('report').href=`/runs/${jobId}/report.html`;$('report').hidden=false;}
-async function start(kind){try{controls(true);$('stop').disabled=true;$('log').hidden=false;$('log').textContent='';$('report').hidden=true;status(kind==='plan'?'Planning…':'Running…');const payload={url:$('url').value,casesText:$('cases').value,planner:$('planner').checked?'on':'off',fixtures:$('fixtures').value};if($('saved').value)payload.savedPath=$('saved').value;if(kind==='run')payload.reviewId=jobId;const job=await post('/api/'+kind,payload);jobId=job.id;$('stop').disabled=false;source?.close();source=new EventSource(`/api/jobs/${jobId}/events`);source.onmessage=async event=>{const update=JSON.parse(event.data);if(update.type==='done'){source.close();const data=await fetch(`/api/jobs/${jobId}/result`).then(response=>response.json());if(data.result)showResult(data.result);else if(data.plan){showPlan(data.plan);status(data.plan.cases.some(test=>test.blockedReason)?'Plan has blocked cases':'Ready to run');}else status('Blocked / canceled');controls(false);return;}$('log').textContent+=`${update.caseName?'['+update.caseName+'] ':''}${update.message}\n`;$('log').scrollTop=$('log').scrollHeight;status(update.type==='error'?'Blocked':update.message);};source.onerror=()=>{if(busy)status('Reconnecting to local job…');};}catch(error){status(error.message);controls(false);}}
-$('example').onclick=()=>{clear();$('cases').value=example;};$('cases').value=example;
-for(const id of ['url','cases','planner','fixtures'])$(id).addEventListener('input',clear);
+function controls(running){busy=running;for(const id of ['url','cases','planner','fixtures','saved','example','review','platform','app','device','record','devices'])$(id).disabled=running;$('stop').disabled=!running;$('run').disabled=running||!reviewed;$('save').disabled=running||!reviewed;}
+function clear(){reviewed=null;savedPath='';$('saved').value='';$('plan').replaceChildren();$('results').replaceChildren();$('empty').hidden=false;$('plan').hidden=true;$('results').hidden=true;$('report').hidden=true;$('live-preview').hidden=true;$('metrics').textContent='';$('device-list').hidden=true;$('save').disabled=true;$('run').disabled=true;status('Ready');}
+function expectation(assertion){const target=assertion.target;return `${assertion.afterStep!==undefined?'After step '+(assertion.afterStep+1)+': ':''}${assertion.kind} ${target?.text??'URL'}${target?.within?' within '+target.within:''} → ${JSON.stringify(assertion.expected)}`;}
+function showPlan(plan){reviewed=plan;$('empty').hidden=true;$('plan').hidden=false;$('plan').replaceChildren();for(const test of plan.cases){const card=node('article',undefined,'case-card');card.append(node('h3',test.name),node('p',test.goal));if(test.blockedReason)card.append(node('p','BLOCKED: '+test.blockedReason));const steps=node('ol');for(const step of test.steps)steps.append(node('li',`${step.action} ${step.target??(plan.version===2?'app':'page')}${step.fixture?' with @'+step.fixture:step.value!==null?' with '+JSON.stringify(step.value):''}`));card.append(steps);for(const assertion of test.assertions)card.append(node('p',expectation(assertion),'expect'));$('plan').append(card);}}
+function showResult(result){
+ $('empty').hidden=true;$('plan').hidden=true;$('results').hidden=false;$('results').replaceChildren();reviewed=result.plan;
+ for(const [index,test] of result.cases.entries()){
+ const card=node('article',undefined,'case-card'),title=node('h3');title.append(node('span',test.verdict,'verdict '+test.verdict),document.createTextNode(test.name));card.append(title,node('p',test.reason));for(const note of test.evidenceNotes??[])card.append(node('p',note,'hint'));
+ const remaining=[...test.checks];for(const assertion of result.plan.cases[index].assertions){const i=remaining.findIndex(c=>JSON.stringify(c.assertion)===JSON.stringify(assertion)),check=i<0?null:remaining.splice(i,1)[0];card.append(node('p',(check?(check.passed?'✓ PASS':'✕ FAIL'):'○ NOT CHECKED')+' · '+expectation(assertion)+' · observed '+(check?JSON.stringify(check.observed):'Not observed')+(check?.reason?' · '+check.reason:''),'expect'));}
+ const actions=node('details'),list=node('ol');actions.append(node('summary','Actions · '+(test.durationMs/1000).toFixed(1)+'s'));for(const action of test.actions)list.append(node('li','Step '+(action.step+1)+': '+action.action+' '+action.target+(action.replay?' · replay':'')+(action.outcome?' · '+action.outcome:'')));actions.append(list);card.append(actions);
+ if(test.video){const video=node('video');video.src='/runs/'+jobId+'/'+test.video;video.controls=true;video.preload='metadata';video.className='phone-preview';card.append(video,node('p',test.videoMetadata?JSON.stringify(test.videoMetadata):'Local recording','hint'));}
+ if(test.screenshot){const image=node('img');image.src='/runs/'+jobId+'/'+test.screenshot;image.alt='Eligible final screenshot for '+test.name;image.loading='lazy';if(result.version===2)image.className='phone-preview';card.append(image);}$('results').append(card);
+ }
+ const metadata=node('details');metadata.append(node('summary','Model usage, environment and timings'),node('pre',JSON.stringify({target:result.target,versions:result.versions,timingsMs:result.timings,model:result.model},null,2)));$('results').append(metadata);
+ $('metrics').textContent=(result.durationMs/1000).toFixed(1)+'s · '+result.model.requests+' model requests · $'+result.model.cost.toFixed(6);status(result.verdict+' · '+(result.durationMs/1000).toFixed(1)+'s · $'+result.model.cost.toFixed(5));$('report').href='/runs/'+jobId+'/report.html';$('report').hidden=false;
+}
+async function start(kind){try{controls(true);$('stop').disabled=true;$('log').hidden=false;$('log').textContent='';$('report').hidden=true;status(kind==='plan'?'Planning…':'Running…');const payload={url:$('platform').value==='web'?$('url').value:'',platform:$('platform').value,app:$('platform').value==='web'?'':$('app').value,device:$('platform').value==='web'?'':$('device').value,record:$('platform').value!=='web'&&$('record').checked,casesText:$('cases').value,planner:$('planner').checked?'on':'off',fixtures:$('fixtures').value};if($('saved').value)payload.savedPath=$('saved').value;if(kind==='run')payload.reviewId=jobId;const job=await post('/api/'+kind,payload);jobId=job.id;$('stop').disabled=false;source?.close();source=new EventSource(`/api/jobs/${jobId}/events`);source.onmessage=async event=>{const update=JSON.parse(event.data);if(update.type==='done'){source.close();const data=await fetch(`/api/jobs/${jobId}/result`).then(response=>response.json());if(data.result)showResult(data.result);else if(data.plan){showPlan(data.plan);status(data.plan.cases.some(test=>test.blockedReason)?'Plan has blocked cases':'Ready to run');}else status('Blocked / canceled');controls(false);return;}if(update.elapsedMs!==undefined)$('metrics').textContent=`${(update.elapsedMs/1000).toFixed(1)}s · $${(update.cost??0).toFixed(6)}`;if(update.screenshot){$('live-preview').src=`/runs/${jobId}/${update.screenshot}?t=${Date.now()}`;$('live-preview').hidden=false;}$('log').textContent+=`${update.caseName?'['+update.caseName+'] ':''}${update.message}\n`;$('log').scrollTop=$('log').scrollHeight;status(update.type==='error'?'Blocked':update.message);};source.onerror=()=>{if(busy)status('Reconnecting to local job…');};}catch(error){status(error.message);controls(false);}}
+$('example').onclick=()=>{clear();$('cases').value=$('platform').value==='web'?example:mobileExample;};$('cases').value=example;
+for(const id of ['url','cases','planner','fixtures','app','device','record'])$(id).addEventListener('input',clear);
$('saved').addEventListener('input',()=>{if(!busy){reviewed=null;$('run').disabled=true;status('Review saved plan');}});
-$('review').onclick=()=>start('plan');$('run').onclick=()=>start('run');$('stop').onclick=async()=>{try{await post('/api/cancel',{id:jobId});status('Stopping…');}catch(error){status(error.message);}};
+$('review').onclick=()=>start('plan');$('run').onclick=()=>start('run');$('stop').onclick=async()=>{try{await post('/api/cancel',{id:jobId});if(busy)status('Stopping…');}catch(error){if(busy)status(error.message);}};
$('save').onclick=async()=>{try{const result=await post('/api/save',{id:jobId});savedPath=result.path;$('saved').value=savedPath;status('Saved locally');$('log').hidden=false;$('log').textContent+='Saved: '+savedPath+'\n';}catch(error){status(error.message);}};
fetch('/api/session').then(response=>response.json()).then(session=>{token=session.token;$('provider').textContent=session.configured?'● OpenRouter configured':'○ Set OPENROUTER_API_KEY';}).catch(()=>{status('Local server unavailable');});
+
+$('platform').onchange=()=>{clear();const mobile=$('platform').value!=='web';$('web-target').hidden=mobile;$('mobile-target').hidden=!mobile;$('live-preview').hidden=true;$('fixtures').value=mobile?'examples/mobile.fixtures.example.json':'.jev-e2e/demo/fixtures.json';$('cases').value=mobile?mobileExample:example;};
+$('devices').onclick=async()=>{try{const response=await fetch('/api/devices?platform='+$('platform').value);const result=await response.json();if(!response.ok)throw new Error(result.error??'Device discovery failed');$('device-list').hidden=false;$('device-list').textContent=result.filter(d=>['simulator','emulator'].includes(d.kind)).map(d=>`${d.id} · ${d.name} · ${d.booted?'booted':'stopped'}`).join('\n')||'No virtual devices found';}catch(e){status(e.message);}};
diff --git a/public/index.html b/public/index.html
index ea73dd4..2b51188 100644
--- a/public/index.html
+++ b/public/index.html
@@ -1,11 +1,13 @@
jev-e2e · Test with words
-YOUR LOCAL TEST WORKBENCH
Describe the journey.
Check what happens.
Give Jev a website and clear expectations. Discover the flow, run the test, and inspect the evidence.
+YOUR LOCAL TEST WORKBENCH
Describe the journey.
Check what happens.
Choose a website or native app and describe what should happen. Run the test and inspect the evidence.
-
02
Inspect the evidence
Ready[ ✓ ]
A test you can inspect
Review the actions and expectations first.
Every result shows what was actually checked.
● Pass● Fail● Blocked
-
+Review plan ↗Run reviewed planStop
Accessible controls · $0.05 maximum per job
+02
Inspect the evidence
Ready[ ✓ ]
A test you can inspect
Review the actions and expectations first.
Every result shows what was actually checked.
● Pass● Fail● Blocked
+