From 2a7c5fa269e85ceab4d24f7b2bebb33823ee581c Mon Sep 17 00:00:00 2001 From: Davide Scaini Date: Tue, 2 Jun 2026 15:45:20 +0200 Subject: [PATCH] init: extract mobile app from bincio_activity Expo/React Native app with local SQLite archive and bincio-activity sync. --- .gitignore | 18 + .idea/.gitignore | 3 + .idea/caches/deviceStreaming.xml | 1784 ++++++ .idea/misc.xml | 5 + .idea/mobile.iml | 9 + .idea/modules.xml | 8 + .idea/vcs.xml | 6 + ThemeContext.tsx | 51 + app.json | 49 + app/(tabs)/_layout.tsx | 45 + app/(tabs)/import.tsx | 604 ++ app/(tabs)/index.tsx | 302 + app/(tabs)/search.tsx | 151 + app/(tabs)/settings.tsx | 388 ++ app/_layout.tsx | 16 + app/activity/[id].tsx | 531 ++ assets/adaptive-icon.png | Bin 0 -> 15024 bytes assets/bincio.whl | Bin 0 -> 60977 bytes assets/icon.png | Bin 0 -> 27179 bytes assets/splash-icon.png | Bin 0 -> 10992 bytes babel.config.js | 6 + components/ActivityCard.tsx | 108 + db/index.ts | 47 + db/queries.ts | 264 + db/sync.ts | 279 + extraction/PyodideWebView.tsx | 248 + extraction/extractActivity.ts | 138 + extraction/extractServer.ts | 63 + metro.config.js | 2 + package-lock.json | 9819 ++++++++++++++++++++++++++++++ package.json | 40 + setup.sh | 104 + theme.ts | 29 + tsconfig.json | 16 + 34 files changed, 15133 insertions(+) create mode 100644 .gitignore create mode 100644 .idea/.gitignore create mode 100644 .idea/caches/deviceStreaming.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/mobile.iml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml create mode 100644 ThemeContext.tsx create mode 100644 app.json create mode 100644 app/(tabs)/_layout.tsx create mode 100644 app/(tabs)/import.tsx create mode 100644 app/(tabs)/index.tsx create mode 100644 app/(tabs)/search.tsx create mode 100644 app/(tabs)/settings.tsx create mode 100644 app/_layout.tsx create mode 100644 app/activity/[id].tsx create mode 100644 assets/adaptive-icon.png create mode 100644 assets/bincio.whl create mode 100644 assets/icon.png create mode 100644 assets/splash-icon.png create mode 100644 babel.config.js create mode 100644 components/ActivityCard.tsx create mode 100644 db/index.ts create mode 100644 db/queries.ts create mode 100644 db/sync.ts create mode 100644 extraction/PyodideWebView.tsx create mode 100644 extraction/extractActivity.ts create mode 100644 extraction/extractServer.ts create mode 100644 metro.config.js create mode 100644 package-lock.json create mode 100644 package.json create mode 100755 setup.sh create mode 100644 theme.ts create mode 100644 tsconfig.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d8dac76 --- /dev/null +++ b/.gitignore @@ -0,0 +1,18 @@ +node_modules/ +.expo/ +dist/ +npm-debug.* +*.jks +*.p8 +*.p12 +*.key +*.mobileprovision +*.orig.* +web-build/ + +# Generated native projects (managed workflow — produced by EAS, not committed) +android/ +ios/ + +# Local env overrides +.env.local diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/caches/deviceStreaming.xml b/.idea/caches/deviceStreaming.xml new file mode 100644 index 0000000..e2f2258 --- /dev/null +++ b/.idea/caches/deviceStreaming.xml @@ -0,0 +1,1784 @@ + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..c08a2df --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/.idea/mobile.iml b/.idea/mobile.iml new file mode 100644 index 0000000..d6ebd48 --- /dev/null +++ b/.idea/mobile.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..348e586 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..6c0b863 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/ThemeContext.tsx b/ThemeContext.tsx new file mode 100644 index 0000000..51f05b6 --- /dev/null +++ b/ThemeContext.tsx @@ -0,0 +1,51 @@ +import { createContext, useContext, useEffect, useState } from 'react'; +import { useSQLiteContext } from 'expo-sqlite'; +import { getSetting, setSetting } from '@/db/queries'; +import { autoKey, PALETTES, type PaletteKey, type Theme } from '@/theme'; + +type ThemeCtx = { + theme: Theme; + paletteKey: PaletteKey; + setPaletteOverride: (key: PaletteKey) => void; +}; + +const ThemeContext = createContext({ + theme: PALETTES.default, + paletteKey: 'auto', + setPaletteOverride: () => {}, +}); + +export function ThemeProvider({ children }: { children: React.ReactNode }) { + const db = useSQLiteContext(); + const [paletteKey, setPaletteKey] = useState('auto'); + + useEffect(() => { + getSetting(db, 'palette_override').then(val => { + if (val) setPaletteKey(val as PaletteKey); + }); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + function setPaletteOverride(key: PaletteKey) { + setPaletteKey(key); + setSetting(db, 'palette_override', key); + } + + const resolved = paletteKey === 'auto' ? autoKey() : paletteKey; + const theme = PALETTES[resolved as keyof typeof PALETTES] ?? PALETTES.default; + + return ( + + {children} + + ); +} + +export function useTheme(): Theme { + return useContext(ThemeContext).theme; +} + +export function usePaletteControl(): Pick { + const { paletteKey, setPaletteOverride } = useContext(ThemeContext); + return { paletteKey, setPaletteOverride }; +} diff --git a/app.json b/app.json new file mode 100644 index 0000000..90255e3 --- /dev/null +++ b/app.json @@ -0,0 +1,49 @@ +{ + "expo": { + "name": "Bincio", + "slug": "bincio", + "version": "0.1.0", + "orientation": "portrait", + "scheme": "bincio", + "userInterfaceStyle": "dark", + "newArchEnabled": true, + "platforms": ["ios", "android"], + "icon": "./assets/icon.png", + "splash": { + "image": "./assets/splash-icon.png", + "resizeMode": "contain", + "backgroundColor": "#09090b" + }, + "android": { + "package": "org.bincio.app", + "usesCleartextTraffic": true, + "adaptiveIcon": { + "foregroundImage": "./assets/adaptive-icon.png", + "backgroundColor": "#09090b" + }, + "permissions": [ + "android.permission.READ_EXTERNAL_STORAGE", + "android.permission.READ_MEDIA_VIDEO", + "android.permission.RECEIVE_BOOT_COMPLETED", + "android.permission.VIBRATE", + "android.permission.POST_NOTIFICATIONS" + ] + }, + "ios": { + "bundleIdentifier": "org.bincio.app", + "supportsTablet": true + }, + "plugins": [ + "expo-system-ui", + "expo-router", + "expo-sqlite", + [ + "expo-document-picker", + { "iCloudContainerEnvironment": "Production" } + ], + "expo-background-fetch", + "expo-task-manager", + "@maplibre/maplibre-react-native" + ] + } +} diff --git a/app/(tabs)/_layout.tsx b/app/(tabs)/_layout.tsx new file mode 100644 index 0000000..02b5080 --- /dev/null +++ b/app/(tabs)/_layout.tsx @@ -0,0 +1,45 @@ +import { Tabs } from 'expo-router'; +import { Platform } from 'react-native'; +import { useTheme } from '@/ThemeContext'; + +const isKaroo = Platform.OS === 'android' && (Platform.Version as number) < 29; + +export default function TabLayout() { + const theme = useTheme(); + return ( + + }} + /> + }} + /> + , + href: isKaroo ? null : '/search', + }} + /> + }} + /> + + ); +} + +function TabIcon({ label, color }: { label: string; color: string }) { + const { Text } = require('react-native'); + return {label}; +} diff --git a/app/(tabs)/import.tsx b/app/(tabs)/import.tsx new file mode 100644 index 0000000..43957fc --- /dev/null +++ b/app/(tabs)/import.tsx @@ -0,0 +1,604 @@ +import * as DocumentPicker from 'expo-document-picker'; +import * as FileSystem from 'expo-file-system/legacy'; +import { useFocusEffect } from 'expo-router'; +import { useSQLiteContext } from 'expo-sqlite'; +import { useCallback, useEffect, useRef, useState } from 'react'; +import { AppState, PermissionsAndroid, Platform, Pressable, ScrollView, StyleSheet, Text, View } from 'react-native'; +import { insertActivity, isSourcePathImported, getSetting } from '@/db/queries'; +import { PyodideWebView } from '@/extraction/PyodideWebView'; +import { extractFile, waitForEngine, onEngineProgress, isEngineAvailable } from '@/extraction/extractActivity'; +import { extractFileViaServer, checkServerAuth } from '@/extraction/extractServer'; +import { useTheme } from '@/ThemeContext'; + +async function sha256hex(text: string): Promise { + const buf = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(text)); + return Array.from(new Uint8Array(buf)).map(b => b.toString(16).padStart(2, '0')).join(''); +} + +const FIT_EXTENSIONS = ['.fit', '.fit.gz']; +const OTHER_EXTENSIONS = ['.gpx', '.tcx', '.gpx.gz', '.tcx.gz']; +const ALL_NATIVE_EXTENSIONS = [...FIT_EXTENSIONS, ...OTHER_EXTENSIONS]; + +type ImportState = + | { status: 'idle' } + | { status: 'loading'; msg: string; current: number; total: number } + | { status: 'done'; count: number; errors: Array<{ name: string; message: string }> } + | { status: 'error'; message: string }; + +export default function ImportScreen() { + const db = useSQLiteContext(); + const theme = useTheme(); + const [state, setState] = useState({ status: 'idle' }); + const [watchPath, setWatchPath] = useState(''); + const [engineAvailable, setEngineAvailable] = useState(null); + const isImporting = useRef(false); + + // Track engine availability so we can show the server-extraction notice. + useEffect(() => { + waitForEngine(30_000) + .then(() => setEngineAvailable(true)) + .catch((e: unknown) => { + if (e instanceof Error && e.message === 'engine_unavailable') setEngineAvailable(false); + }); + }, []); + + // Reload watch path every time the Import tab comes into focus so changes + // saved in Settings are picked up without remounting the tab. + useFocusEffect(useCallback(() => { + if (Platform.OS !== 'android') return; + const row = db.getFirstSync<{ value: string }>( + 'SELECT value FROM settings WHERE key = ?', + ['auto_import_path'], + ); + setWatchPath(row?.value ?? ''); + }, [db])); + + // Auto-scan watch folder on mount and when app comes to foreground. + useEffect(() => { + if (Platform.OS !== 'android') return; + runAutoScan(); + + const sub = AppState.addEventListener('change', (next) => { + if (next === 'active') runAutoScan(); + }); + return () => sub.remove(); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + async function runAutoScan() { + if (isImporting.current) return; + const path = await getSetting(db, 'auto_import_path'); + if (!path) return; + const instanceUrl = await getSetting(db, 'instance_url'); + if (!instanceUrl) return; + + // Wait for engine — skip auto-scan on init failure, but continue if device is + // too old for local extraction (importNativeFile will use the server instead). + try { await waitForEngine(120_000); } catch (e: unknown) { + if (!(e instanceof Error) || e.message !== 'engine_unavailable') return; + } + + // Server-mode requires a valid token — verify before touching any files. + if (isEngineAvailable() === false) { + const token = await getSetting(db, 'api_token'); + if (!token) return; + try { await checkServerAuth(instanceUrl, token); } catch { return; } + } + + const newFiles = await discoverNewFiles(db, path); + if (newFiles.length === 0) return; + + isImporting.current = true; + try { + await processBatch(newFiles.map(f => ({ uri: `file://${f}`, name: f.split('/').pop() ?? f, sourcePath: f }))); + } finally { + isImporting.current = false; + } + } + + async function manualScan() { + if (isImporting.current) return; + const path = await getSetting(db, 'auto_import_path'); + if (!path) return; + const instanceUrl = await getSetting(db, 'instance_url'); + if (!instanceUrl) { + setState({ status: 'error', message: 'No Bincio instance configured. Go to Settings and enter an instance URL first — it\'s needed to download the extraction engine.' }); + return; + } + + const serverMode = isEngineAvailable() === false; + if (!serverMode) { + setState({ status: 'loading', msg: 'Preparing extraction engine…', current: 0, total: 0 }); + const unsubScan = onEngineProgress((msg) => + setState({ status: 'loading', msg, current: 0, total: 0 }), + ); + try { + await waitForEngine(); + } catch (e: unknown) { + if (!(e instanceof Error) || e.message !== 'engine_unavailable') { + setState({ status: 'error', message: e instanceof Error ? e.message : String(e) }); + return; + } + // engine_unavailable — fall through to server mode + } finally { + unsubScan(); + } + } else { + const token = await getSetting(db, 'api_token'); + if (!token) { + setState({ status: 'error', message: 'Server extraction requires a Bincio account. Connect in Settings.' }); + return; + } + // Verify the token is valid before processing any files. + setState({ status: 'loading', msg: 'Checking connection…', current: 0, total: 0 }); + try { + await checkServerAuth(instanceUrl, token); + } catch (e: unknown) { + setState({ status: 'error', message: e instanceof Error ? e.message : String(e) }); + return; + } + } + + setState({ status: 'loading', msg: 'Scanning…', current: 0, total: 0 }); + const newFiles = await discoverNewFiles(db, path); + if (newFiles.length === 0) { + setState({ status: 'done', count: 0, errors: [] }); + return; + } + + isImporting.current = true; + try { + await processBatch(newFiles.map(f => ({ uri: `file://${f}`, name: f.split('/').pop() ?? f, sourcePath: f }))); + } finally { + isImporting.current = false; + } + } + + async function pickFiles() { + if (isImporting.current) return; + setState({ status: 'loading', msg: 'Picking files…', current: 0, total: 0 }); + try { + let result: DocumentPicker.DocumentPickerResult; + try { + result = await DocumentPicker.getDocumentAsync({ + type: ['*/*'], + copyToCacheDirectory: true, + multiple: true, + }); + } catch (pickerErr: unknown) { + // Some Android devices (e.g. Karoo) have no system file picker app. + const raw = pickerErr instanceof Error ? pickerErr.message : String(pickerErr); + const noApp = raw.includes('ActivityNotFoundException') || raw.includes('No Activity found'); + setState({ + status: 'error', + message: noApp + ? 'No file picker available on this device. Set a Watch directory in Settings to import from a folder.' + : raw, + }); + return; + } + + if (result.canceled || !result.assets?.length) { + setState({ status: 'idle' }); + return; + } + isImporting.current = true; + const unsubPick = onEngineProgress((msg) => + setState({ status: 'loading', msg, current: 0, total: 0 }), + ); + try { + await processBatch(result.assets.map(a => ({ uri: a.uri, name: a.name ?? '', sourcePath: null }))); + } finally { + unsubPick(); + isImporting.current = false; + } + } catch (e: unknown) { + const msg = e instanceof Error ? e.message : String(e); + setState({ status: 'error', message: msg }); + isImporting.current = false; + } + } + + async function processBatch(files: Array<{ uri: string; name: string; sourcePath: string | null }>) { + const total = files.length; + const errors: Array<{ name: string; message: string }> = []; + let count = 0; + + for (let i = 0; i < files.length; i++) { + const { uri, name, sourcePath } = files[i]; + const lower = name.toLowerCase(); + + setState({ status: 'loading', msg: `Processing ${name}…`, current: i + 1, total }); + + try { + if (lower.endsWith('.json')) { + await importBasJson(uri, name, sourcePath, (msg) => + setState({ status: 'loading', msg, current: i + 1, total }), + ); + } else if (ALL_NATIVE_EXTENSIONS.some(ext => lower.endsWith(ext))) { + await importNativeFile(uri, name, sourcePath, (msg) => + setState({ status: 'loading', msg, current: i + 1, total }), + ); + } else { + errors.push({ name, message: 'Unsupported file type' }); + continue; + } + count++; + } catch (e: unknown) { + errors.push({ name, message: e instanceof Error ? e.message : String(e) }); + } + } + + setState({ status: 'done', count, errors }); + } + + // ── BAS JSON import (no extraction needed) ────────────────────────────────── + + async function importBasJson( + uri: string, + _name: string, + sourcePath: string | null, + onStatus: (msg: string) => void, + ) { + onStatus('Importing…'); + const text = await FileSystem.readAsStringAsync(uri); + const detail = JSON.parse(text); + + if (!detail.id || !detail.started_at) { + throw new Error('Not a valid BAS activity JSON (missing id or started_at)'); + } + + const hash = detail.source_hash ?? await sha256hex(text); + const origDir = `${FileSystem.documentDirectory}originals/`; + await FileSystem.makeDirectoryAsync(origDir, { intermediates: true }); + const dest = `${origDir}${detail.id}.json`; + await FileSystem.copyAsync({ from: uri, to: dest }); + + await insertActivity(db, { + id: detail.id, + source_hash: hash, + detail_json: text, + timeseries_json: null, + geojson: null, + original_path: dest, + source_path: sourcePath, + origin: 'local', + }); + } + + // ── FIT / GPX / TCX import via Pyodide (local) or server fallback ─────────── + + async function importNativeFile( + uri: string, + name: string, + sourcePath: string | null, + onStatus: (msg: string) => void, + ) { + onStatus('Reading file…'); + + // Read the original file as base64 so we can (a) pass it to the extractor + // and (b) copy it to permanent storage without a second read. + const base64 = await FileSystem.readAsStringAsync(uri, { + encoding: FileSystem.EncodingType.Base64, + }); + + let result; + + if (isEngineAvailable() === false) { + // Device WebView is too old for WebAssembly.Global (Chrome <69). + // Send the raw file to the Bincio instance for server-side extraction. + const instanceUrl = await getInstanceUrl(db); + const token = db.getFirstSync<{ value: string }>( + 'SELECT value FROM settings WHERE key = ?', ['api_token'], + )?.value ?? ''; + if (!token) throw new Error('Server extraction requires a Bincio account — connect in Settings.'); + result = await extractFileViaServer(name, base64, instanceUrl, token, onStatus); + } else { + // Fetch the bincio wheel here (React Native networking), not inside the + // WebView. WKWebView blocks HTTP requests via ATS; RN native networking + // allows local-network HTTP (NSAllowsLocalNetworking=true in Info.plist). + const instanceUrl = await getInstanceUrl(db); + onStatus('Fetching Bincio engine…'); + const { base64: wheelBase64, filename: wheelFilename } = await fetchWheelBase64(instanceUrl); + result = await extractFile(name, base64, wheelBase64, wheelFilename, onStatus); + } + + onStatus('Saving…'); + + // Copy original file to permanent storage (keeps original bytes for future re-extraction) + const ext = name.includes('.') ? name.slice(name.lastIndexOf('.')) : ''; + const origDir = `${FileSystem.documentDirectory}originals/`; + await FileSystem.makeDirectoryAsync(origDir, { intermediates: true }); + const dest = `${origDir}${result.id}${ext}`; + await FileSystem.copyAsync({ from: uri, to: dest }); + + await insertActivity(db, { + id: result.id, + source_hash: result.sourceHash, + detail_json: JSON.stringify(result.detail), + timeseries_json: result.timeseries ? JSON.stringify(result.timeseries) : null, + geojson: result.geojson ? JSON.stringify(result.geojson) : null, + original_path: dest, + source_path: sourcePath, + origin: 'local', + }); + } + + return ( + + {/* Hidden WebView for Pyodide — only mounted on devices that can run it. + Android <29 has a system WebView (Chrome <69) that lacks WebAssembly.Global + AND causes GPU SurfaceView crashes on old drivers. Skip it entirely there. */} + {(Platform.OS !== 'android' || (Platform.Version as number) >= 29) && ( + + + + )} + + Import + + + Import FIT, GPX, or TCX files — extracted on your device, nothing uploaded. + You can also import pre-extracted BAS .json files. + + + {engineAvailable === false && ( + + + This device's Android WebView is too old to run local extraction (requires Chrome 69+). + Activities are processed by your Bincio instance instead — a connected account is required. + + + )} + + {watchPath ? ( + + Watch folder + {watchPath} + + + {state.status === 'loading' ? 'Working…' : '↺ Scan for new rides'} + + + + ) : null} + + + + {state.status === 'loading' ? 'Working…' : '+ Pick files'} + + + + {state.status === 'loading' && ( + + {state.total > 1 && ( + + File {state.current} of {state.total} + + )} + {state.msg} + {engineAvailable !== false && ( + + First run downloads ~35 MB (Python runtime + packages). Subsequent runs are instant. + + )} + + )} + + {state.status === 'done' && ( + + + {state.count === 0 && state.errors.length === 0 + ? 'No new rides found' + : `✓ Imported ${state.count} ${state.count === 1 ? 'activity' : 'activities'}`} + + {state.errors.map((e, i) => ( + ✗ {e.name}: {e.message} + ))} + setState({ status: 'idle' })}> + Dismiss + + + )} + + {state.status === 'error' && ( + + {state.message} + setState({ status: 'idle' })}> + Try again + + + )} + + + + Supported formats + {([ + ['FIT', 'Garmin, Wahoo, Karoo native format'], + ['GPX', 'Most GPS devices and apps'], + ['TCX', 'Garmin Training Center'], + ['BAS JSON', 'Pre-extracted Bincio format (instant)'], + ] as [string, string][]).map(([fmt, desc]) => ( + + {fmt} + {desc} + + ))} + + + + {engineAvailable === false + ? 'Activities are sent to your Bincio instance for extraction and stored there + locally. A connected account is required.' + : `FIT/GPX/TCX extraction runs entirely on your device.\nA Bincio instance must be reachable on first run to download the extraction engine (~35 MB, then cached).`} + {'\n\n'} + On Karoo: set Watch directory to /sdcard/FitFiles in Settings to auto-import rides. + + + + + ); +} + +// ── Watch-folder helpers ────────────────────────────────────────────────────── + +async function requestStoragePermission(): Promise { + if (Platform.OS !== 'android') return true; + try { + const granted = await PermissionsAndroid.request( + PermissionsAndroid.PERMISSIONS.READ_EXTERNAL_STORAGE, + ); + return granted === PermissionsAndroid.RESULTS.GRANTED; + } catch { + return false; + } +} + +async function discoverNewFiles( + db: ReturnType, + watchPath: string, +): Promise { + const ok = await requestStoragePermission(); + if (!ok) return []; + + // Normalize: strip trailing slash, then use file:// URI for expo-fs + const dir = watchPath.replace(/\/+$/, ''); + const uri = dir.startsWith('file://') ? dir : `file://${dir}`; + + let entries: string[]; + try { + entries = await FileSystem.readDirectoryAsync(uri); + } catch { + return []; + } + + const newFiles: string[] = []; + for (const entry of entries) { + const lower = entry.toLowerCase(); + if (!lower.endsWith('.fit')) continue; + const fullPath = `${dir}/${entry}`; + if (!isSourcePathImported(db, fullPath)) { + newFiles.push(fullPath); + } + } + return newFiles; +} + +// ── Module-level helpers ────────────────────────────────────────────────────── + +async function getInstanceUrl(db: ReturnType): Promise { + const row = db.getFirstSync<{ value: string }>( + 'SELECT value FROM settings WHERE key = ?', + ['instance_url'], + ); + return (row?.value ?? '').replace(/\/$/, ''); +} + +// In-memory cache so repeated imports in one session don't re-download the wheel. +let _cachedWheel: { base64: string; filename: string } | null = null; + +async function fetchWheelBase64(instanceUrl: string): Promise<{ base64: string; filename: string }> { + if (_cachedWheel) return _cachedWheel; + + const base = instanceUrl || 'https://bincio.org'; + + // Ask the instance for the canonical wheel URL (handles both dev and prod layouts). + let wheelUrl = `${base}/api/wheel/download`; + let wheelFilename = 'bincio-0.1.0-py3-none-any.whl'; + try { + const vr = await fetch(`${base}/api/wheel/version`, { signal: AbortSignal.timeout(5000) }); + if (vr.ok) { + const d = await vr.json() as { api_url?: string; url?: string }; + const path = d.api_url ?? d.url ?? '/api/wheel/download'; + wheelUrl = path.startsWith('http') ? path : `${base}${path}`; + // Extract the filename from the URL path (last segment after final /) + const urlBasename = wheelUrl.split('/').pop() ?? ''; + if (urlBasename.endsWith('.whl')) wheelFilename = urlBasename; + } + } catch {} + + // Fetch via React Native networking (supports local HTTP; WKWebView would block it). + const resp = await fetch(wheelUrl); + if (!resp.ok) throw new Error(`Could not download Bincio engine (${resp.status}). Is the instance running?`); + const buf = await resp.arrayBuffer(); + _cachedWheel = { base64: arrayBufferToBase64(buf), filename: wheelFilename }; + return _cachedWheel; +} + +function arrayBufferToBase64(buf: ArrayBuffer): string { + const bytes = new Uint8Array(buf); + let binary = ''; + // Process in chunks to avoid spread-operator stack overflow on large arrays. + const CHUNK = 8192; + for (let i = 0; i < bytes.length; i += CHUNK) { + binary += String.fromCharCode(...(bytes.subarray(i, i + CHUNK) as unknown as number[])); + } + return btoa(binary); +} + +// ── Styles ─────────────────────────────────────────────────────────────────── + +const styles = StyleSheet.create({ + screen: { flex: 1, backgroundColor: '#09090b' }, + hiddenEngine: { position: 'absolute', width: 1, height: 1, overflow: 'hidden' }, + container: { flex: 1 }, + content: { padding: 16, paddingTop: 60, paddingBottom: 40 }, + header: { color: '#fff', fontSize: 22, fontWeight: '700', marginBottom: 12 }, + body: { color: '#a1a1aa', fontSize: 14, lineHeight: 20, marginBottom: 24 }, + code: { color: '#60a5fa', fontFamily: 'monospace' }, + serverNotice: { + backgroundColor: '#1c1400', borderRadius: 8, borderWidth: 1, + borderColor: '#854d0e', padding: 12, marginBottom: 16, + }, + serverNoticeText: { color: '#fbbf24', fontSize: 13, lineHeight: 18 }, + watchBox: { + backgroundColor: '#18181b', borderRadius: 10, borderWidth: 1, + borderColor: '#27272a', padding: 14, marginBottom: 16, gap: 10, + }, + watchLabel: { color: '#71717a', fontSize: 11, fontWeight: '600', letterSpacing: 0.5 }, + watchPath: { color: '#a1a1aa', fontSize: 13, fontFamily: 'monospace' }, + scanButton: { + backgroundColor: '#16a34a', borderRadius: 10, + paddingVertical: 14, alignItems: 'center', + }, + button: { + backgroundColor: '#2563eb', borderRadius: 10, + paddingVertical: 14, alignItems: 'center', marginBottom: 16, + }, + buttonDisabled: { opacity: 0.5 }, + buttonText: { color: '#fff', fontWeight: '600', fontSize: 16 }, + statusBox: { + backgroundColor: '#18181b', borderRadius: 8, borderWidth: 1, + borderColor: '#27272a', padding: 14, marginBottom: 16, gap: 6, + }, + statusCounter: { color: '#71717a', fontSize: 12, textAlign: 'center' }, + statusMsg: { color: '#60a5fa', fontSize: 14, textAlign: 'center' }, + statusHint: { color: '#52525b', fontSize: 12, textAlign: 'center', lineHeight: 16 }, + success: { + backgroundColor: '#14532d', borderRadius: 8, padding: 12, marginBottom: 16, gap: 6, + }, + successEmpty: { backgroundColor: '#1c1c1e' }, + successText: { color: '#86efac', fontSize: 14 }, + batchError: { color: '#fca5a5', fontSize: 12 }, + error: { + backgroundColor: '#450a0a', borderRadius: 8, padding: 12, marginBottom: 16, gap: 8, + }, + errorText: { color: '#fca5a5', fontSize: 14 }, + errorRetry: { color: '#71717a', fontSize: 13, textDecorationLine: 'underline', marginTop: 4 }, + divider: { height: 1, backgroundColor: '#27272a', marginVertical: 24 }, + sectionTitle: { color: '#a1a1aa', fontSize: 12, fontWeight: '600', marginBottom: 12, letterSpacing: 0.5 }, + formatRow: { flexDirection: 'row', gap: 12, marginBottom: 10 }, + formatName: { color: '#f4f4f5', fontSize: 13, fontWeight: '600', width: 72 }, + formatDesc: { color: '#71717a', fontSize: 13, flex: 1 }, + notice: { + marginTop: 8, backgroundColor: '#18181b', + borderRadius: 8, padding: 12, borderWidth: 1, borderColor: '#27272a', + }, + noticeText: { color: '#71717a', fontSize: 12, lineHeight: 18 }, + noticeCode: { fontFamily: 'monospace', color: '#a1a1aa' }, +}); diff --git a/app/(tabs)/index.tsx b/app/(tabs)/index.tsx new file mode 100644 index 0000000..002c17b --- /dev/null +++ b/app/(tabs)/index.tsx @@ -0,0 +1,302 @@ +import * as FileSystem from 'expo-file-system'; +import { useFocusEffect } from 'expo-router'; +import { useSQLiteContext } from 'expo-sqlite'; +import { useCallback, useState } from 'react'; +import { Alert, FlatList, Pressable, RefreshControl, StyleSheet, Text, TextInput, View } from 'react-native'; +import { deleteActivities, useActivities, useActivityCount, PAGE_SIZE } from '@/db/queries'; +import { downloadFeed, uploadFeed } from '@/db/sync'; +import { useTheme } from '@/ThemeContext'; +import { ActivityCard } from '@/components/ActivityCard'; + +export default function FeedScreen() { + const db = useSQLiteContext(); + const theme = useTheme(); + const [refreshKey, setRefreshKey] = useState(0); + const [searchQuery, setSearchQuery] = useState(''); + const [limit, setLimit] = useState(PAGE_SIZE); + const activities = useActivities(searchQuery, limit); + const totalCount = useActivityCount(searchQuery); + const hasMore = activities.length < totalCount; + const [downloading, setDownloading] = useState(false); + const [uploading, setUploading] = useState(false); + const [statusMsg, setStatusMsg] = useState<{ ok: boolean; text: string } | null>(null); + const [selected, setSelected] = useState>(new Set()); + const selecting = selected.size > 0; + + // Auto-refresh the local list whenever the tab comes into focus. + // SQLite getAllSync is sub-millisecond — no network, no lag. + useFocusEffect(useCallback(() => { + setRefreshKey(k => k + 1); + }, [])); + + function showMsg(ok: boolean, text: string) { + setStatusMsg({ ok, text }); + setTimeout(() => setStatusMsg(null), 3500); + } + + const doDownload = useCallback(async () => { + setDownloading(true); + setStatusMsg(null); + const result = await downloadFeed(db); + setDownloading(false); + setRefreshKey(k => k + 1); + if (result.error) { + showMsg(false, result.error); + } else if (result.total === 0) { + showMsg(true, 'No activities on instance'); + } else if (result.synced === 0 && !result.fetched) { + showMsg(true, `Up to date (${result.total} activities)`); + } else { + const parts = []; + if (result.synced > 0) parts.push(`${result.synced} new`); + if (result.fetched) parts.push(`${result.fetched} full dataset${result.fetched === 1 ? '' : 's'}`); + showMsg(true, `Downloaded: ${parts.join(', ')} (${result.total} total)`); + } + }, [db]); + + const doUpload = useCallback(async () => { + setUploading(true); + setStatusMsg(null); + const result = await uploadFeed(db, (n, total) => { + setStatusMsg({ ok: true, text: `Uploading ${n} / ${total}…` }); + }); + setUploading(false); + if (result.error) { + showMsg(false, result.error); + } else if (!result.uploaded && !result.failed) { + showMsg(true, 'Nothing to upload'); + } else { + const parts: string[] = []; + if (result.uploaded) parts.push(`${result.uploaded} uploaded`); + if (result.failed) parts.push(`${result.failed} failed`); + showMsg(result.failed ? false : true, parts.join(', ')); + } + }, [db]); + + function doRefresh() { + setRefreshKey(k => k + 1); + } + + function handleSearch(q: string) { + setSearchQuery(q); + setLimit(PAGE_SIZE); // reset pagination when search changes + } + + function loadMore() { + if (hasMore) setLimit(l => l + PAGE_SIZE); + } + + function toggleSelect(id: string) { + setSelected(prev => { + const next = new Set(prev); + if (next.has(id)) next.delete(id); else next.add(id); + return next; + }); + } + + function cancelSelect() { setSelected(new Set()); } + + function confirmDeleteSelected() { + const count = selected.size; + Alert.alert( + `Delete ${count} activit${count === 1 ? 'y' : 'ies'}`, + 'These activities will be permanently removed from your device.', + [ + { text: 'Cancel', style: 'cancel' }, + { + text: 'Delete', + style: 'destructive', + onPress: async () => { + const ids = Array.from(selected); + const paths = await deleteActivities(db, ids); + setSelected(new Set()); + for (const p of paths) { + if (p) try { await FileSystem.deleteAsync(p, { idempotent: true }); } catch {} + } + }, + }, + ], + ); + } + + const busy = downloading || uploading; + + return ( + + + {selecting ? ( + <> + {selected.size} selected + + Cancel + + + ) : ( + <> + Feed + + + + + + + )} + + + {statusMsg && ( + {statusMsg.text} + )} + + {!selecting && ( + + + + )} + + {activities.length === 0 && !busy ? ( + + 🚴 + No activities yet + + Import a file or tap ↓ to pull from your instance. + + + ) : ( + a.id} + extraData={refreshKey} + renderItem={({ item }) => ( + toggleSelect(item.id)} + onLongPress={() => toggleSelect(item.id)} + /> + )} + contentContainerStyle={styles.list} + onEndReached={loadMore} + onEndReachedThreshold={0.3} + refreshControl={ + + } + /> + )} + + {selecting && ( + + + Delete {selected.size} + + + )} + + ); +} + +function ActionButton({ + icon, label, loading, disabled, accent, dim, onPress, +}: { + icon: string; + label: string; + loading: boolean; + disabled: boolean; + accent: string; + dim: string; + onPress: () => void; +}) { + return ( + + + {loading ? '…' : icon} + + + ); +} + +const styles = StyleSheet.create({ + container: { flex: 1, backgroundColor: '#09090b' }, + headerRow: { + flexDirection: 'row', alignItems: 'center', justifyContent: 'space-between', + paddingHorizontal: 16, paddingTop: 60, paddingBottom: 12, + }, + header: { color: '#fff', fontSize: 22, fontWeight: '700' }, + actionButtons: { flexDirection: 'row', gap: 8 }, + actionBtn: { + width: 36, height: 36, borderRadius: 8, + alignItems: 'center', justifyContent: 'center', + }, + actionBtnDisabled: { opacity: 0.4 }, + actionBtnIcon: { fontSize: 18, fontWeight: '700', lineHeight: 22 }, + cancelButton: { + backgroundColor: '#27272a', borderRadius: 8, + paddingHorizontal: 14, paddingVertical: 7, + }, + cancelText: { color: '#a1a1aa', fontSize: 13, fontWeight: '600' }, + msgOk: { color: '#86efac', fontSize: 12, textAlign: 'center', paddingHorizontal: 16, paddingBottom: 8 }, + msgErr: { color: '#fca5a5', fontSize: 12, textAlign: 'center', paddingHorizontal: 16, paddingBottom: 8 }, + searchRow: { paddingHorizontal: 16, paddingBottom: 10 }, + searchInput: { + backgroundColor: '#18181b', borderWidth: 1, borderColor: '#27272a', + borderRadius: 8, paddingHorizontal: 12, paddingVertical: 8, + color: '#f4f4f5', fontSize: 14, + }, + list: { padding: 16, gap: 12, paddingBottom: 80 }, + empty: { + flex: 1, alignItems: 'center', justifyContent: 'center', padding: 32, + }, + emptyIcon: { fontSize: 48, marginBottom: 16 }, + emptyTitle: { color: '#f4f4f5', fontSize: 18, fontWeight: '600', marginBottom: 8 }, + emptyBody: { color: '#71717a', fontSize: 14, textAlign: 'center', lineHeight: 20 }, + actionBar: { + position: 'absolute', bottom: 0, left: 0, right: 0, + backgroundColor: '#18181b', borderTopWidth: 1, borderTopColor: '#27272a', + paddingHorizontal: 16, paddingVertical: 12, paddingBottom: 28, + }, + deleteBarButton: { + backgroundColor: '#7f1d1d', borderRadius: 10, + paddingVertical: 14, alignItems: 'center', + }, + deleteBarText: { color: '#fca5a5', fontSize: 15, fontWeight: '700' }, +}); diff --git a/app/(tabs)/search.tsx b/app/(tabs)/search.tsx new file mode 100644 index 0000000..1cfbdd8 --- /dev/null +++ b/app/(tabs)/search.tsx @@ -0,0 +1,151 @@ +import { useState } from 'react'; +import { FlatList, Pressable, ScrollView, StyleSheet, Text, View } from 'react-native'; +import { PAGE_SIZE, useActivityYears, useFilteredActivities, useFilteredCount, type ActivityFilter } from '@/db/queries'; +import { ActivityCard } from '@/components/ActivityCard'; +import { useTheme } from '@/ThemeContext'; + +type SortKey = 'date' | 'distance' | 'elevation'; + +const SPORTS = [ + { value: '', label: 'All' }, + { value: 'cycling', label: '🚴 Cycling' }, + { value: 'running', label: '🏃 Running' }, + { value: 'hiking', label: '🥾 Hiking' }, + { value: 'swimming', label: '🏊 Swimming' }, + { value: 'walking', label: '🚶 Walking' }, +]; + +const DATE_PRESETS = [ + { value: 'all', label: 'All time' }, + { value: '7d', label: '7 days' }, + { value: '30d', label: '30 days' }, + { value: '6mo', label: '6 months' }, +]; + +const SORTS: { value: SortKey; label: string }[] = [ + { value: 'date', label: 'Newest' }, + { value: 'distance', label: 'Distance' }, + { value: 'elevation', label: 'Elevation' }, +]; + +function computeDateRange(preset: string): { dateFrom: string; dateTo: string } { + if (preset === 'all') return { dateFrom: '', dateTo: '' }; + if (/^\d{4}$/.test(preset)) { + const y = parseInt(preset, 10); + return { dateFrom: `${y}-01-01T000000Z`, dateTo: `${y + 1}-01-01T000000Z` }; + } + const pad = (n: number) => String(n).padStart(2, '0'); + const now = new Date(); + let d: Date; + if (preset === '7d') d = new Date(now.getTime() - 7 * 86_400_000); + else if (preset === '30d') d = new Date(now.getTime() - 30 * 86_400_000); + else { d = new Date(now); d.setMonth(d.getMonth() - 6); } + return { dateFrom: `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}T000000Z`, dateTo: '' }; +} + +export default function SearchScreen() { + const theme = useTheme(); + const [sport, setSport] = useState(''); + const [datePre, setDatePre] = useState('all'); + const [sort, setSort] = useState('date'); + const [limit, setLimit] = useState(PAGE_SIZE); + + const years = useActivityYears(); + const dateOptions = [...DATE_PRESETS, ...years.map(y => ({ value: y, label: y }))]; + + const { dateFrom, dateTo } = computeDateRange(datePre); + const filter: ActivityFilter = { sport, dateFrom, dateTo, sort }; + const activities = useFilteredActivities(filter, limit); + const total = useFilteredCount(filter); + const hasMore = activities.length < total; + + return ( + + + Filter + {total > 0 && {total} activities} + + + + {SPORTS.map(s => ( + { setSport(s.value); setLimit(PAGE_SIZE); }} /> + ))} + + + + {dateOptions.map(d => ( + { setDatePre(d.value); setLimit(PAGE_SIZE); }} /> + ))} + + + + {SORTS.map(s => ( + { setSort(s.value); setLimit(PAGE_SIZE); }}> + {s.label} + + ))} + + + {activities.length === 0 ? ( + + No activities match + + ) : ( + a.id} + renderItem={({ item }) => ( + {}} onLongPress={() => {}} /> + )} + contentContainerStyle={styles.list} + onEndReached={() => { if (hasMore) setLimit(l => l + PAGE_SIZE); }} + onEndReachedThreshold={0.3} + /> + )} + + ); +} + +function Pill({ label, active, accent, onPress }: { + label: string; active: boolean; accent: string; onPress: () => void; +}) { + return ( + + {label} + + ); +} + +const styles = StyleSheet.create({ + container: { flex: 1, backgroundColor: '#09090b' }, + headerRow: { + flexDirection: 'row', alignItems: 'center', justifyContent: 'space-between', + paddingHorizontal: 16, paddingTop: 60, paddingBottom: 12, + }, + header: { color: '#fff', fontSize: 22, fontWeight: '700' }, + count: { color: '#71717a', fontSize: 13 }, + pillScroll: { flexGrow: 0, flexShrink: 0 }, + pillRow: { flexDirection: 'row', gap: 8, paddingHorizontal: 16, paddingBottom: 10 }, + pill: { + borderRadius: 20, borderWidth: 1, borderColor: '#3f3f46', + paddingHorizontal: 14, paddingVertical: 7, + }, + pillText: { color: '#a1a1aa', fontSize: 13, fontWeight: '500' }, + sortRow: { flexDirection: 'row', paddingHorizontal: 16, marginBottom: 4 }, + sortBtn: { marginRight: 24, paddingBottom: 8, borderBottomWidth: 2, borderBottomColor: 'transparent' }, + sortText: { color: '#71717a', fontSize: 13, fontWeight: '600' }, + list: { padding: 16, gap: 12, paddingBottom: 80 }, + empty: { flex: 1, alignItems: 'center', justifyContent: 'center' }, + emptyText: { color: '#52525b', fontSize: 15 }, +}); diff --git a/app/(tabs)/settings.tsx b/app/(tabs)/settings.tsx new file mode 100644 index 0000000..c38d4d7 --- /dev/null +++ b/app/(tabs)/settings.tsx @@ -0,0 +1,388 @@ +import { useSQLiteContext } from 'expo-sqlite'; +import { useState } from 'react'; +import { + ActivityIndicator, Platform, Pressable, ScrollView, StyleSheet, + Text, TextInput, View, +} from 'react-native'; +import { deleteRemoteActivities, getSetting, setSetting, useSetting } from '@/db/queries'; +import { PALETTES, type PaletteKey } from '@/theme'; +import { useTheme, usePaletteControl } from '@/ThemeContext'; + +export default function SettingsScreen() { + const db = useSQLiteContext(); + + const storedUrl = useSetting('instance_url') ?? ''; + const storedHandle = useSetting('handle') ?? ''; + const storedPath = useSetting('auto_import_path') ?? ''; + const storedToken = useSetting('api_token'); + const storedSyncMode = (useSetting('sync_mode') ?? 'summaries') as 'summaries' | 'full'; + const storedSyncUpload = useSetting('sync_upload') === 'true'; + const storedUploadFormat = (useSetting('upload_format') ?? 'raw') as 'raw' | 'bas'; + + const [instanceUrl, setInstanceUrl] = useState(storedUrl); + const [handle, setHandle] = useState(storedHandle); + const [autoPath, setAutoPath] = useState(storedPath); + const [syncMode, setSyncMode] = useState(storedSyncMode); + const [syncUpload, setSyncUpload] = useState(storedSyncUpload); + const [uploadFormat, setUploadFormat] = useState(storedUploadFormat); + const [saved, setSaved] = useState(false); + const theme = useTheme(); + const { paletteKey: palette, setPaletteOverride } = usePaletteControl(); + + const [password, setPassword] = useState(''); + const [connecting, setConnecting] = useState(false); + const [connectMsg, setConnectMsg] = useState<{ ok: boolean; text: string } | null>(null); + + const [resetArmed, setResetArmed] = useState(false); + const [resetMsg, setResetMsg] = useState(null); + + async function save() { + await setSetting(db, 'instance_url', instanceUrl.trim()); + await setSetting(db, 'handle', handle.trim()); + setSaved(true); + setTimeout(() => setSaved(false), 2000); + } + + async function connect() { + const url = instanceUrl.trim().replace(/\/$/, ''); + const h = handle.trim(); + if (!url || !h || !password) { + setConnectMsg({ ok: false, text: 'Fill in URL, handle, and password first.' }); + return; + } + setConnecting(true); + setConnectMsg(null); + try { + const resp = await fetch(`${url}/api/auth/token`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ handle: h, password }), + }); + if (!resp.ok) { + const err = await resp.json().catch(() => ({})); + setConnectMsg({ ok: false, text: err.detail ?? `Error ${resp.status}` }); + return; + } + const data = await resp.json(); + await setSetting(db, 'instance_url', url); + await setSetting(db, 'handle', h); + await setSetting(db, 'api_token', data.token); + setPassword(''); + setConnectMsg({ ok: true, text: `Connected as ${data.display_name || h}` }); + } catch { + setConnectMsg({ ok: false, text: 'Could not reach instance — check the URL.' }); + } finally { + setConnecting(false); + } + } + + async function disconnect() { + await setSetting(db, 'api_token', ''); + setConnectMsg(null); + } + + async function resetSyncedData() { + if (!resetArmed) { + setResetArmed(true); + return; + } + const n = await deleteRemoteActivities(db); + setResetArmed(false); + setResetMsg(`Removed ${n} synced ${n === 1 ? 'activity' : 'activities'}`); + setTimeout(() => setResetMsg(null), 3000); + } + + const isConnected = !!storedToken; + + return ( + + Settings + +
+ + + + Connect to a Bincio instance to sync your activities. Leave blank to use + the app offline only. + +
+ + + + {saved ? '✓ Saved' : 'Save'} + + + +
+ {isConnected ? ( + <> + + + Disconnect + + + ) : ( + <> + + + {connecting + ? + : Connect} + + + )} + {connectMsg && ( + + {connectMsg.text} + + )} + + Your password is used once to obtain a session token, then forgotten. + The token is stored locally and sent with each sync request. + +
+ + {Platform.OS === 'android' && ( +
+ {!storedUrl ? ( + + Configure and save a Bincio instance URL above first — it's needed to download the extraction engine. + + ) : ( + <> + setSetting(db, 'auto_import_path', autoPath.trim())} + autoCapitalize="none" + /> + + New FIT files in this folder are imported automatically when you + open the app. Leave blank to disable. Requires storage permission. + + + )} +
+ )} + +
+ Download + + { setSyncMode('summaries'); setSetting(db, 'sync_mode', 'summaries'); }} /> + { setSyncMode('full'); setSetting(db, 'sync_mode', 'full'); }} /> + + + {syncMode === 'full' + ? 'Downloads map route and elevation chart for every activity during sync. Uses more storage and takes longer.' + : 'Syncs activity summaries only. Map and chart are fetched on demand when you open an activity.'} + + Upload + + { setSyncUpload(false); setSetting(db, 'sync_upload', 'false'); }} /> + { setSyncUpload(true); setSetting(db, 'sync_upload', 'true'); }} /> + + + {syncUpload + ? 'Local activities are uploaded to the instance during sync.' + : 'Local activities stay on device only.'} + + Upload format + + { setUploadFormat('raw'); setSetting(db, 'upload_format', 'raw'); }} /> + { setUploadFormat('bas'); setSetting(db, 'upload_format', 'bas'); }} /> + + + {uploadFormat === 'raw' + ? 'Uploads the original FIT/GPX/TCX file. The server re-extracts it with DEM elevation correction and updates your local copy.' + : 'Uploads the pre-extracted JSON. Faster, but no DEM elevation correction.'} + +
+ +
+ + Auto-switches to race colours during Giro, Tour, and Vuelta. Override here for testing. + + + {(['auto', 'default', 'giro', 'tour', 'vuelta'] as PaletteKey[]).map(key => { + const label = key === 'auto' ? 'Auto' : PALETTES[key as keyof typeof PALETTES].label; + const keyAccent = key === 'auto' ? theme.accent : PALETTES[key as keyof typeof PALETTES].accent; + const keyDim = key === 'auto' ? theme.dim : PALETTES[key as keyof typeof PALETTES].dim; + return ( + setPaletteOverride(key)} + /> + ); + })} + +
+ +
+ setResetArmed(false)} + > + + {resetArmed ? 'Tap again to confirm' : 'Reset synced data'} + + + {resetMsg && {resetMsg}} + + Removes all activities synced from the instance. Locally imported files are kept. + +
+ +
+ + +
+
+ ); +} + +function Section({ title, children }: { title: string; children: React.ReactNode }) { + return ( + + {title} + {children} + + ); +} + +function Field({ + label, placeholder, value, onChangeText, ...rest +}: { + label: string; + placeholder: string; + value: string; + onChangeText: (v: string) => void; + [key: string]: unknown; +}) { + return ( + + {label} + + + ); +} + +function ModeButton({ label, active, accent, dim, onPress }: { + label: string; active: boolean; accent: string; dim: string; onPress: () => void; +}) { + return ( + + {label} + + ); +} + +function Row({ label, value }: { label: string; value: string }) { + return ( + + {label} + {value} + + ); +} + +const styles = StyleSheet.create({ + container: { flex: 1, backgroundColor: '#09090b' }, + content: { padding: 16, paddingTop: 60, paddingBottom: 40 }, + header: { color: '#fff', fontSize: 22, fontWeight: '700', marginBottom: 24 }, + section: { marginBottom: 28 }, + sectionTitle: { + color: '#a1a1aa', fontSize: 11, fontWeight: '600', + letterSpacing: 0.8, marginBottom: 8, + }, + sectionBody: { + backgroundColor: '#18181b', borderRadius: 10, + borderWidth: 1, borderColor: '#27272a', overflow: 'hidden', + }, + field: { padding: 14, borderBottomWidth: 1, borderBottomColor: '#27272a' }, + fieldLabel: { color: '#71717a', fontSize: 11, marginBottom: 4 }, + input: { color: '#f4f4f5', fontSize: 15 }, + hint: { color: '#52525b', fontSize: 12, lineHeight: 16, padding: 12 }, + hintWarn: { color: '#a16207' }, + row: { + flexDirection: 'row', justifyContent: 'space-between', + paddingHorizontal: 14, paddingVertical: 12, + borderBottomWidth: 1, borderBottomColor: '#27272a', + }, + rowLabel: { color: '#a1a1aa', fontSize: 14 }, + rowValue: { color: '#71717a', fontSize: 14 }, + saveButton: { + backgroundColor: '#2563eb', borderRadius: 10, + paddingVertical: 14, alignItems: 'center', marginBottom: 28, + }, + saveButtonText: { color: '#fff', fontWeight: '600', fontSize: 16 }, + connectButton: { + backgroundColor: '#059669', borderRadius: 8, margin: 12, + paddingVertical: 12, alignItems: 'center', + }, + connectText: { color: '#fff', fontWeight: '600', fontSize: 15 }, + buttonDisabled: { opacity: 0.5 }, + disconnectButton: { + margin: 12, paddingVertical: 10, alignItems: 'center', + borderRadius: 8, borderWidth: 1, borderColor: '#3f3f46', + }, + disconnectText: { color: '#71717a', fontSize: 14 }, + msgOk: { color: '#86efac', fontSize: 13, paddingHorizontal: 12, paddingBottom: 10 }, + msgErr: { color: '#fca5a5', fontSize: 13, paddingHorizontal: 12, paddingBottom: 10 }, + subLabel: { color: '#52525b', fontSize: 11, fontWeight: '600', letterSpacing: 0.6, paddingHorizontal: 12, paddingTop: 12, paddingBottom: 4 }, + modeRow: { flexDirection: 'row', gap: 8, padding: 12 }, + modeButton: { flex: 1, paddingVertical: 9, borderRadius: 8, borderWidth: 1, borderColor: '#3f3f46', alignItems: 'center' }, + modeButtonText: { color: '#71717a', fontSize: 13, fontWeight: '500' }, + resetButton: { + margin: 12, paddingVertical: 10, alignItems: 'center', + borderRadius: 8, borderWidth: 1, borderColor: '#3f3f46', + }, + resetButtonArmed: { borderColor: '#ef4444', backgroundColor: '#1c0a0a' }, + resetText: { color: '#71717a', fontSize: 14 }, + resetTextArmed: { color: '#ef4444', fontWeight: '600' }, +}); diff --git a/app/_layout.tsx b/app/_layout.tsx new file mode 100644 index 0000000..a129049 --- /dev/null +++ b/app/_layout.tsx @@ -0,0 +1,16 @@ +import { Stack } from 'expo-router'; +import { SQLiteProvider } from 'expo-sqlite'; +import { StatusBar } from 'expo-status-bar'; +import { migrateDb } from '@/db'; +import { ThemeProvider } from '@/ThemeContext'; + +export default function RootLayout() { + return ( + + + + + + + ); +} diff --git a/app/activity/[id].tsx b/app/activity/[id].tsx new file mode 100644 index 0000000..7b3aeb9 --- /dev/null +++ b/app/activity/[id].tsx @@ -0,0 +1,531 @@ +import { Camera, GeoJSONSource, Layer, Map } from '@maplibre/maplibre-react-native'; +import * as FileSystem from 'expo-file-system'; +import { useLocalSearchParams, useRouter } from 'expo-router'; +import { useEffect, useRef, useState } from 'react'; +import { Alert, Modal, Platform, Pressable, ScrollView, StyleSheet, Text, TextInput, View } from 'react-native'; +import Svg, { Defs, LinearGradient, Path, Stop } from 'react-native-svg'; +import { useSQLiteContext } from 'expo-sqlite'; +import { deleteActivity, setActivityTitle, useActivity, useSetting } from '@/db/queries'; +import { useTheme } from '@/ThemeContext'; + +const MAP_STYLE = 'https://basemaps.cartocdn.com/gl/dark-matter-gl-style/style.json'; + +// ── Types ──────────────────────────────────────────────────────────────────── + +type Timeseries = { + t: number[]; + elevation_m: (number | null)[]; + speed_kmh?: (number | null)[] | null; + hr_bpm?: (number | null)[] | null; + cadence_rpm?: (number | null)[] | null; + power_w?: (number | null)[] | null; + lat?: (number | null)[] | null; + lon?: (number | null)[] | null; +}; + +// ── Screen ─────────────────────────────────────────────────────────────────── + +export default function ActivityScreen() { + const { id } = useLocalSearchParams<{ id: string }>(); + const router = useRouter(); + const db = useSQLiteContext(); + const theme = useTheme(); + const row = useActivity(id); + const instanceUrl = useSetting('instance_url')?.replace(/\/$/, '') ?? ''; + const token = useSetting('api_token') ?? ''; + + const [geojson, setGeojson] = useState(null); + const [timeseries, setTimeseries] = useState(null); + const [loadingMap, setLoadingMap] = useState(false); + const [loadingChart, setLoadingChart] = useState(false); + const [editingTitle, setEditingTitle] = useState(false); + const [titleDraft, setTitleDraft] = useState(''); + + async function confirmDelete() { + Alert.alert( + 'Delete activity', + 'This will permanently remove this activity from your device.', + [ + { text: 'Cancel', style: 'cancel' }, + { + text: 'Delete', + style: 'destructive', + onPress: async () => { + const originalPath = await deleteActivity(db, id); + if (originalPath) { + try { await FileSystem.deleteAsync(originalPath, { idempotent: true }); } catch {} + } + router.back(); + }, + }, + ], + ); + } + + // instanceUrl and token are in the dep array to avoid a stale-closure bug in + // release builds: Hermes executes effects sooner and captures empty strings if + // the deps are omitted. Guards on geojson/timeseries prevent double-fetching. + useEffect(() => { + if (!row) return; + + if (row.geojson) { + setGeojson(JSON.parse(row.geojson)); + } else if (row.origin === 'remote' && instanceUrl && token) { + setLoadingMap(true); + fetch(`${instanceUrl}/api/activity/${row.id}/geojson`, { + headers: { Authorization: `Bearer ${token}` }, + }) + .then(r => r.ok ? r.json() : null) + .then(data => { if (data) setGeojson(data); }) + .catch(() => {}) + .finally(() => setLoadingMap(false)); + } + + if (row.timeseries_json) { + setTimeseries(JSON.parse(row.timeseries_json)); + } else if (row.origin === 'remote' && instanceUrl && token) { + setLoadingChart(true); + fetch(`${instanceUrl}/api/activity/${row.id}/timeseries`, { + headers: { Authorization: `Bearer ${token}` }, + }) + .then(r => r.ok ? r.json() : null) + .then(data => { if (data) setTimeseries(data); }) + .catch(() => {}) + .finally(() => setLoadingChart(false)); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [row?.id, instanceUrl, token]); + + if (!row) { + return ( + + Activity not found + + ); + } + + const detail = JSON.parse(row.detail_json); + const edits = row.edits_json ? JSON.parse(row.edits_json) : {}; + const displayTitle = edits.title ?? detail.title; + const canEdit = row.origin === 'local'; + const km = detail.distance_m != null ? (detail.distance_m / 1000).toFixed(2) : null; + const elev = detail.elevation_gain_m != null ? Math.round(detail.elevation_gain_m) : null; + const elevLoss = detail.elevation_loss_m != null ? Math.round(Math.abs(detail.elevation_loss_m)) : null; + const movingTime = detail.moving_time_s != null ? formatDuration(detail.moving_time_s) : null; + const speed = detail.avg_speed_kmh != null ? detail.avg_speed_kmh.toFixed(1) : null; + const hr = detail.avg_hr_bpm != null ? Math.round(detail.avg_hr_bpm) : null; + const power = detail.avg_power_w != null ? Math.round(detail.avg_power_w) : null; + const date = new Date(detail.started_at).toLocaleDateString(undefined, { + weekday: 'long', day: 'numeric', month: 'long', year: 'numeric', + }); + + return ( + + + router.back()}> + ← Back + + + Delete + + + + {detail.sport ?? 'Activity'} + {editingTitle ? ( + { + const trimmed = e.nativeEvent.text.trim(); + if (trimmed && trimmed !== displayTitle) { + setActivityTitle(db, id, trimmed); + } + setEditingTitle(false); + }} + /> + ) : ( + { setTitleDraft(displayTitle); setEditingTitle(true); } : undefined} + style={styles.titleRow} + > + {displayTitle} + {canEdit && } + + )} + {date} + + {/* Map */} + + + {/* Stats grid */} + + {km && } + {movingTime && } + {elev != null && } + {elevLoss != null && } + {speed && } + {hr && } + {power && } + + + {/* Metric charts */} + + + {/* Meta */} + + + + + + + + ); +} + +// ── Map ─────────────────────────────────────────────────────────────────────── + +function RouteMap({ geojson, loading, accent }: { geojson: object | null; loading: boolean; accent: string }) { + const [fullscreen, setFullscreen] = useState(false); + const [currentZoom, setCurrentZoom] = useState(12); + const cameraRef = useRef(null); + + if (loading) { + return ( + + Loading map… + + ); + } + if (!geojson) return null; + + // MapLibre uses OpenGL/SurfaceView which crashes the Karoo's Qualcomm GPU + // driver (Android <29) even without any interaction. Render a pure SVG route + // trace instead — no native GL surface, no crash. + if (Platform.OS === 'android' && (Platform.Version as number) < 29) { + return ; + } + + const bounds = geoJsonBounds(geojson); + const routeSource = ( + + + + ); + const cameraBounds = bounds + ? { bounds, padding: { top: 24, bottom: 24, left: 24, right: 24 } } + : undefined; + + return ( + <> + {/* Thumbnail — tap to expand */} + setFullscreen(true)}> + + {cameraBounds && } + {routeSource} + + + ⤢ tap to explore + + + + {/* Full-screen map with +/- zoom buttons */} + setFullscreen(false)}> + + { + const z = e?.properties?.zoomLevel; + if (typeof z === 'number') setCurrentZoom(z); + }} + > + {cameraBounds && } + {routeSource} + + setFullscreen(false)}> + + + + cameraRef.current?.setCamera({ zoomLevel: currentZoom + 1, animationDuration: 200 })}> + + + + cameraRef.current?.setCamera({ zoomLevel: Math.max(1, currentZoom - 1), animationDuration: 200 })}> + + + + + + + ); +} + +// SVG route trace — used on Android <29 where MapLibre crashes the GPU driver. +// Renders the GPS track as a colored path on a dark background with no tiles. +function SvgRouteView({ geojson, accent }: { geojson: object; accent: string }) { + const W = 320; + const H = 180; + const PAD = 16; + + const all: [number, number][] = []; + function collect(obj: unknown) { + if (!obj || typeof obj !== 'object') return; + const o = obj as Record; + if (o.type === 'Feature') { collect(o.geometry); return; } + if (o.type === 'FeatureCollection') { (o.features as unknown[]).forEach(collect); return; } + if (o.type === 'LineString') { all.push(...(o.coordinates as [number, number][])); return; } + if (o.type === 'MultiLineString') { (o.coordinates as [number, number][][]).forEach(c => all.push(...c)); return; } + } + collect(geojson); + if (!all.length) return null; + + const step = Math.max(1, Math.floor(all.length / 500)); + const pts = all.filter((_, i) => i % step === 0); + + const lons = pts.map(c => c[0]); + const lats = pts.map(c => c[1]); + const minLon = Math.min(...lons), maxLon = Math.max(...lons); + const minLat = Math.min(...lats), maxLat = Math.max(...lats); + const spanLon = maxLon - minLon || 0.001; + const spanLat = maxLat - minLat || 0.001; + + // Correct longitude for latitude (equirectangular) + const midLat = (minLat + maxLat) / 2; + const lonFactor = Math.cos((midLat * Math.PI) / 180); + const adjLon = spanLon * lonFactor; + + const scale = Math.min((W - PAD * 2) / adjLon, (H - PAD * 2) / spanLat); + const offX = (W - adjLon * scale) / 2; + const offY = (H - spanLat * scale) / 2; + + const toX = (lon: number) => offX + (lon - minLon) * lonFactor * scale; + const toY = (lat: number) => H - offY - (lat - minLat) * scale; + + const d = pts.map((c, i) => `${i === 0 ? 'M' : 'L'}${toX(c[0]).toFixed(1)},${toY(c[1]).toFixed(1)}`).join(' '); + + return ( + + + + + + ); +} + +// ── Metric charts ───────────────────────────────────────────────────────────── + +type TabKey = 'elevation' | 'speed' | 'hr' | 'cadence' | 'power'; + +const TAB_META: Record = { + elevation: { label: 'Elevation', unit: 'm', color: '#00c8ff', decimals: 0 }, + speed: { label: 'Speed', unit: 'km/h', color: '#ff6b35', decimals: 1 }, + hr: { label: 'HR', unit: 'bpm', color: '#f87171', decimals: 0 }, + cadence: { label: 'Cadence', unit: 'rpm', color: '#a78bfa', decimals: 0 }, + power: { label: 'Power', unit: 'W', color: '#facc15', decimals: 0 }, +}; + +function MetricCharts({ timeseries, loading, accent }: { timeseries: Timeseries | null; loading: boolean; accent: string }) { + const [activeTab, setActiveTab] = useState('elevation'); + + if (loading) { + return ( + + Loading chart… + + ); + } + if (!timeseries) return null; + + const seriesMap: Record = { + elevation: timeseries.elevation_m, + speed: timeseries.speed_kmh, + hr: timeseries.hr_bpm, + cadence: timeseries.cadence_rpm, + power: timeseries.power_w, + }; + + const available = (Object.keys(TAB_META) as TabKey[]).filter( + k => seriesMap[k]?.some(v => v != null) + ); + + if (!available.length) return null; + + const tab = available.includes(activeTab) ? activeTab : available[0]; + const { color, unit, decimals } = TAB_META[tab]; + const raw = seriesMap[tab]!; + + return ( + + {/* Tab row */} + + {available.map(k => ( + setActiveTab(k)} + > + + {TAB_META[k].label} + + + ))} + + {/* Chart */} + + + ); +} + +function MetricChart({ + times, values, color, unit, decimals, +}: { + times: number[]; + values: (number | null)[]; + color: string; + unit: string; + decimals: number; +}) { + const W = 340; + const H = 100; + const PAD = 4; + + // Downsample to ≤300 points + const step = Math.max(1, Math.floor(values.length / 300)); + const ts = times.filter((_, i) => i % step === 0); + const vs = values.filter((_, i) => i % step === 0).map(v => v ?? 0); + + const minV = Math.min(...vs); + const maxV = Math.max(...vs); + const range = maxV - minV || 1; + const maxT = ts[ts.length - 1] || 1; + + const x = (t: number) => PAD + (t / maxT) * (W - PAD * 2); + const y = (v: number) => PAD + (1 - (v - minV) / range) * (H - PAD * 2); + + const pts = ts.map((t, i) => `${x(t).toFixed(1)},${y(vs[i]).toFixed(1)}`); + const linePath = `M ${pts.join(' L ')}`; + const areaPath = `M ${x(ts[0])},${H} L ${pts.join(' L ')} L ${x(maxT)},${H} Z`; + const gradId = `grad-${color.replace('#', '')}`; + + const fmt = (v: number) => decimals === 0 ? String(Math.round(v)) : v.toFixed(decimals); + + return ( + <> + {fmt(maxV)} {unit} + + + + + + + + + + + {fmt(minV)} {unit} + + ); +} + +// ── Helpers ─────────────────────────────────────────────────────────────────── + +// Returns [west, south, east, north] per LngLatBounds spec +function geoJsonBounds(gj: object): [number, number, number, number] | null { + const coords: [number, number][] = []; + function collect(obj: unknown) { + if (!obj || typeof obj !== 'object') return; + const o = obj as Record; + if (o.type === 'Feature') { collect(o.geometry); return; } + if (o.type === 'FeatureCollection') { (o.features as unknown[]).forEach(collect); return; } + if (o.type === 'LineString') { coords.push(...(o.coordinates as [number, number][])); return; } + if (o.type === 'MultiLineString') { (o.coordinates as [number, number][][]).forEach(c => coords.push(...c)); return; } + } + collect(gj); + if (!coords.length) return null; + const lons = coords.map(c => c[0]); + const lats = coords.map(c => c[1]); + return [Math.min(...lons), Math.min(...lats), Math.max(...lons), Math.max(...lats)]; +} + +function formatDuration(seconds: number): string { + const h = Math.floor(seconds / 3600); + const m = Math.floor((seconds % 3600) / 60); + const s = seconds % 60; + if (h > 0) return `${h}:${String(m).padStart(2, '0')}:${String(s).padStart(2, '0')}`; + return `${m}:${String(s).padStart(2, '0')}`; +} + +function StatCell({ label, value, unit }: { label: string; value: string; unit: string }) { + return ( + + + {value} + {unit ? {unit} : null} + + {label} + + ); +} + +function MetaRow({ label, value }: { label: string; value: string }) { + return ( + + {label} + {value} + + ); +} + +// ── Styles ──────────────────────────────────────────────────────────────────── + +const styles = StyleSheet.create({ + container: { flex: 1, backgroundColor: '#09090b' }, + content: { paddingBottom: 40 }, + center: { flex: 1, alignItems: 'center', justifyContent: 'center', backgroundColor: '#09090b' }, + notFound: { color: '#71717a', fontSize: 16 }, + topBar: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center', paddingTop: 60, paddingBottom: 12 }, + backButton: { paddingHorizontal: 16 }, + backText: { fontSize: 15 }, + deleteButton: { paddingHorizontal: 16 }, + deleteText: { color: '#f87171', fontSize: 15 }, + sport: { color: '#71717a', fontSize: 12, fontWeight: '600', letterSpacing: 0.8, paddingHorizontal: 16, marginBottom: 4 }, + titleRow: { flexDirection: 'row', alignItems: 'center', paddingHorizontal: 16, marginBottom: 4 }, + title: { color: '#f4f4f5', fontSize: 22, fontWeight: '700', flexShrink: 1 }, + titleInput: { color: '#f4f4f5', fontSize: 22, fontWeight: '700', paddingHorizontal: 16, marginBottom: 4, borderBottomWidth: 1, borderBottomColor: '#3b82f6' }, + editHint: { color: '#52525b', fontSize: 16, marginLeft: 8 }, + date: { color: '#71717a', fontSize: 13, paddingHorizontal: 16, marginBottom: 16 }, + mapContainer: { height: 220, marginBottom: 16, borderTopWidth: 1, borderBottomWidth: 1, borderColor: '#27272a' }, + map: { flex: 1 }, + mapPlaceholder: { height: 220, backgroundColor: '#18181b', alignItems: 'center', justifyContent: 'center', borderTopWidth: 1, borderBottomWidth: 1, borderColor: '#27272a', marginBottom: 16 }, + mapExpandHint: { position: 'absolute', bottom: 8, right: 8, backgroundColor: 'rgba(0,0,0,0.55)', borderRadius: 6, paddingHorizontal: 8, paddingVertical: 4 }, + mapExpandText: { color: '#a1a1aa', fontSize: 11 }, + fullscreenMap: { flex: 1, backgroundColor: '#09090b' }, + closeButton: { position: 'absolute', top: 56, right: 16, backgroundColor: 'rgba(0,0,0,0.6)', borderRadius: 20, width: 36, height: 36, alignItems: 'center', justifyContent: 'center' }, + closeText: { color: '#fff', fontSize: 16 }, + zoomButtons: { position: 'absolute', bottom: 40, right: 16, gap: 8 }, + zoomBtn: { backgroundColor: 'rgba(0,0,0,0.65)', borderRadius: 20, width: 40, height: 40, alignItems: 'center', justifyContent: 'center' }, + zoomBtnText: { color: '#fff', fontSize: 22, fontWeight: '600', lineHeight: 28 }, + chartContainer: { marginHorizontal: 16, marginBottom: 16, backgroundColor: '#18181b', borderRadius: 10, borderWidth: 1, borderColor: '#27272a', overflow: 'hidden' }, + chartPlaceholder: { height: 120, backgroundColor: '#18181b', alignItems: 'center', justifyContent: 'center', borderRadius: 10, borderWidth: 1, borderColor: '#27272a', marginHorizontal: 16, marginBottom: 16 }, + chartTabs: { flexDirection: 'row', borderBottomWidth: 1, borderBottomColor: '#27272a' }, + chartTab: { flex: 1, paddingVertical: 8, alignItems: 'center', borderBottomWidth: 2, borderBottomColor: 'transparent' }, + chartTabText: { color: '#52525b', fontSize: 11, fontWeight: '600' }, + chartLabel: { color: '#3f3f46', fontSize: 10, marginBottom: 2, marginHorizontal: 12, marginTop: 10 }, + grid: { flexDirection: 'row', flexWrap: 'wrap', paddingHorizontal: 12, gap: 8, marginBottom: 16 }, + statCell: { backgroundColor: '#18181b', borderRadius: 10, borderWidth: 1, borderColor: '#27272a', padding: 14, width: '47%' }, + statValueRow: { flexDirection: 'row', alignItems: 'baseline', gap: 4, marginBottom: 4 }, + statValue: { color: '#f4f4f5', fontSize: 24, fontWeight: '700' }, + statUnit: { color: '#71717a', fontSize: 13 }, + statLabel: { color: '#71717a', fontSize: 12 }, + meta: { marginHorizontal: 16, backgroundColor: '#18181b', borderRadius: 10, borderWidth: 1, borderColor: '#27272a' }, + metaRow: { flexDirection: 'row', justifyContent: 'space-between', paddingHorizontal: 14, paddingVertical: 10, borderBottomWidth: 1, borderBottomColor: '#27272a' }, + metaLabel: { color: '#71717a', fontSize: 13 }, + metaValue: { color: '#a1a1aa', fontSize: 13 }, +}); diff --git a/assets/adaptive-icon.png b/assets/adaptive-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..e33e136c7d7dd677c89c245e00a1ce3cf46e9d78 GIT binary patch literal 15024 zcmeHt30G5R*Y*KK91yH+MJo~e7)3-yMFqlS9f}DUgS<9tM&bjYB?`vQCT=~Jr zW5K*{<{=2OfVgLuFM`a1f6hYY%!a=hINOT|LWn2s`fmTZyy5P-m34lBR@xEfG3&#t zXU(zyd&Qj4@4vbIv!TuAujVXV6lY4MNIR#yIuArd4Bsxl$hD~B2h~v`MoR78?VeLQ zXN}?Ji$*IhEZ(&+gSh>}ciZMF+<40HpXcIH)G3TR(amlh%NzJ9YX%K&cXC4O1S1r| zO_1W>pMNdzuLb_Kz`qvwzia_N&ng<~SYmgQOZHYJbEBie>ywPFf=Q}uJljY0NB4ld zpPZf)J~8^Zdm!zWZ~Z?Cqp_{mq>ZZ*fhHU@RTIqJ<&C_zp z#Of(sb5gCXNa|^`?=YgK{+*N*w#XO}o_S=1RPKmFqAYtdWzRFGCN;iIW$DP^lZ}zo zGU>}`m)(7PYg&)j<B(%L;jTzVIam(|BX_RAWggAZ=z~IAX+rBF`|LF^}T#!;kUBY)D zsy-P%=)RbGCh@A|TjT=>B+T>jOG%Dry8m9T&!s40SW7EEl3$Py{;g<_RV+lJ?;}Xa zjpCa!cYHzwS7X3!5PG?+YJRr_5pMbcK{kf<=E=&-C2Veaj;Wd7ktO^I@3Za3>)Qgs zLTT6)-@_G)J{Zk3;HiI<_Y}r18GOCyG8)JVL=eApFdC;anc3b>5%491n})(*7acoN z>=<_b>ZlBCaSv?av=>22@ZukYR%F%H8?%JLG%w~pi^}DN)(PR5fOkQ_E6Z=nV#_7| z-?zOmF|6f&(Lx z4=Pr){XIpzmE@z(**CY1FiRMKy(!9^=hSF*l^v6|C8Kv;P!(PoP z{yy;pH+HR2$d&QXX*4vyoq%i~`3gaXil{!SG44*`cgvm)KTjX(f0L;=+(kP*|I^mV zZ|4f#oNFZ7H2>5Tqc}aQ{#kCM;p8~TL#s$*I3mJO*K!FVFmtx&XvUCT17c7=+ZaKn zBdeExl9x;NQB2PFLq<wO!kHbI*a-#smS1) zxm+V8U_n@hZ_lx(OiILCovC1`aVs+~Lq@5wc-&sy65P8{be)+Om)*+WbGE1(&6g!c za9h`MYTq8&=+RJ_ANMe?o8V#1H@F7brG_}&xRaBSBWtcn>-UXt-74b7TZxa&)C{>5 zoPJ^*#_%$3LLWeQWt=^u*cfH{f^^o^HZyfW|G4@&P4h*B!KXK1pv2+~)fK$B(LcSm z@0B1pBEM&0uaig@Zxx2GI(lnZNz@-=qTp)B+0*qp)K}bE9GyPH=3Ye9&rA`d_y?Q! zOy4GFl8w6`X(`F3x6FClCv#@)M$v#pb&PwZ^lO9CP1mIU)rKQQl?#x*dEm*)CX$WS zI?ha*Z`0BEXk%7}j6>XTsBLo)W32%tHRWifwpCFrINN%-%f}-dsWfH$fJAwbY=YNv z0``*KYWkd$V~iKs3(djn_YQ{=CG6RV~sTQXy- zz2CW)nHl&!-56Dvqj zwaoEts$sf>$FJ*awh#Cy@QbMPQ7rtl)y3_~$V=OapAL7i{&AkuX9t#W+|SA24c##I z@;~FgvGjdCYxqq}ap5q^xTW`c|MyWWXf8oDSh<&!aFm&7ozUEJYbNm|mlHduvKFkf z)4{6iWm6JED}%yw1AA~EX=+fppqckP{4F(8riZY<8K7(TbkdCD-Mi%**!EE4`mrFr z4IN_7O<%WM*>A)k`+FRBek@Y?0M4Y&w2p-T$f`KRJITEIiv1-sPfVD#-5k@a%D2fP z-Gw0X4|_Bd)=nvO_@eEq$#7huy3dx#dN{2JDprGQFP|rd;LV|E9)90rLGV`ZvWxiRK%Rggy)t^2*{AjCQ-Tbq3f-y67=u&LA*vp zQuB5$lIRJIz?_a3jTBJ%kOX&P=M0{jM#r`(-VE4HJHTHtD}^JVch7Slq{APoSB@>` zRC-dpHp~q1h8(HLue*}md2>b=6mO7+RTEEmruqj`LLk$kfNFjkms028sv8MiHf_S3 z>1>&oVr|wxj@2>>#7bMbRY#zWq{xJCCe(N42fMrLmO#t@T0c>Jh}V-ZTQ6_b#PQRR zp;b^&y4P@O?L}8#@s>#_)VG9Li4kjWN2b#Y(biCl6e%bT73H>rJFC8%8;gufjOC5~ zAb$I@E~h|~gJO27dH;ABb}w|Ewwu095zc}y`jlLw62|2-&VkeM2R@9c8HCxNJcvD6 z`n)Vz-v2&(ZO+ws< zdTz7WbeF`^pybh$dgoSe)qC|o1#vmniS}Y}ps06HJ@4Ta!<2ifU-A4Lu^MfbKJa7j zQK{5&XMYpKk%W0|KWQq48DB`Ahm4<@Mz`elZ*80$8K;@{U1_Lv{R7(RJ?NLW!>B}d zWE%l#cDN>0tah^1ozot#BS-?BTFI&~`Iz9n2Ozen{g4XkA@f&-Q2#^hT>dB>DKDyn z!U$1aN({ssmJuDa!D5t|Of4Y%-lL(J|J(qswp8A3mp*cL&bxSZR!u zoWmT{-Y*`vD>D;r2GME6<+=2LvO_#Gt>AG`nn4$R2|o-9Zd4X#sp3XMp&4S<>_qel z>HzN~?rt=4OU$W*a{Bq#_ub==5_2iqTMCI0)g~A`URRA5MT-lq;pit2s%BTAu=RMy z$4oqfbGo2pWXS0Aae9Z$qe$WEgk6AkQg=hHkI>d3v^v(W3Cmt(7Fzwo({@Pn#WFtrk#WDwQ%`POA(c6^1I@E>)V4(%rf(e?}8 zLUGN<3o_kokd&ub2`ZIx+^Lbcl=n-X4Lev@QMIEj5E$=Q>Rl5dFd7ec(LKR-CZ7Sb zGF!g}aol4OQ<3MfNypgGh^)SBV0abF3eR$h+)JG=&OAZTI#W_ZmIBVX{-PpV5aE!G z?l~LsfrYIz>CwGOb{ci7cMHP-UsOA{j*zBg!zTbeaEqE9Q`T{n_!A&mK2-r%2# zIIj7e=fm<=YPp&4u6oN1wYpO!U%)_5m~H2^M-XNs>n?-of;0z_+PksHt;0+B;O!Xg zXbvc$KOmS=PSE#h)q~(l9%eW!5uD2<5!MMI+RdkRj6;fr>z<{jKX{c^SZ>xfx+x_+ z-35BUe;@QnBb_B_RnVxz{8K|V(Q@?YQ+(?Q+T+a3^2Yg4#KS159S{7hh^mij`FGHyuz{cvi!r~GT!)@vWbnBisB}cFRtq$0w93+G z4N(Gc&C(9Cxo)cX#f$IBbbf|PDfu=_07m;&R;%tO6LL?Fc6HZYUk-P-u;A{<*A%js zs$1ULiXG-8oni zEH6M?-!Bn9*?@#dAZB9jNC>B=(Z}k6yS`1O4@bwGLJ z4AR2HET6<+`g7dTx>#iK(Qp3afQy#zP9vkGHNW+7m5{uW5i8#m#}4=1^NqKYSG z_io_SK8&5S_#Qx*VB+S2V1NUbhM>0h8%lHJ-#s=sx(&VZzs`&&pG{Nu--OzDQQm%) zndFvCYk}kgupxYiC10mISyiGQaPYLTJB7ROv~oqVoL2H4V*Ib-S%WY4A8@M&y^msg zXHyhL%$Y_X!7SJ1#E{F-^zx?}XSJJL4>5wY1AvSSu-dnatEnKe*vE48y}5pwzI3R< zi;w2aFz%`Qr$C5kdGD4vpZ3Yc|2qX1ZveSHiX{Z^S9D?+^_LAlrq67Lm?DuI(CU0W zBOzCFvZiKHNqc*nm}`cVLaOxbc>|zG$MZT{=#!~0^t7R##9au5?Asrg?4cdKgXjI7 zN4IuPxMF+)5mVm zYfs&2ls&KNZ6}momdspS7_r)^2$K+-Wj7U-2LV-ZfUAkEnTw|7zC7z@D`G%Uy`WzgU&%}%QrwuF>HLYsJsUz!!L>YbMd>|jgD7b6EI~nzD+T+5VL-- z$+@`oifBkf3wwsEmC?EXop9R$;Pff}ENAVHNDk*}8c%Y?PiA^My`Kx@rkT`EZqxyr zP$^-~RZWIEv{;M^nvU1eq>&}zJl-FP-)QGVU80>VG#CUoYl+HynLpEIjflV6Y1P<- zs{08F{q`@c-_{eAIdrd@n4p{Qvu+s7L}|OHMqh&i>lXu0w7jU?r=duhCCiOtkJKji zGg9%ZnpIbcFE((J{s8-O`R^EHXnUT7kE)g%^HX4o9*>0hkEfUzRBoP!q%4I4+#AVV zIv0U@OhhcsmC-V%T#~&miX!8x(!>^%-=n|G>}N74q-^Dm)SckybQlrds$S5v=zHh} z@o*qNy=$dTX*j9J!U`H-R=R_v`o75_%k!Rb)R{s<#7ugWnb-MpGb#ZCgxwm*##tcb z<6L;p(C(wE z#FY9O%3f7&v1a;?T>F=A(-xfN4S)_K{F)u57VOTz#HxcJLIW`g%v8LHEqjQDc120h3o zg2||UT`ZW`HOyhC#6#@zb2MfL3?W9Vs_^IrQ9jA0^(1aK(`B1T<4n2Y?xoTWorhjo zNDN|qmcj$1u=J8nqa%1eOuVTu&H0;L@ZqDufYDEmd$cwpN~dem8VtG}!n*TBBT>1R zG{y35^6*bR?+K3mAU-tm;($#4)~>a8f#LAYKxlf9mTKiKV$Tl|IuS(?2v0UU3QF63 zso=|z7s~++v5Bfz>Im0sQdYf3itB*MA|!fa{zH8uu_q`ZIhm`Op(u#loew8iuinlJ z$kM$Y+mzyuPl$rHnh6kpqr(JQg|13qa5cSeDAd=4h0|e6_~MCo4ji7-(rLnyvE4*B zHXS2;gd7m2<&8IUW?D`XQWUN2lm*g%)-1?hKXDbxs`aB(EM=K9zFG}7g};JcvkQ#U zXU!m9z3P>RIuaaG9B$c9EVj-c7bP-IiilyUd7=+u2*}@*E zQsN&|?Dhy=SUwxR4sOJrKgI})-_pl;O#!ORbPOgCIi-n84ju=e=iM;K`&HHjaR=(H z>)y&t@?*x2L@tO*UeTDS2`2N{Jy3VNu&SXlIfN;VFALZz z68onPdO>VpfY2Ley$(OXB{wLFet(n0+cxY84&uXvR}%a4i`vzq)K@$W1oARZBnQ)} z)yGqnM^T6)xb0NjWjX{^ubVq(#8bf92(<{T zISvFWqHj{)onc5Qi~=C=tmXiPeL^~Z(b<0+8vZC!b8huhbP>(r(0{E2`okY7?_ z&)ZQ$*CdF^g}x~(IdGuu1n?V=B(y(wclwK;j8naWy-+r~Ddo#_j7%wE_=Mx2!#Li{ z*t{VAAI0xbaC_~h&-|n8@2nwy$ke&GUaCIB%nkT3_B_37$KII%g`2j7z~Cip!^%&^eq^E+*rQ5QbPE8w)j)2ROzOyO|+kJ zV0NvUe&0h3dSq)*plI(f!q}B94_%W-)#zFX$PoxdDYMHpSqsBa&zaI79bK_Ps0S}b zT>|ROM`coz#siKqdE%~CPh9@1j9$|{%X6C!r5)yKhI~n zgV5F^s|Qw1#RGboZortr3aBF_8-Xur>W**I&h!9xQ8IHzfv0xV?LBl?e&SPFx!L2M zNR;sgdOvVf#|tK;$P4L$oLP>T?{D~jCK_`+ZP2O=RZ91|^YSFc)wGEb1~cjTxTICqcGDKsPW@OJ(0;@7ybtt z#?^p1``Xz03H7n@`9zkK@We|~KR;xxr@@V%pw#dDku-JC=DoG2jd(?!pgi%*Xi-aM z@;7D^LllLGdok)$od2WNkyEFG0iU~JF9*J!dU(GSkd?1up^%PQ@fgX5XUp*#7^J$p z?q*MorkpSl!UpK^opVu4X-q{$0cv#*q6t8vx1eC@+BBe6I?OS>18m+Wb23Ic>#pc8 z$&Z}RrZ3eKxf&@YwNDt>_BMy^C~AgKz+x4uLm3dH@iy;8HTMjt?00@gJJ;%?%MVE7 zEnw^vmovgRcC9eGM7wVjcSaL>&!~TfGS~?rnS?QLaFd3p-0Ix{bVqik+_AyD%-jh1Hf*OWp~~ zP{ED;`BIcA(vb*yRQr+=8jEL5R<$(7EE6&S8TZ>?lS)@5goG)=Cwm_!&|&-t4m0hK z>)bmlDjal)Da=rXaWWW=3*P3wym@}$HD%-_VOC@4;3-`}k>Z);+gnF~79xo33aJ=- zu`U-J6?xN_zFE{uR6T7uy5e>qVh{YhToF&#s#MQuTOl^|mPX)>R6wrV+etQdMAh&3 z;63Q_!xq9*u6Pmmm4y^F@3~4q51p+6)4+Wt0hsW9q=ZnW$BSduLP0n#W%nr*?NYW7 zOu|6`x}TwX2&0;AMRY1>e`fi~_so*{^xQ+!LVkEQD6PyY~~ zxeGNb6l;pMoD4KaRwbAA7L~Jr4J+-|o5Qq~iUD3rZ*m9fs3RoDCmQ4fG{P~v1hHn7 zc^*Je&OTu57!Dd82jhymZ$HSP=SvBQpU7Bp#VkKVb_KGv89;2vEeKbivxl{szbOiU z-+fK6ZK2_g6>Y6k)y=hZ#9+s^z^Vzk`ouSD2bOH_U4Bcp7-O5y34w5mh)ubOp{@#& z4TE{?n|U2Y9>9aPADgst%`J9zg?T;X5Z0-?$-~O$%9q)|Fi^G=ARH8{5>6>BKgF&= zQjDOGhDd;M_f|1Dz0O>JaH(ge*JGl>{1-A8W|eKpv^@$W;9D`8 zJ--1tZ-l8Z4x0e7>VjH+o@?~!4b+B0{6y)7mM2cY!NHUovJ~s4Pg^lCTmzbw zE@rya{{LU_R!tq$Mi1lTBXAc4&{|HcxwrmJ%k_~%ecLf8@RM(oAG6jmxjIaN%y8_} zyIN=)?bCX?0}P@9u!BYO#f6E$kOe=|v7K@vADr6(m0$+?=fTcRDJQJAQ1)l;mEj{Ed%1=$;qzhJkmUe|_Z-uz2fi;q zFc2>-g|lrxvkPO`yC>+j$<@gUWct(+K5QWCxzWNiu$6G!01m(PAy6(JrkHd@TfoNI zq|XN;Fzx27&jUOsAxta#SoJ-|?BEB=wYqmHQ$e$DVB6c>Hk_n&B5N@_x5BKXv3{jU z4qi5JieJLFKIq+d5VOQx^FsG|DRHLgQDS7C3|N7b1c=a*T@0pMa9Q*dIP@gb!~fjk zXB)ToeMV7tm(NGqk%~=$xfLhXi4BJnu)#kf;d~L0D8fa_YjvYX>J~`RLwENvU0})& zp=0)Znfc1f8M)E%Una&wH~rTaXO-R>( zz9$lcagj1-3wh5Wtzz=TGh^Y8AI$b5@H+>o>v75>kC<~~f0;15XpqjF*oDQ_z>WDc z{o<0KP@M*=n>%Bdq>HVLg)cwCM$f)>ip}w}p4y|0$%JlM3NpH3GRE$Rqn-rwL$NJf zm9SqMeHdagx#rb}Djcu7Y(CPr7Ra%ZU9L)G@~i?$Jl6g0##KHxGeMo*lz5;qB3=oW zfTFVztNb9I?Zj8ebe*nOj3y)oGR+If|6T72T|V1Ax6s|S$E(BAjsjpL{>Mx$oKEI*>qE>9C8ILvfg7%P)E&r(L^XCBKjXiIk| zs*0fR_igxi&Kp#%UyZ36%~Su;UU(T+w(5awxbPp?GZY#2MK)9p$69>VW&qDz-5XJN zf=MN@^|wJ&7_atg)sqDSe@P4+&%qn(i9Ow;ot?%=fDLw_>R0uNoaK6!#bnsGZCO}0 z0oG#_8!~J%)U?gN>-9)@HE$G-N7{2 zzJOPIz`%)h^ZQ^=7X(3f+Z~INy93j_d}H@n5Cuf0ARoKbiglCz|CY|$&y^5(2;E2; znO!j4M-9gvxl?dr!1}%&e5*19S0};M6U^Fs{pE4XkWcMcXk92x?^=;e3$uCuC3ok# z*ZW?vg8?J5p=qxa!*rGkjYJK3UjO;o5pO||lptIL@E)Tk^jUgAFwJdt)b$r>-y1A| zN3zN(ii_!8wmRA&(0c2Acd<`eCWQP;%*DM^zmj2Q3I+;a*pwd$c$pf_ z(qk0np+C!S;mO{;tX_g}ho(}8)`6-Th!{1bKq5i#G1?UzICb8AAk_eg-nxKa9j_g) zl^EPQ4#DYt_PEx*!fg9K7|$zrGf(ipf>9u43O?7^C`v1&QrB~8`LRD66BrKNwGMEz z161%sB}Pb!lU9y*Aoj8(aH;Dm-PHB&E$7Bx1JQwQ8C$8N&1{S$pTHT0V=4FGHN}c8 zBg&;Pk-a25c?E1Aov6&y1As*W2Z5Z6jcc$!?+Q!LkZnM+`lx!vg3MdKZk>cDhJnAj zHM3Z~lV@UBuDYy`=N@;@#&)k+sT74x%^zCv6xyS6hv0b*_bFor8hHSS0b+lb2sSVx z_WVlEhhcviB!5|`33T%+)yP14m%VQKqTKtiV&Qys2fm%mIE997Xg~nJL_*qQOVSU0 zf7C>vANqjZbfp@xik96~IrzhS0W7|I{%dYMQJJN8Ia(T|Ns{D#4`C5wJXqwcH|$#bc`WS& zu-JB;qBza0brXHL*-rcxJ<(`5J*s9LnRX9uE+qsnZ$J){p$QG{;Kt_5fcbJA8w-XW zeiC=&1hhU9(;Bugu#%)waTkhR9Yjy%?O($Gp9M7V662-!b2ViYh20SA_aN%!;2RTO zQWPr4@1@KD2i>Te%{u|3*a_%GwO-=ZPJmGcmab5gykAoUcO+W#bof-v$zH#CX3V!K zlLGI7Kga`mHuR9vz9mQ-4xR-PTU&yMl~h=I9--gvaWmjvC<0eNie`K-OJ92yT=IMD zoa67Ni1m4NY?6hQiGk&M?A-#1mJ9IgV_D{^s)?3N{Z*oVFIaj!!zZ{9i_$TecnaR# z766WP9P9QIZWafxqm8@$J*nLiyOBS#K*}(+7{`dh<;W1d& z1B2XChf%F=C5a~q6W037tv8ptgMWM>YR(fQ+4|Zjkgymee1C~ZV|}4o54G+nWNtvkq@1( zCP&mfQ$6mMpq*MpWmFx^#xw=eB8K^RXk%nBQ}#feYziMvCBmN;(Xt3l&(+lhHMOnl zIZ0hwD;C85Zt+Fufc|)lclxx_vUO7mYkmq$rPHptnm-55UlJN@G(wR2`VkvWtz-vI z^oHTe+C8pj_iH?BBJhc^I(!-sM3|t+WGB5kLshz19yNUVS8wC()PmC<;DQz@2$RIL zD5ORjrMLod4&28tc=WX)?uyCqZ13?8u~2Q2pmSQ{XnVGzF9`vP6DvAP zVS}|4^3@`}c1?1$DY6)<4iY@Pleioh)?!_M_~*|;0){N8KoY^6eOC>O+iPGGKY`(V z4#xUy4jh{(@oh?6-}KwZ*lF|$PvYvl;t(r1IEFb|Gq6 zag`AK&%Sh*yKrwGcA$f}N+}2?O?hxK`r#el0D{Ru&KD8^73UATyX;xx<@Z|Hx3Zf_}_qhZ^PLk*x44XK4&V1TAOtbjPi$tVR9rCYfLpq|vbeM5n}c;DMF@K4WV zIo`^<*U~8E5{C4S@w!|!f|A&U$2ZN4_<^4r0kOJ+5T3`QO#2L=0Gx&b@c1*H7MIf% zz$lSyMu24$Y`!MlJpA`yjQ1&Y;CI)eu~lq+A~tgN^?~sZGUZn~8J=egeVgnlsqf}t zGe039w{>*_^t_?`_Mv&rENEf#F&f?`h$&+M{{Wkg7dmla5Fd4iO)1vA#+xDPo78og z_1&wk;2axyt4aLsMP;9~-4h|LFJLc)4dRU$MCf`k>Fz9A3O@S-ZT2@g@`V&_ z>^^YH@hqgUl3uJCD#M#oK>+&a<}4=C|05bE*@R{K0w2845BtI@OQz2+&XuEO+ft7r z5M72?qkW^^H6ALCr4u75q$xK)?Q;r`j544(XXC!x2as#+)#e#d{_zYaL*N=X;78h&pZx6dndt>Mch@a5X+c1T zyXC7FW*+^G)~!dIFkTEEe{_gPw-+Tk2VXaV&VcRI8yINu_sTqzNVE5OR=uaBi!it zu++q{OZZmsQ;cddcQ@znB-t(|GpZBX{*kB zDcg;4KV!4b`O{X=#)qhEmv4TnC-Yc0Wxe;&Km=^~@6W#$_}2peTHs#`{NK00W(Ml6 X8xov-TygsmrVVko&#vMfAs7A!uHVUy literal 0 HcmV?d00001 diff --git a/assets/bincio.whl b/assets/bincio.whl new file mode 100644 index 0000000000000000000000000000000000000000..18bdd2e159cf8b914ea611b2aa98f28e166e6f05 GIT binary patch literal 60977 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 literal 0 HcmV?d00001 diff --git a/assets/icon.png b/assets/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..e76ce4da1dda0b67c7d6e620be9371ebfd120fb2 GIT binary patch literal 27179 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 M)am!K!@k%4AN-r9>i_@% literal 0 HcmV?d00001 diff --git a/babel.config.js b/babel.config.js new file mode 100644 index 0000000..9d89e13 --- /dev/null +++ b/babel.config.js @@ -0,0 +1,6 @@ +module.exports = function (api) { + api.cache(true); + return { + presets: ['babel-preset-expo'], + }; +}; diff --git a/components/ActivityCard.tsx b/components/ActivityCard.tsx new file mode 100644 index 0000000..6206d1f --- /dev/null +++ b/components/ActivityCard.tsx @@ -0,0 +1,108 @@ +import { useRouter } from 'expo-router'; +import { Pressable, StyleSheet, Text, View } from 'react-native'; +import type { ActivitySummary } from '@/db/queries'; +import { useTheme } from '@/ThemeContext'; + +export function ActivityCard({ + activity, + selecting, + checked, + onToggleSelect, + onLongPress, +}: { + activity: ActivitySummary; + selecting: boolean; + checked: boolean; + onToggleSelect: () => void; + onLongPress: () => void; +}) { + const router = useRouter(); + const theme = useTheme(); + const km = activity.distance_m != null ? (activity.distance_m / 1000).toFixed(1) : null; + const elev = activity.elevation_gain_m != null ? Math.round(activity.elevation_gain_m) : null; + const date = new Date(activity.started_at).toLocaleDateString(undefined, { + day: 'numeric', month: 'short', year: 'numeric', + }); + + function handlePress() { + if (selecting) onToggleSelect(); + else router.push(`/activity/${activity.id}`); + } + + return ( + + + + {selecting && ( + + {checked && } + + )} + {sportIcon(activity.sport)} + + + {date} + {activity.origin === 'remote' + ? cloud + : !activity.synced_at && local + } + + + {activity.user_title ?? activity.title} + + {km && } + {elev != null && } + + + ); +} + +export function Stat({ label, value }: { label: string; value: string }) { + return ( + + {value} + {label} + + ); +} + +export function sportIcon(sport: string): string { + const icons: Record = { + cycling: '🚴', running: '🏃', hiking: '🥾', swimming: '🏊', walking: '🚶', + }; + return icons[sport] ?? '🏅'; +} + +const styles = StyleSheet.create({ + card: { + backgroundColor: '#18181b', borderRadius: 12, + padding: 16, borderWidth: 1, borderColor: '#27272a', + }, + cardTop: { flexDirection: 'row', justifyContent: 'space-between', marginBottom: 6 }, + cardLeft: { flexDirection: 'row', alignItems: 'center', gap: 10 }, + sportIcon: { fontSize: 20 }, + cardMeta: { flexDirection: 'row', alignItems: 'center', gap: 8 }, + cardDate: { color: '#71717a', fontSize: 12 }, + remoteBadge: { + fontSize: 10, borderWidth: 1, + borderRadius: 4, paddingHorizontal: 4, + }, + localBadge: { + color: '#a1a1aa', fontSize: 10, borderWidth: 1, + borderColor: '#3f3f46', borderRadius: 4, paddingHorizontal: 4, + }, + cardTitle: { color: '#f4f4f5', fontSize: 15, fontWeight: '600', marginBottom: 10 }, + cardStats: { flexDirection: 'row', gap: 16 }, + stat: { flexDirection: 'row', alignItems: 'baseline', gap: 3 }, + statValue: { color: '#f4f4f5', fontSize: 16, fontWeight: '600' }, + statLabel: { color: '#71717a', fontSize: 12 }, + checkbox: { + width: 20, height: 20, borderRadius: 4, borderWidth: 1.5, + borderColor: '#52525b', alignItems: 'center', justifyContent: 'center', + }, + checkmark: { color: '#fff', fontSize: 12, fontWeight: '700' }, +}); diff --git a/db/index.ts b/db/index.ts new file mode 100644 index 0000000..97e022b --- /dev/null +++ b/db/index.ts @@ -0,0 +1,47 @@ +import type { SQLiteDatabase } from 'expo-sqlite'; + +export async function migrateDb(db: SQLiteDatabase): Promise { + await db.execAsync('PRAGMA journal_mode = WAL;'); + await db.execAsync(` + CREATE TABLE IF NOT EXISTS activities ( + id TEXT PRIMARY KEY, + source_hash TEXT NOT NULL, + detail_json TEXT NOT NULL, + timeseries_json TEXT, + geojson TEXT, + original_path TEXT, + synced_at INTEGER, + origin TEXT NOT NULL CHECK(origin IN ('local', 'remote')), + created_at INTEGER NOT NULL DEFAULT (unixepoch()) + ); + + CREATE INDEX IF NOT EXISTS idx_activities_created_at + ON activities(created_at DESC); + + CREATE TABLE IF NOT EXISTS settings ( + key TEXT PRIMARY KEY, + value TEXT NOT NULL + ); + `); + + // Migration v2: source_path stores the original filesystem path a file was + // imported from (e.g. /sdcard/Karoo/Rides/ride.fit), used for watch-folder + // deduplication without re-hashing files. + try { + await db.execAsync('ALTER TABLE activities ADD COLUMN source_path TEXT'); + await db.execAsync( + 'CREATE INDEX IF NOT EXISTS idx_activities_source_path ON activities(source_path)', + ); + } catch { + // Column already exists — migration already ran, ignore. + } + + // Migration v3: edits_json stores user overrides (e.g. {"title": "My title"}) + // kept separate from detail_json so server re-extraction (Option A) never + // clobbers user edits. + try { + await db.execAsync('ALTER TABLE activities ADD COLUMN edits_json TEXT'); + } catch { + // Column already exists — migration already ran, ignore. + } +} diff --git a/db/queries.ts b/db/queries.ts new file mode 100644 index 0000000..deb3607 --- /dev/null +++ b/db/queries.ts @@ -0,0 +1,264 @@ +import { useSQLiteContext } from 'expo-sqlite'; + +// ── Types ────────────────────────────────────────────────────────────────── + +export type ActivityRow = { + id: string; + source_hash: string; + detail_json: string; + timeseries_json: string | null; + geojson: string | null; + original_path: string | null; + source_path: string | null; + synced_at: number | null; + origin: 'local' | 'remote'; + created_at: number; + edits_json: string | null; +}; + +export type ActivitySummary = { + id: string; + title: string; + user_title: string | null; // from edits_json; takes display priority over title + sport: string; + started_at: string; + distance_m: number | null; + duration_s: number | null; + elevation_gain_m: number | null; + origin: 'local' | 'remote'; + synced_at: number | null; +}; + +// ── Activities ───────────────────────────────────────────────────────────── + +const PAGE_SIZE = 50; + +export function useActivities(searchQuery = '', limit = PAGE_SIZE): ActivitySummary[] { + const db = useSQLiteContext(); + const like = `%${searchQuery}%`; + const rows = db.getAllSync(` + SELECT + id, origin, synced_at, + json_extract(detail_json, '$.title') AS title, + json_extract(edits_json, '$.title') AS user_title, + json_extract(detail_json, '$.sport') AS sport, + json_extract(detail_json, '$.started_at') AS started_at, + json_extract(detail_json, '$.distance_m') AS distance_m, + json_extract(detail_json, '$.duration_s') AS duration_s, + json_extract(detail_json, '$.elevation_gain_m') AS elevation_gain_m + FROM activities + WHERE (? = '' OR json_extract(detail_json, '$.title') LIKE ?) + ORDER BY json_extract(detail_json, '$.started_at') DESC + LIMIT ? + `, [searchQuery, like, limit]); + return rows; +} + +export function useActivityCount(searchQuery = ''): number { + const db = useSQLiteContext(); + const like = `%${searchQuery}%`; + const row = db.getFirstSync<{ n: number }>( + `SELECT COUNT(*) as n FROM activities + WHERE (? = '' OR json_extract(detail_json, '$.title') LIKE ?)`, + [searchQuery, like], + ); + return row?.n ?? 0; +} + +export { PAGE_SIZE }; + +export type ActivityFilter = { + sport: string; // '' = all sports + dateFrom: string; // '' = no lower bound; ISO-like 'YYYY-MM-DDTHHMMSSZ' for comparison + dateTo: string; // '' = no upper bound + sort: 'date' | 'distance' | 'elevation'; +}; + +const SORT_SQL: Record = { + date: "json_extract(detail_json, '$.started_at') DESC", + distance: "json_extract(detail_json, '$.distance_m') DESC", + elevation: "json_extract(detail_json, '$.elevation_gain_m') DESC", +}; + +export function useFilteredActivities(filter: ActivityFilter, limit = PAGE_SIZE): ActivitySummary[] { + const db = useSQLiteContext(); + const order = SORT_SQL[filter.sort] ?? SORT_SQL.date; + return db.getAllSync(` + SELECT + id, origin, synced_at, + json_extract(detail_json, '$.title') AS title, + json_extract(edits_json, '$.title') AS user_title, + json_extract(detail_json, '$.sport') AS sport, + json_extract(detail_json, '$.started_at') AS started_at, + json_extract(detail_json, '$.distance_m') AS distance_m, + json_extract(detail_json, '$.duration_s') AS duration_s, + json_extract(detail_json, '$.elevation_gain_m') AS elevation_gain_m + FROM activities + WHERE (? = '' OR json_extract(detail_json, '$.sport') = ?) + AND (? = '' OR json_extract(detail_json, '$.started_at') >= ?) + AND (? = '' OR json_extract(detail_json, '$.started_at') < ?) + ORDER BY ${order} + LIMIT ? + `, [filter.sport, filter.sport, filter.dateFrom, filter.dateFrom, filter.dateTo, filter.dateTo, limit]); +} + +export function useFilteredCount(filter: ActivityFilter): number { + const db = useSQLiteContext(); + const row = db.getFirstSync<{ n: number }>(` + SELECT COUNT(*) as n FROM activities + WHERE (? = '' OR json_extract(detail_json, '$.sport') = ?) + AND (? = '' OR json_extract(detail_json, '$.started_at') >= ?) + AND (? = '' OR json_extract(detail_json, '$.started_at') < ?) + `, [filter.sport, filter.sport, filter.dateFrom, filter.dateFrom, filter.dateTo, filter.dateTo]); + return row?.n ?? 0; +} + +export function useActivityYears(): string[] { + const db = useSQLiteContext(); + const rows = db.getAllSync<{ year: string }>( + `SELECT DISTINCT substr(json_extract(detail_json, '$.started_at'), 1, 4) AS year + FROM activities + WHERE json_extract(detail_json, '$.started_at') IS NOT NULL + ORDER BY year DESC`, + ); + return rows.map(r => r.year).filter(Boolean); +} + +export function useActivity(id: string): ActivityRow | null { + const db = useSQLiteContext(); + return db.getFirstSync( + 'SELECT * FROM activities WHERE id = ?', + [id], + ) ?? null; +} + +export async function insertActivity( + db: ReturnType, + row: Pick + & { source_path?: string | null }, +): Promise { + await db.runAsync( + `INSERT OR IGNORE INTO activities + (id, source_hash, detail_json, timeseries_json, geojson, original_path, source_path, origin) + VALUES (?, ?, ?, ?, ?, ?, ?, ?)`, + [ + row.id, + row.source_hash, + row.detail_json, + row.timeseries_json ?? null, + row.geojson ?? null, + row.original_path ?? null, + row.source_path ?? null, + row.origin, + ], + ); +} + +export function isSourcePathImported( + db: ReturnType, + sourcePath: string, +): boolean { + const row = db.getFirstSync<{ id: string }>( + 'SELECT id FROM activities WHERE source_path = ?', + [sourcePath], + ); + return row != null; +} + +export async function upsertRemoteActivity( + db: ReturnType, + id: string, + detailJson: string, +): Promise { + const now = Math.floor(Date.now() / 1000); + const result = await db.runAsync( + `INSERT INTO activities (id, source_hash, detail_json, origin, synced_at) + VALUES (?, ?, ?, 'remote', ?) + ON CONFLICT(id) DO UPDATE SET + detail_json = excluded.detail_json, + synced_at = excluded.synced_at + WHERE origin = 'remote'`, + [id, id, detailJson, now], + ); + return result.changes > 0; +} + +export async function deleteRemoteActivities( + db: ReturnType, +): Promise { + const result = await db.runAsync(`DELETE FROM activities WHERE origin = 'remote'`); + return result.changes; +} + +export async function deleteActivity( + db: ReturnType, + id: string, +): Promise { + const row = db.getFirstSync<{ original_path: string | null }>( + 'SELECT original_path FROM activities WHERE id = ?', + [id], + ); + await db.runAsync('DELETE FROM activities WHERE id = ?', [id]); + return row?.original_path ?? null; +} + +export async function setActivityTitle( + db: ReturnType, + id: string, + title: string, +): Promise { + await db.runAsync( + `UPDATE activities + SET edits_json = json_set(COALESCE(edits_json, '{}'), '$.title', ?) + WHERE id = ?`, + [title, id], + ); +} + +export async function deleteActivities( + db: ReturnType, + ids: string[], +): Promise> { + if (ids.length === 0) return []; + const rows = db.getAllSync<{ original_path: string | null }>( + `SELECT original_path FROM activities WHERE id IN (${ids.map(() => '?').join(',')})`, + ids, + ); + const placeholders = ids.map(() => '?').join(','); + await db.runAsync(`DELETE FROM activities WHERE id IN (${placeholders})`, ids); + return rows.map(r => r.original_path ?? null); +} + +// ── Settings ─────────────────────────────────────────────────────────────── + +export async function getSetting( + db: ReturnType, + key: string, +): Promise { + const row = db.getFirstSync<{ value: string }>( + 'SELECT value FROM settings WHERE key = ?', + [key], + ); + return row?.value ?? null; +} + +export async function setSetting( + db: ReturnType, + key: string, + value: string, +): Promise { + await db.runAsync( + `INSERT INTO settings (key, value) VALUES (?, ?) + ON CONFLICT(key) DO UPDATE SET value = excluded.value`, + [key, value], + ); +} + +export function useSetting(key: string): string | null { + const db = useSQLiteContext(); + const row = db.getFirstSync<{ value: string }>( + 'SELECT value FROM settings WHERE key = ?', + [key], + ); + return row?.value ?? null; +} diff --git a/db/sync.ts b/db/sync.ts new file mode 100644 index 0000000..8e1b81c --- /dev/null +++ b/db/sync.ts @@ -0,0 +1,279 @@ +import * as FileSystem from 'expo-file-system/legacy'; +import type { SQLiteDatabase } from 'expo-sqlite'; +import { getSetting, upsertRemoteActivity } from './queries'; + +export type SyncResult = { + synced: number; + total: number; + fetched?: number; + uploaded?: number; + failed?: number; + error?: string; +}; + +async function resolveCredentials(db: SQLiteDatabase): Promise<{ instanceUrl: string; token: string } | { error: string }> { + const instanceUrl = (await getSetting(db, 'instance_url'))?.replace(/\/$/, ''); + const token = await getSetting(db, 'api_token'); + if (!instanceUrl || !token) return { error: 'No instance configured — add one in Settings.' }; + return { instanceUrl, token }; +} + +export async function downloadFeed(db: SQLiteDatabase): Promise { + const creds = await resolveCredentials(db); + if ('error' in creds) return { synced: 0, total: 0, error: creds.error }; + const { instanceUrl, token } = creds; + + let resp: Response; + try { + resp = await fetch(`${instanceUrl}/api/feed`, { + headers: { Authorization: `Bearer ${token}` }, + }); + } catch { + return { synced: 0, total: 0, error: 'Could not reach instance — check your connection.' }; + } + + if (resp.status === 401) return { synced: 0, total: 0, error: 'Session expired — reconnect in Settings.' }; + if (!resp.ok) return { synced: 0, total: 0, error: `Server error (${resp.status})` }; + + const data: { activities?: RemoteSummary[] } = await resp.json(); + const activities = data.activities ?? []; + const syncMode = (await getSetting(db, 'sync_mode')) ?? 'summaries'; + + let synced = 0; + for (const a of activities) { + const detailJson = JSON.stringify({ + id: a.id, + title: a.title ?? a.id, + sport: a.sport ?? null, + started_at: a.started_at ?? null, + distance_m: a.distance_m ?? null, + moving_time_s: a.moving_time_s ?? null, + elevation_gain_m: a.elevation_gain_m ?? null, + avg_speed_kmh: a.avg_speed_kmh ?? null, + avg_hr_bpm: a.avg_hr_bpm ?? null, + avg_power_w: a.avg_power_w ?? null, + }); + const changed = await upsertRemoteActivity(db, a.id, detailJson); + if (changed) synced++; + } + + if (syncMode !== 'full') return { synced, total: activities.length }; + + // Full mode: fetch geojson + timeseries for activities missing them + const headers = { Authorization: `Bearer ${token}` }; + let fetched = 0; + for (const a of activities) { + const row = db.getFirstSync<{ g: number; t: number }>( + 'SELECT (geojson IS NOT NULL) as g, (timeseries_json IS NOT NULL) as t FROM activities WHERE id = ?', + [a.id], + ); + if (row?.g && row?.t) continue; + + let gj: string | null = null; + let ts: string | null = null; + try { + if (!row?.g) { + const r = await fetch(`${instanceUrl}/api/activity/${a.id}/geojson`, { headers }); + if (r.ok) gj = await r.text(); + } + if (!row?.t) { + const r = await fetch(`${instanceUrl}/api/activity/${a.id}/timeseries`, { headers }); + if (r.ok) ts = await r.text(); + } + } catch {} + + if (gj !== null || ts !== null) { + await db.runAsync( + `UPDATE activities SET + geojson = COALESCE(geojson, ?), + timeseries_json = COALESCE(timeseries_json, ?) + WHERE id = ? AND origin = 'remote'`, + [gj, ts, a.id], + ); + fetched++; + } + } + + return { synced, total: activities.length, fetched }; +} + +export async function uploadFeed( + db: SQLiteDatabase, + onProgress?: (n: number, total: number) => void, +): Promise { + const creds = await resolveCredentials(db); + if ('error' in creds) return { synced: 0, total: 0, error: creds.error }; + const { instanceUrl, token } = creds; + + // Reconcile local synced_at against what the server actually has. + // If the server was wiped/reset, activities we thought were uploaded need + // re-uploading — clear their synced_at so they re-enter the upload queue. + try { + const feedResp = await fetch(`${instanceUrl}/api/feed`, { + headers: { Authorization: `Bearer ${token}` }, + }); + if (feedResp.ok) { + const feedData: { activities?: { id: string }[] } = await feedResp.json(); + const serverIds = new Set((feedData.activities ?? []).map(a => a.id)); + const syncedRows = db.getAllSync<{ id: string }>( + `SELECT id FROM activities WHERE origin = 'local' AND synced_at IS NOT NULL`, + ); + for (const row of syncedRows) { + if (!serverIds.has(row.id)) { + await db.runAsync(`UPDATE activities SET synced_at = NULL WHERE id = ?`, [row.id]); + } + } + } + } catch { + // Best-effort — proceed with upload even if reconciliation fails + } + + const { uploaded, failed } = await uploadLocalActivities(db, instanceUrl, token, onProgress); + return { synced: 0, total: 0, uploaded, failed: failed || undefined }; +} + +export async function syncFeed(db: SQLiteDatabase): Promise { + const dl = await downloadFeed(db); + if (dl.error) return dl; + + const uploadEnabled = (await getSetting(db, 'sync_upload')) === 'true'; + let uploaded = 0; + if (uploadEnabled) { + const ul = await uploadFeed(db); + uploaded = ul.uploaded ?? 0; + } + + return { ...dl, uploaded: uploaded || undefined }; +} + +export async function countPendingUploads(db: SQLiteDatabase): Promise { + const row = db.getFirstSync<{ n: number }>( + `SELECT COUNT(*) as n FROM activities WHERE origin = 'local' AND synced_at IS NULL`, + ); + return row?.n ?? 0; +} + +async function uploadLocalActivities( + db: SQLiteDatabase, + instanceUrl: string, + token: string, + onProgress?: (n: number, total: number) => void, +): Promise<{ uploaded: number; failed: number }> { + const rows = db.getAllSync<{ + id: string; + detail_json: string; + timeseries_json: string | null; + geojson: string | null; + original_path: string | null; + edits_json: string | null; + }>( + `SELECT id, detail_json, timeseries_json, geojson, original_path, edits_json + FROM activities WHERE origin = 'local' AND synced_at IS NULL`, + ); + + const preferRaw = (await getSetting(db, 'upload_format') ?? 'raw') === 'raw'; + const headers = { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json' }; + let uploaded = 0; + let failed = 0; + const now = Math.floor(Date.now() / 1000); + const total = rows.length; + + for (let i = 0; i < rows.length; i++) { + const row = rows[i]; + onProgress?.(i + 1, total); + try { + let resp: Response; + + // When preferRaw is set and the original file is still on disk, send the raw + // bytes to /api/upload/raw so the server re-extracts with DEM elevation correction. + const useRaw = preferRaw && + row.original_path !== null && + (await FileSystem.getInfoAsync(row.original_path)).exists; + + const userTitle: string | null = row.edits_json + ? (JSON.parse(row.edits_json).title ?? null) + : null; + + if (useRaw) { + const filename = row.original_path!.split('/').pop() ?? 'activity.fit'; + const base64 = await FileSystem.readAsStringAsync(row.original_path!, { + encoding: FileSystem.EncodingType.Base64, + }); + resp = await fetch(`${instanceUrl}/api/upload/raw`, { + method: 'POST', + headers, + body: JSON.stringify({ filename, base64, ...(userTitle ? { user_title: userTitle } : {}) }), + }); + } else { + const detail = JSON.parse(row.detail_json); + if (userTitle) detail.title = userTitle; + const body: Record = { activity: { id: row.id, ...detail } }; + if (row.timeseries_json) body.timeseries = JSON.parse(row.timeseries_json); + if (row.geojson) body.geojson = JSON.parse(row.geojson); + resp = await fetch(`${instanceUrl}/api/upload/bas`, { + method: 'POST', + headers, + body: JSON.stringify(body), + }); + } + + if (resp.ok) { + await db.runAsync(`UPDATE activities SET synced_at = ? WHERE id = ?`, [now, row.id]); + // Option A: after a raw upload, update local detail/timeseries/geojson with the + // server's DEM-corrected extraction so the app shows better elevation data. + if (useRaw) { + try { + const data = await resp.json() as { + id: string; + detail: object; + timeseries: object | null; + geojson: object | null; + source_hash: string; + }; + if (data.id === row.id) { + await db.runAsync( + `UPDATE activities + SET detail_json = ?, + timeseries_json = COALESCE(?, timeseries_json), + geojson = COALESCE(?, geojson), + source_hash = ? + WHERE id = ?`, + [ + JSON.stringify(data.detail), + data.timeseries ? JSON.stringify(data.timeseries) : null, + data.geojson ? JSON.stringify(data.geojson) : null, + data.source_hash, + row.id, + ], + ); + } + } catch { + // Non-fatal: synced_at is already set, local data stays as-is + } + } + uploaded++; + } else { + console.warn(`upload ${row.id}: HTTP ${resp.status}`); + failed++; + } + } catch (err) { + console.warn(`upload ${row.id}:`, err); + failed++; + } + } + + return { uploaded, failed }; +} + +type RemoteSummary = { + id: string; + title?: string; + sport?: string; + started_at?: string; + distance_m?: number | null; + moving_time_s?: number | null; + elevation_gain_m?: number | null; + avg_speed_kmh?: number | null; + avg_hr_bpm?: number | null; + avg_power_w?: number | null; +}; diff --git a/extraction/PyodideWebView.tsx b/extraction/PyodideWebView.tsx new file mode 100644 index 0000000..8dfa6f7 --- /dev/null +++ b/extraction/PyodideWebView.tsx @@ -0,0 +1,248 @@ +import { StyleSheet } from 'react-native'; +import WebView from 'react-native-webview'; +import { handleWebViewMessage, pyodideRef } from './extractActivity'; + +const CDN = 'https://cdn.jsdelivr.net/pyodide/v0.26.4/full/'; +// v0.18.1: last version whose JS wrapper avoids ??, ?., and other syntax +// unavailable on Chrome <80 (e.g. Karoo WebView 61). Used in the compat path. +const CDN_COMPAT = 'https://cdn.jsdelivr.net/pyodide/v0.18.1/full/'; + +// Python snippets embedded as JSON strings to avoid any JS/TS escaping issues. +const PY_INSTALL_PACKAGES = [ + 'import micropip', + 'await micropip.install(["fitdecode", "gpxpy"])', +].join('\n'); + +// emfs:// is Pyodide's Emscripten-FS URL scheme — the only reliable way to +// install a wheel from bytes without an http/https URL (blob: URLs are not +// recognised by micropip and cause an InvalidRequirement parse error). +// _wheel_path is set as a Pyodide global before this runs. +const PY_INSTALL_WHEEL = [ + 'import micropip', + 'await micropip.install("emfs://" + _wheel_path, deps=False)', +].join('\n'); + +const PY_EXTRACT = [ + 'import json, shutil', + 'from pathlib import Path', + 'from bincio.extract.parsers.factory import parse_file', + 'from bincio.extract.metrics import compute', + 'from bincio.extract.writer import make_activity_id, write_activity', + '', + 'outdir = Path("/tmp/bincio_out")', + 'if outdir.exists(): shutil.rmtree(outdir)', + 'outdir.mkdir()', + '', + 'activity = parse_file(Path("/tmp/" + _filename))', + 'metrics = compute(activity)', + 'write_activity(activity, metrics, outdir, privacy="public", rdp_epsilon=0.0001)', + 'act_id = make_activity_id(activity)', + '', + 'detail_path = outdir / "activities" / (act_id + ".json")', + 'ts_path = outdir / "activities" / (act_id + ".timeseries.json")', + 'geojson_path = outdir / "activities" / (act_id + ".geojson")', + '', + '# write_activity in the installed wheel silently skips timeseries — write it directly.', + 'if not ts_path.exists():', + ' from bincio.extract.timeseries import build_timeseries as _bts', + ' _ts = _bts(activity.points, activity.started_at, "public")', + ' if _ts.get("t"):', + ' ts_path.write_text(json.dumps(_ts))', + '', + 'json.dumps({', + ' "id": act_id,', + ' "detail": json.loads(detail_path.read_text()),', + ' "timeseries": json.loads(ts_path.read_text()) if ts_path.exists() else None,', + ' "geojson": json.loads(geojson_path.read_text()) if geojson_path.exists() else None,', + '})', +].join('\n'); + +// JSON.stringify gives us safely-quoted JS string literals for embedding in HTML. +const PYODIDE_HTML = ` + + + +`; + +export function PyodideWebView() { + return ( + + ); +} + +const styles = StyleSheet.create({ + // Off-screen but still rendered — display:none / opacity:0 can suppress JS on some platforms. + hidden: { + position: 'absolute', + top: -2000, + left: 0, + width: 1, + height: 1, + }, +}); diff --git a/extraction/extractActivity.ts b/extraction/extractActivity.ts new file mode 100644 index 0000000..c9c936b --- /dev/null +++ b/extraction/extractActivity.ts @@ -0,0 +1,138 @@ +import { createRef } from 'react'; +import { Platform } from 'react-native'; +import type WebView from 'react-native-webview'; +import type { WebViewMessageEvent } from 'react-native-webview'; + +export type ExtractionResult = { + id: string; + detail: object; + timeseries: object | null; + geojson: object | null; + sourceHash: string; +}; + +type Pending = { + resolve: (r: ExtractionResult) => void; + reject: (e: Error) => void; + onStatus: (msg: string) => void; +}; + +export const pyodideRef = createRef(); + +const pending = new Map(); +let reqCounter = 0; +let isExtracting = false; + +// Engine readiness — tracked so callers can wait before batching files. +let _engineReady = false; +let _engineError: string | null = null; +// Android <29 (API 27 = Android 8.1, e.g. Karoo) ships with a system WebView +// (Chrome <69) that lacks WebAssembly.Global, so Pyodide cannot run. Mounting +// a WebView on those devices also causes GPU driver crashes (SurfaceView +// conflicts). Skip the engine entirely and route to server extraction instead. +let _engineUnavailable = Platform.OS === 'android' && (Platform.Version as number) < 29; +const _engineResolvers: Array<() => void> = []; +const _engineRejecters: Array<(e: Error) => void> = []; + +// Init-phase progress listeners (messages sent before any extraction starts). +const _progressListeners = new Set<(msg: string) => void>(); +export function onEngineProgress(cb: (msg: string) => void): () => void { + _progressListeners.add(cb); + return () => _progressListeners.delete(cb); +} + +export function isEngineAvailable(): boolean | null { + // null = not yet determined; true = ready; false = unavailable + if (_engineReady) return true; + if (_engineUnavailable || _engineError) return false; + return null; +} + +export function waitForEngine(timeoutMs = 300_000): Promise { + if (_engineReady) return Promise.resolve(); + if (_engineUnavailable) return Promise.reject(new Error('engine_unavailable')); + if (_engineError) return Promise.reject(new Error(_engineError)); + return new Promise((resolve, reject) => { + const timer = setTimeout(() => { + reject(new Error('Extraction engine timed out — check network and Bincio instance URL')); + }, timeoutMs); + _engineResolvers.push(() => { clearTimeout(timer); resolve(); }); + _engineRejecters.push((e) => { clearTimeout(timer); reject(e); }); + }); +} + +export function handleWebViewMessage(e: WebViewMessageEvent): void { + let msg: Record; + try { msg = JSON.parse(e.nativeEvent.data); } catch { return; } + + const reqId = msg.reqId as string | undefined; + const p = reqId ? pending.get(reqId) : undefined; + + switch (msg.type) { + case 'pyodide_ready': + _engineReady = true; + _engineResolvers.splice(0).forEach(fn => fn()); + break; + case 'engine_unavailable': + _engineUnavailable = true; + _engineRejecters.splice(0).forEach(fn => fn(new Error('engine_unavailable'))); + break; + case 'init_error': + _engineError = msg.message as string; + _engineRejecters.splice(0).forEach(fn => fn(new Error(_engineError!))); + break; + case 'result': + if (p) { + pending.delete(reqId!); + p.resolve({ + id: msg.id as string, + detail: msg.detail as object, + timeseries: (msg.timeseries as object | null) ?? null, + geojson: (msg.geojson as object | null) ?? null, + sourceHash: msg.sourceHash as string, + }); + } + break; + case 'error': + if (p) { + pending.delete(reqId!); + p.reject(new Error(msg.message as string)); + } + break; + case 'progress': + if (p) { + p.onStatus(msg.msg as string); + } else { + _progressListeners.forEach(fn => fn(msg.msg as string)); + } + break; + } +} + +// wheelBase64 is the bincio .whl file pre-fetched by the React Native side +// (native networking supports HTTP on local network; WKWebView does not). +export function extractFile( + filename: string, + base64: string, + wheelBase64: string, + wheelFilename: string, + onStatus: (msg: string) => void = () => {}, +): Promise { + if (isExtracting) return Promise.reject(new Error('Another extraction is already in progress')); + + const webview = pyodideRef.current; + if (!webview) return Promise.reject(new Error('Extraction engine not ready — restart the app')); + + isExtracting = true; + const reqId = String(++reqCounter); + const args = JSON.stringify({ reqId, filename, base64, wheelBase64, wheelFilename }); + + return new Promise((resolve, reject) => { + pending.set(reqId, { + resolve: (r) => { isExtracting = false; resolve(r); }, + reject: (e) => { isExtracting = false; reject(e); }, + onStatus, + }); + webview.injectJavaScript(`window._bincioExtract(${args}); true;`); + }); +} diff --git a/extraction/extractServer.ts b/extraction/extractServer.ts new file mode 100644 index 0000000..1a93e61 --- /dev/null +++ b/extraction/extractServer.ts @@ -0,0 +1,63 @@ +import type { ExtractionResult } from './extractActivity'; + +export async function checkServerAuth(instanceUrl: string, token: string): Promise { + let resp: Response; + try { + resp = await fetch(`${instanceUrl}/api/feed`, { + headers: { Authorization: `Bearer ${token}` }, + }); + } catch { + throw new Error('Could not reach Bincio instance — check your connection.'); + } + if (resp.status === 401) throw new Error('Session expired — reconnect in Settings.'); + if (!resp.ok) throw new Error(`Server error (${resp.status})`); +} + +export async function extractFileViaServer( + filename: string, + base64: string, + instanceUrl: string, + token: string, + onStatus: (msg: string) => void = () => {}, +): Promise { + onStatus('Uploading to Bincio instance…'); + + let resp: Response; + try { + resp = await fetch(`${instanceUrl}/api/upload/raw`, { + method: 'POST', + headers: { + Authorization: `Bearer ${token}`, + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ filename, base64 }), + }); + } catch { + throw new Error('Could not reach Bincio instance — check your connection.'); + } + + if (resp.status === 401) throw new Error('Session expired — reconnect in Settings.'); + if (resp.status === 422) { + const body = await resp.json().catch(() => ({})) as { detail?: string }; + throw new Error(body.detail ?? 'Server could not process this file.'); + } + if (!resp.ok) throw new Error(`Server error (${resp.status})`); + + onStatus('Processing on server…'); + const data = await resp.json() as { + ok: boolean; + id: string; + detail: object; + timeseries: object | null; + geojson: object | null; + source_hash: string; + }; + + return { + id: data.id, + detail: data.detail, + timeseries: data.timeseries, + geojson: data.geojson, + sourceHash: data.source_hash, + }; +} diff --git a/metro.config.js b/metro.config.js new file mode 100644 index 0000000..74aeaec --- /dev/null +++ b/metro.config.js @@ -0,0 +1,2 @@ +const { getDefaultConfig } = require('expo/metro-config'); +module.exports = getDefaultConfig(__dirname); diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..d8be60c --- /dev/null +++ b/package-lock.json @@ -0,0 +1,9819 @@ +{ + "name": "bincio", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "bincio", + "version": "0.1.0", + "dependencies": { + "@maplibre/maplibre-react-native": "~11.0.0", + "expo": "~54.0.33", + "expo-background-fetch": "~14.0.9", + "expo-constants": "~18.0.13", + "expo-document-picker": "~14.0.8", + "expo-file-system": "~19.0.21", + "expo-linking": "~8.0.11", + "expo-notifications": "~0.32.16", + "expo-router": "~6.0.23", + "expo-splash-screen": "~31.0.13", + "expo-sqlite": "~16.0.10", + "expo-status-bar": "~3.0.9", + "expo-system-ui": "~6.0.9", + "expo-task-manager": "~14.0.9", + "react": "19.1.0", + "react-dom": "19.1.0", + "react-native": "0.81.5", + "react-native-safe-area-context": "~5.6.0", + "react-native-screens": "~4.16.0", + "react-native-svg": "~15.15.0", + "react-native-webview": "13.15.0" + }, + "devDependencies": { + "@babel/core": "^7.25.0", + "@types/react": "~19.1.0", + "typescript": "~5.9.2" + } + }, + "node_modules/@0no-co/graphql.web": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@0no-co/graphql.web/-/graphql.web-1.2.0.tgz", + "integrity": "sha512-/1iHy9TTr63gE1YcR5idjx8UREz1s0kFhydf3bBLCXyqjhkIc6igAzTOx3zPifCwFR87tsh/4Pa9cNts6d2otw==", + "license": "MIT", + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" + }, + "peerDependenciesMeta": { + "graphql": { + "optional": true + } + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@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/generator": { + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@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.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.6.tgz", + "integrity": "sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-member-expression-to-functions": "^7.28.5", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.28.6", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.28.5.tgz", + "integrity": "sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "regexpu-core": "^6.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "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.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz", + "integrity": "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", + "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-wrap-function": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.28.6.tgz", + "integrity": "sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==", + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.28.5", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.6.tgz", + "integrity": "sha512-z+PwLziMNBeSQJonizz2AGnndLsP2DeGHIxDAn+wdHOGuo4Fo1x1HBPPXeE9TAOPHNNWQKCSlA2VZyYyyibDnQ==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", + "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.9.tgz", + "integrity": "sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/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/@babel/highlight/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/@babel/highlight/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/@babel/highlight/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/@babel/highlight/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/@babel/highlight/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/@babel/highlight/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/@babel/parser": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", + "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-proposal-decorators": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.29.0.tgz", + "integrity": "sha512-CVBVv3VY/XRMxRYq5dwr2DS7/MvqPm23cOCjbwNnVrfOqcWlnefua1uUs0sjdKOGjvPUG633o07uWzJq4oI6dA==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-syntax-decorators": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-export-default-from": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.27.1.tgz", + "integrity": "sha512-hjlsMBl1aJc5lp8MoCDEZCiYzlgdRAShOjAfRw6X+GlpLpUPU7c3XNLsKFZbQk/1cRzBlJ7CXg3xJAJMrFa1Uw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-decorators": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.28.6.tgz", + "integrity": "sha512-71EYI0ONURHJBL4rSFXnITXqXrrY8q4P0q006DPfN+Rk+ASM+++IBXem/ruokgBZR8YNEWZ8R6B+rCb8VcUTqA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "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.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.28.6.tgz", + "integrity": "sha512-Svlx1fjJFnNz0LZeUaybRukSxZI3KkpApUmIRzEdXC5k8ErTOz0OD0kNrICi5Vc3GlpP5ZCeRyRO+mfWTSz+iQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-flow": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.28.6.tgz", + "integrity": "sha512-D+OrJumc9McXNEBI/JmFnc/0uCM2/Y3PEBG3gfV3QIYkKv5pvnpzFrl1kYCrcHJP8nOeFB/SHi1IHz29pNGuew==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz", + "integrity": "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz", + "integrity": "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "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-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz", + "integrity": "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", + "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.29.0.tgz", + "integrity": "sha512-va0VdWro4zlBr2JsXC+ofCPB2iG12wPtVGTWFx2WLDOM3nYQZZIGP82qku2eW/JR83sD+k2k+CsNtyEbUqhU6w==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-remap-async-to-generator": "^7.27.1", + "@babel/traverse": "^7.29.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.28.6.tgz", + "integrity": "sha512-ilTRcmbuXjsMmcZ3HASTe4caH5Tpo93PkTxF9oG2VZsSWsahydmcEHhix9Ik122RcTnZnUzPbmux4wh1swfv7g==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-remap-async-to-generator": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.6.tgz", + "integrity": "sha512-tt/7wOtBmwHPNMPu7ax4pdPz6shjFrmHDghvNC+FG9Qvj7D6mJcoRQIF5dy4njmxR941l6rgtvfSB2zX3VlUIw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.28.6.tgz", + "integrity": "sha512-dY2wS3I2G7D697VHndN91TJr8/AAfXQNt5ynCTI/MpxMsSzHp+52uNivYT5wCPax3whc47DR8Ba7cmlQMg24bw==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.6.tgz", + "integrity": "sha512-rfQ++ghVwTWTqQ7w8qyDxL1XGihjBss4CmTgGRCTAC9RIbhVpyp4fOeZtta0Lbf+dTNIVJer6ych2ibHwkZqsQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.6.tgz", + "integrity": "sha512-EF5KONAqC5zAqT783iMGuM2ZtmEBy+mJMOKl2BCvPZ2lVrwvXnB6o+OBWCS+CoeCCpVRF2sA2RBKUxvT8tQT5Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-globals": "^7.28.0", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-replace-supers": "^7.28.6", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.28.6.tgz", + "integrity": "sha512-bcc3k0ijhHbc2lEfpFHgx7eYw9KNXqOerKWfzbxEHUGKnS3sz9C4CNL9OiFN1297bDNfUiSO7DaLzbvHQQQ1BQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/template": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.5.tgz", + "integrity": "sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", + "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-flow-strip-types": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.27.1.tgz", + "integrity": "sha512-G5eDKsu50udECw7DL2AcsysXiQyB7Nfg521t2OAJ4tbfTJ27doHLeF/vlI1NZGlLdbb/v+ibvtL1YBQqYOwJGg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-flow": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", + "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", + "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", + "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.6.tgz", + "integrity": "sha512-+anKKair6gpi8VsM/95kmomGNMD0eLz1NQ8+Pfw5sAwWH9fGYXT50E55ZpV0pHUHWf6IUTWPM+f/7AAff+wr9A==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.28.6.tgz", + "integrity": "sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.29.0.tgz", + "integrity": "sha512-1CZQA5KNAD6ZYQLPw7oi5ewtDNxH/2vuCh+6SmvgDfhumForvs8a1o9n0UrEoBD8HU4djO2yWngTQlXl1NDVEQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.28.6.tgz", + "integrity": "sha512-3wKbRgmzYbw24mDJXT7N+ADXw8BC/imU9yo9c9X9NKaLF1fW+e5H1U5QjMUBe4Qo4Ox/o++IyUkl1sVCLgevKg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.28.6.tgz", + "integrity": "sha512-SJR8hPynj8outz+SlStQSwvziMN4+Bq99it4tMIf5/Caq+3iOc0JtKyse8puvyXkk3eFRIA5ID/XfunGgO5i6w==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.6.tgz", + "integrity": "sha512-5rh+JR4JBC4pGkXLAcYdLHZjXudVxWMXbB6u6+E9lRL5TrGVbHt1TjxGbZ8CkmYw9zjkB7jutzOROArsqtncEA==", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-transform-destructuring": "^7.28.5", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.28.6.tgz", + "integrity": "sha512-R8ja/Pyrv0OGAvAXQhSTmWyPJPml+0TMqXlO5w+AsMEiwb2fg3WkOvob7UxFSL3OIttFSGSRFKQsOhJ/X6HQdQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.6.tgz", + "integrity": "sha512-A4zobikRGJTsX9uqVFdafzGkqD30t26ck2LmOzAuLL8b2x6k3TIqRiT2xVvA9fNmFeTX484VpsdgmKNA0bS23w==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz", + "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.28.6.tgz", + "integrity": "sha512-piiuapX9CRv7+0st8lmuUlRSmX6mBcVeNQ1b4AYzJxfCMuBfB0vBXDiGSmm03pKJw1v6cZ8KSeM+oUnM6yAExg==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.28.6.tgz", + "integrity": "sha512-b97jvNSOb5+ehyQmBpmhOCiUC5oVK4PMnpRvO7+ymFBoqYjeDHIU9jnrNUuwHOiL9RpGDoKBpSViarV+BU+eVA==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.28.0.tgz", + "integrity": "sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.28.6.tgz", + "integrity": "sha512-61bxqhiRfAACulXSLd/GxqmAedUSrRZIu/cbaT18T1CetkTmtDN15it7i80ru4DVqRK1WMxQhXs+Lf9kajm5Ow==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-syntax-jsx": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.27.1.tgz", + "integrity": "sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==", + "license": "MIT", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.27.1.tgz", + "integrity": "sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.29.0.tgz", + "integrity": "sha512-FijqlqMA7DmRdg/aINBSs04y8XNTYw/lr1gJ2WsmBnnaNw1iS43EPkJW+zK7z65auG3AWRFXWj+NcTQwYptUog==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.29.0.tgz", + "integrity": "sha512-jlaRT5dJtMaMCV6fAuLbsQMSwz/QkvaHOHOSXRitGGwSpR1blCY4KUKoyP2tYO8vJcqYe8cEj96cqSztv3uF9w==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "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-shorthand-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", + "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.28.6.tgz", + "integrity": "sha512-9U4QObUC0FtJl05AsUcodau/RWDytrU6uKgkxu09mLR9HLDAtUMoPuuskm5huQsoktmsYpI+bGmq+iapDcriKA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", + "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.6.tgz", + "integrity": "sha512-0YWL2RFxOqEm9Efk5PvreamxPME8OyY0wM5wh5lHjF+VtVhdneCWGzZeSqzOfiobVqQaNCd2z0tQvnI9DaPWPw==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", + "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.28.5.tgz", + "integrity": "sha512-Z3J8vhRq7CeLjdC58jLv4lnZ5RKFUJWqH5emvxmv9Hv3BD1T9R/Im713R4MTKwvFaV74ejZ3sM01LyEKk4ugNQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-transform-react-display-name": "^7.28.0", + "@babel/plugin-transform-react-jsx": "^7.27.1", + "@babel/plugin-transform-react-jsx-development": "^7.27.1", + "@babel/plugin-transform-react-pure-annotations": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.28.5.tgz", + "integrity": "sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-typescript": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz", + "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse--for-generate-function-map": { + "name": "@babel/traverse", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "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": "12.0.13", + "resolved": "https://registry.npmjs.org/@expo/config/-/config-12.0.13.tgz", + "integrity": "sha512-Cu52arBa4vSaupIWsF0h7F/Cg//N374nYb7HAxV0I4KceKA7x2UXpYaHOL7EEYYvp7tZdThBjvGpVmr8ScIvaQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "~7.10.4", + "@expo/config-plugins": "~54.0.4", + "@expo/config-types": "^54.0.10", + "@expo/json-file": "^10.0.8", + "deepmerge": "^4.3.1", + "getenv": "^2.0.0", + "glob": "^13.0.0", + "require-from-string": "^2.0.2", + "resolve-from": "^5.0.0", + "resolve-workspace-root": "^2.0.0", + "semver": "^7.6.0", + "slugify": "^1.3.4", + "sucrase": "~3.35.1" + } + }, + "node_modules/@expo/config-plugins": { + "version": "54.0.4", + "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-54.0.4.tgz", + "integrity": "sha512-g2yXGICdoOw5i3LkQSDxl2Q5AlQCrG7oniu0pCPPO+UxGb7He4AFqSvPSy8HpRUj55io17hT62FTjYRD+d6j3Q==", + "license": "MIT", + "dependencies": { + "@expo/config-types": "^54.0.10", + "@expo/json-file": "~10.0.8", + "@expo/plist": "^0.4.8", + "@expo/sdk-runtime-versions": "^1.0.0", + "chalk": "^4.1.2", + "debug": "^4.3.5", + "getenv": "^2.0.0", + "glob": "^13.0.0", + "resolve-from": "^5.0.0", + "semver": "^7.5.4", + "slash": "^3.0.0", + "slugify": "^1.6.6", + "xcode": "^3.0.1", + "xml2js": "0.6.0" + } + }, + "node_modules/@expo/config-plugins/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@expo/config-types": { + "version": "54.0.10", + "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-54.0.10.tgz", + "integrity": "sha512-/J16SC2an1LdtCZ67xhSkGXpALYUVUNyZws7v+PVsFZxClYehDSoKLqyRaGkpHlYrCc08bS0RF5E0JV6g50psA==", + "license": "MIT" + }, + "node_modules/@expo/config/node_modules/@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/@expo/config/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "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": "0.1.8", + "resolved": "https://registry.npmjs.org/@expo/devtools/-/devtools-0.1.8.tgz", + "integrity": "sha512-SVLxbuanDjJPgc0sy3EfXUMLb/tXzp6XIHkhtPVmTWJAp+FOr6+5SeiCfJrCzZFet0Ifyke2vX3sFcKwEvCXwQ==", + "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.0.11", + "resolved": "https://registry.npmjs.org/@expo/env/-/env-2.0.11.tgz", + "integrity": "sha512-xV+ps6YCW7XIPVUwFVCRN2nox09dnRwy8uIjwHWTODu0zFw4kp4omnVkl0OOjuu2XOe7tdgAHxikrkJt9xB/7Q==", + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "debug": "^4.3.4", + "dotenv": "~16.4.5", + "dotenv-expand": "~11.0.6", + "getenv": "^2.0.0" + } + }, + "node_modules/@expo/fingerprint": { + "version": "0.15.4", + "resolved": "https://registry.npmjs.org/@expo/fingerprint/-/fingerprint-0.15.4.tgz", + "integrity": "sha512-eYlxcrGdR2/j2M6pEDXo9zU9KXXF1vhP+V+Tl+lyY+bU8lnzrN6c637mz6Ye3em2ANy8hhUR03Raf8VsT9Ogng==", + "license": "MIT", + "dependencies": { + "@expo/spawn-async": "^1.7.2", + "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": "^9.0.0", + "p-limit": "^3.1.0", + "resolve-from": "^5.0.0", + "semver": "^7.6.0" + }, + "bin": { + "fingerprint": "bin/cli.js" + } + }, + "node_modules/@expo/fingerprint/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@expo/image-utils": { + "version": "0.8.13", + "resolved": "https://registry.npmjs.org/@expo/image-utils/-/image-utils-0.8.13.tgz", + "integrity": "sha512-1I//yBQeTY6p0u1ihqGNDAr35EbSG8uFEupFrIF0jd++h9EWH33521yZJU1yE+mwGlzCb61g3ehu78siMhXBlA==", + "license": "MIT", + "dependencies": { + "@expo/require-utils": "^55.0.4", + "@expo/spawn-async": "^1.7.2", + "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/image-utils/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@expo/json-file": { + "version": "10.0.13", + "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-10.0.13.tgz", + "integrity": "sha512-pX/XjQn7tgNw6zuuV2ikmegmwe/S7uiwhrs2wXrANMkq7ozrA+JcZwgW9Q/8WZgciBzfAhNp5hnackHcrmapQA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.20.0", + "json5": "^2.2.3" + } + }, + "node_modules/@expo/metro": { + "version": "54.2.0", + "resolved": "https://registry.npmjs.org/@expo/metro/-/metro-54.2.0.tgz", + "integrity": "sha512-h68TNZPGsk6swMmLm9nRSnE2UXm48rWwgcbtAHVMikXvbxdS41NDHHeqg1rcQ9AbznDRp6SQVC2MVpDnsRKU1w==", + "license": "MIT", + "dependencies": { + "metro": "0.83.3", + "metro-babel-transformer": "0.83.3", + "metro-cache": "0.83.3", + "metro-cache-key": "0.83.3", + "metro-config": "0.83.3", + "metro-core": "0.83.3", + "metro-file-map": "0.83.3", + "metro-minify-terser": "0.83.3", + "metro-resolver": "0.83.3", + "metro-runtime": "0.83.3", + "metro-source-map": "0.83.3", + "metro-symbolicate": "0.83.3", + "metro-transform-plugins": "0.83.3", + "metro-transform-worker": "0.83.3" + } + }, + "node_modules/@expo/metro-config": { + "version": "54.0.14", + "resolved": "https://registry.npmjs.org/@expo/metro-config/-/metro-config-54.0.14.tgz", + "integrity": "sha512-hxpLyDfOR4L23tJ9W1IbJJsG7k4lv2sotohBm/kTYyiG+pe1SYCAWsRmgk+H42o/wWf/HQjE5k45S5TomGLxNA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.20.0", + "@babel/core": "^7.20.0", + "@babel/generator": "^7.20.5", + "@expo/config": "~12.0.13", + "@expo/env": "~2.0.8", + "@expo/json-file": "~10.0.8", + "@expo/metro": "~54.2.0", + "@expo/spawn-async": "^1.7.2", + "browserslist": "^4.25.0", + "chalk": "^4.1.0", + "debug": "^4.3.2", + "dotenv": "~16.4.5", + "dotenv-expand": "~11.0.6", + "getenv": "^2.0.0", + "glob": "^13.0.0", + "hermes-parser": "^0.29.1", + "jsc-safe-url": "^0.2.4", + "lightningcss": "^1.30.1", + "minimatch": "^9.0.0", + "postcss": "~8.4.32", + "resolve-from": "^5.0.0" + }, + "peerDependencies": { + "expo": "*" + }, + "peerDependenciesMeta": { + "expo": { + "optional": true + } + } + }, + "node_modules/@expo/metro-runtime": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/@expo/metro-runtime/-/metro-runtime-6.1.2.tgz", + "integrity": "sha512-nvM+Qv45QH7pmYvP8JB1G8JpScrWND3KrMA6ZKe62cwwNiX/BjHU28Ear0v/4bQWXlOY0mv6B8CDIm8JxXde9g==", + "license": "MIT", + "dependencies": { + "anser": "^1.4.9", + "pretty-format": "^29.7.0", + "stacktrace-parser": "^0.1.10", + "whatwg-fetch": "^3.0.0" + }, + "peerDependencies": { + "expo": "*", + "react": "*", + "react-dom": "*", + "react-native": "*" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/@expo/osascript": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@expo/osascript/-/osascript-2.4.2.tgz", + "integrity": "sha512-/XP7PSYF2hzOZzqfjgkoWtllyeTN8dW3aM4P6YgKcmmPikKL5FdoyQhti4eh6RK5a5VrUXJTOlTNIpIHsfB5Iw==", + "license": "MIT", + "dependencies": { + "@expo/spawn-async": "^1.7.2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@expo/package-manager": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@expo/package-manager/-/package-manager-1.10.4.tgz", + "integrity": "sha512-y9Mr4Kmpk4abAVZrNNPCdzOZr8nLLyi18p1SXr0RCVA8IfzqZX/eY4H+50a0HTmXqIsPZrQdcdb4I3ekMS9GvQ==", + "license": "MIT", + "dependencies": { + "@expo/json-file": "^10.0.13", + "@expo/spawn-async": "^1.7.2", + "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.4.8", + "resolved": "https://registry.npmjs.org/@expo/plist/-/plist-0.4.8.tgz", + "integrity": "sha512-pfNtErGGzzRwHP+5+RqswzPDKkZrx+Cli0mzjQaus1ZWFsog5ibL+nVT3NcporW51o8ggnt7x813vtRbPiyOrQ==", + "license": "MIT", + "dependencies": { + "@xmldom/xmldom": "^0.8.8", + "base64-js": "^1.2.3", + "xmlbuilder": "^15.1.1" + } + }, + "node_modules/@expo/prebuild-config": { + "version": "54.0.8", + "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-54.0.8.tgz", + "integrity": "sha512-EA7N4dloty2t5Rde+HP0IEE+nkAQiu4A/+QGZGT9mFnZ5KKjPPkqSyYcRvP5bhQE10D+tvz6X0ngZpulbMdbsg==", + "license": "MIT", + "dependencies": { + "@expo/config": "~12.0.13", + "@expo/config-plugins": "~54.0.4", + "@expo/config-types": "^54.0.10", + "@expo/image-utils": "^0.8.8", + "@expo/json-file": "^10.0.8", + "@react-native/normalize-colors": "0.81.5", + "debug": "^4.3.1", + "resolve-from": "^5.0.0", + "semver": "^7.6.0", + "xml2js": "0.6.0" + }, + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/@expo/prebuild-config/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@expo/require-utils": { + "version": "55.0.4", + "resolved": "https://registry.npmjs.org/@expo/require-utils/-/require-utils-55.0.4.tgz", + "integrity": "sha512-JAANvXqV7MOysWeVWgaiDzikoyDjJWOV/ulOW60Zb3kXJfrx2oZOtGtDXDFKD1mXuahQgoM5QOjuZhF7gFRNjA==", + "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" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@expo/schema-utils": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@expo/schema-utils/-/schema-utils-0.1.8.tgz", + "integrity": "sha512-9I6ZqvnAvKKDiO+ZF8BpQQFYWXOJvTAL5L/227RUbWG1OVZDInFifzCBiqAZ3b67NRfeAgpgvbA7rejsqhY62A==", + "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.7.2", + "resolved": "https://registry.npmjs.org/@expo/spawn-async/-/spawn-async-1.7.2.tgz", + "integrity": "sha512-QdWi16+CHB9JYP7gma19OVVg0BFkvU8zNj9GjWorYI8Iv8FUxjOCcYRuAmX4s/h91e4e7BPsskc8cSrZYho9Ew==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3" + }, + "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/vector-icons": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@expo/vector-icons/-/vector-icons-15.1.1.tgz", + "integrity": "sha512-Iu2VkcoI5vygbtYngm7jb4ifxElNVXQYdDrYkT7UCEIiKLeWnQY0wf2ZhHZ+Wro6Sc5TaumpKUOqDRpLi5rkvw==", + "license": "MIT", + "peerDependencies": { + "expo-font": ">=14.0.4", + "react": "*", + "react-native": "*" + } + }, + "node_modules/@expo/ws-tunnel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@expo/ws-tunnel/-/ws-tunnel-1.0.6.tgz", + "integrity": "sha512-nDRbLmSrJar7abvUjp3smDwH8HcbZcoOEa5jVPUv9/9CajgmWw20JNRwTuBRzWIWIkEJDkz20GoNA+tSwUqk0Q==", + "license": "MIT" + }, + "node_modules/@expo/xcpretty": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@expo/xcpretty/-/xcpretty-4.4.3.tgz", + "integrity": "sha512-wC562eD3gS6vO2tWHToFhlFnmHKfKHgF1oyvojeSkLK/ZYop1bMU+7cOMiF9Sq70CzcsLy/EMRy/uRc76QmNRw==", + "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/@expo/xcpretty/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/@expo/xcpretty/node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@ide/backoff": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@ide/backoff/-/backoff-1.0.0.tgz", + "integrity": "sha512-F0YfUDjvT+Mtt/R4xdl2X0EYCHMMiJqNLdxHD++jDT5ydEFIyqbCHh51Qx2E211dgZprPKhV7sHmnXKpLuvc5g==", + "license": "MIT" + }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "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/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "license": "ISC", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.6.tgz", + "integrity": "sha512-+Sg6GCR/wy1oSmQDFq4LQDAhm3ETKnorxN+y5nbLULOR3P0c14f2Wurzj3/xqPXtasLFfHd5iRFQ7AJt4KH2cw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/create-cache-key-function": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/create-cache-key-function/-/create-cache-key-function-29.7.0.tgz", + "integrity": "sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==", + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "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/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "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.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "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/@mapbox/jsonlint-lines-primitives": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.2.tgz", + "integrity": "sha512-rY0o9A5ECsTQRVhv7tL/OyDpGAoUB4tTvLiW1DSzQGq4bvTPhNw1VpSNjDJc5GFZ2XuyOtSWSVN05qOtcD71qQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@mapbox/unitbezier": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-0.0.1.tgz", + "integrity": "sha512-nMkuDXFv60aBr9soUG5q+GvZYL+2KZHVvsqFCzqnkGEf46U2fvmytHaEVc1/YZbiLn8X+eR3QzX1+dwDO1lxlw==", + "license": "BSD-2-Clause" + }, + "node_modules/@maplibre/maplibre-gl-style-spec": { + "version": "24.8.1", + "resolved": "https://registry.npmjs.org/@maplibre/maplibre-gl-style-spec/-/maplibre-gl-style-spec-24.8.1.tgz", + "integrity": "sha512-zxa92qF96ZNojLxeAjnaRpjVCy+swoUNJvDhtpC90k7u5F0TMr4GmvNqMKvYrMoPB8d7gRSXbMG1hBbmgESIsw==", + "license": "ISC", + "dependencies": { + "@mapbox/jsonlint-lines-primitives": "~2.0.2", + "@mapbox/unitbezier": "^0.0.1", + "json-stringify-pretty-compact": "^4.0.0", + "minimist": "^1.2.8", + "quickselect": "^3.0.0", + "rw": "^1.3.3", + "tinyqueue": "^3.0.0" + }, + "bin": { + "gl-style-format": "dist/gl-style-format.mjs", + "gl-style-migrate": "dist/gl-style-migrate.mjs", + "gl-style-validate": "dist/gl-style-validate.mjs" + } + }, + "node_modules/@maplibre/maplibre-react-native": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/@maplibre/maplibre-react-native/-/maplibre-react-native-11.0.1.tgz", + "integrity": "sha512-d6jbfGT7YT5lX29LkFhxYq8Gbsf8c51zIwMqBz+aiVNlkCGRusE/jZInmXdCstPY2TcHsAcl07+fiYThl80wCQ==", + "license": "MIT", + "dependencies": { + "@maplibre/maplibre-gl-style-spec": "24.8.1", + "@turf/distance": "^7.1.0", + "@turf/helpers": "^7.1.0", + "@turf/length": "^7.1.0", + "@turf/nearest-point-on-line": "^7.1.0" + }, + "peerDependencies": { + "@expo/config-plugins": ">=54.0.0", + "@types/geojson": "^7946.0.0", + "@types/react": ">=19.1.0", + "react": ">=19.1.0", + "react-native": ">=0.80.0" + }, + "peerDependenciesMeta": { + "@expo/config-plugins": { + "optional": true + }, + "@types/geojson": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/primitive": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz", + "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", + "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", + "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-direction": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.1.tgz", + "integrity": "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-guards": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.3.tgz", + "integrity": "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-id": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz", + "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slot": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.0.tgz", + "integrity": "sha512-ujc+V6r0HNDviYqIK3rW4ffgYiZ8g5DEHrGJVk4x7kTlLXRDILnKX9vAUYeIsLOoDpDJ0ujpqMkjH4w2ofuo6w==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz", + "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz", + "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-effect-event": "0.0.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-effect-event": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz", + "integrity": "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz", + "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", + "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@react-native/assets-registry": { + "version": "0.81.5", + "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.81.5.tgz", + "integrity": "sha512-705B6x/5Kxm1RKRvSv0ADYWm5JOnoiQ1ufW7h8uu2E6G9Of/eE6hP/Ivw3U5jI16ERqZxiKQwk34VJbB0niX9w==", + "license": "MIT", + "engines": { + "node": ">= 20.19.4" + } + }, + "node_modules/@react-native/babel-plugin-codegen": { + "version": "0.81.5", + "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.81.5.tgz", + "integrity": "sha512-oF71cIH6je3fSLi6VPjjC3Sgyyn57JLHXs+mHWc9MoCiJJcM4nqsS5J38zv1XQ8d3zOW2JtHro+LF0tagj2bfQ==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.3", + "@react-native/codegen": "0.81.5" + }, + "engines": { + "node": ">= 20.19.4" + } + }, + "node_modules/@react-native/babel-preset": { + "version": "0.81.5", + "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.81.5.tgz", + "integrity": "sha512-UoI/x/5tCmi+pZ3c1+Ypr1DaRMDLI3y+Q70pVLLVgrnC3DHsHRIbHcCHIeG/IJvoeFqFM2sTdhSOLJrf8lOPrA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.25.2", + "@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-arrow-functions": "^7.24.7", + "@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-classes": "^7.25.4", + "@babel/plugin-transform-computed-properties": "^7.24.7", + "@babel/plugin-transform-destructuring": "^7.24.8", + "@babel/plugin-transform-flow-strip-types": "^7.25.2", + "@babel/plugin-transform-for-of": "^7.24.7", + "@babel/plugin-transform-function-name": "^7.25.1", + "@babel/plugin-transform-literals": "^7.25.2", + "@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-numeric-separator": "^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.25.2", + "@babel/plugin-transform-react-jsx-self": "^7.24.7", + "@babel/plugin-transform-react-jsx-source": "^7.24.7", + "@babel/plugin-transform-regenerator": "^7.24.7", + "@babel/plugin-transform-runtime": "^7.24.7", + "@babel/plugin-transform-shorthand-properties": "^7.24.7", + "@babel/plugin-transform-spread": "^7.24.7", + "@babel/plugin-transform-sticky-regex": "^7.24.7", + "@babel/plugin-transform-typescript": "^7.25.2", + "@babel/plugin-transform-unicode-regex": "^7.24.7", + "@babel/template": "^7.25.0", + "@react-native/babel-plugin-codegen": "0.81.5", + "babel-plugin-syntax-hermes-parser": "0.29.1", + "babel-plugin-transform-flow-enums": "^0.0.2", + "react-refresh": "^0.14.0" + }, + "engines": { + "node": ">= 20.19.4" + }, + "peerDependencies": { + "@babel/core": "*" + } + }, + "node_modules/@react-native/codegen": { + "version": "0.81.5", + "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.81.5.tgz", + "integrity": "sha512-a2TDA03Up8lpSa9sh5VRGCQDXgCTOyDOFH+aqyinxp1HChG8uk89/G+nkJ9FPd0rqgi25eCTR16TWdS3b+fA6g==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.25.2", + "@babel/parser": "^7.25.3", + "glob": "^7.1.1", + "hermes-parser": "0.29.1", + "invariant": "^2.2.4", + "nullthrows": "^1.1.1", + "yargs": "^17.6.2" + }, + "engines": { + "node": ">= 20.19.4" + }, + "peerDependencies": { + "@babel/core": "*" + } + }, + "node_modules/@react-native/codegen/node_modules/brace-expansion": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@react-native/codegen/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@react-native/codegen/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@react-native/community-cli-plugin": { + "version": "0.81.5", + "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.81.5.tgz", + "integrity": "sha512-yWRlmEOtcyvSZ4+OvqPabt+NS36vg0K/WADTQLhrYrm9qdZSuXmq8PmdJWz/68wAqKQ+4KTILiq2kjRQwnyhQw==", + "license": "MIT", + "dependencies": { + "@react-native/dev-middleware": "0.81.5", + "debug": "^4.4.0", + "invariant": "^2.2.4", + "metro": "^0.83.1", + "metro-config": "^0.83.1", + "metro-core": "^0.83.1", + "semver": "^7.1.3" + }, + "engines": { + "node": ">= 20.19.4" + }, + "peerDependencies": { + "@react-native-community/cli": "*", + "@react-native/metro-config": "*" + }, + "peerDependenciesMeta": { + "@react-native-community/cli": { + "optional": true + }, + "@react-native/metro-config": { + "optional": true + } + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@react-native/debugger-frontend": { + "version": "0.81.5", + "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.81.5.tgz", + "integrity": "sha512-bnd9FSdWKx2ncklOetCgrlwqSGhMHP2zOxObJbOWXoj7GHEmih4MKarBo5/a8gX8EfA1EwRATdfNBQ81DY+h+w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 20.19.4" + } + }, + "node_modules/@react-native/dev-middleware": { + "version": "0.81.5", + "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.81.5.tgz", + "integrity": "sha512-WfPfZzboYgo/TUtysuD5xyANzzfka8Ebni6RIb2wDxhb56ERi7qDrE4xGhtPsjCL4pQBXSVxyIlCy0d8I6EgGA==", + "license": "MIT", + "dependencies": { + "@isaacs/ttlcache": "^1.4.1", + "@react-native/debugger-frontend": "0.81.5", + "chrome-launcher": "^0.15.2", + "chromium-edge-launcher": "^0.2.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": "^6.2.3" + }, + "engines": { + "node": ">= 20.19.4" + } + }, + "node_modules/@react-native/dev-middleware/node_modules/ws": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", + "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", + "license": "MIT", + "dependencies": { + "async-limiter": "~1.0.0" + } + }, + "node_modules/@react-native/gradle-plugin": { + "version": "0.81.5", + "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.81.5.tgz", + "integrity": "sha512-hORRlNBj+ReNMLo9jme3yQ6JQf4GZpVEBLxmTXGGlIL78MAezDZr5/uq9dwElSbcGmLEgeiax6e174Fie6qPLg==", + "license": "MIT", + "engines": { + "node": ">= 20.19.4" + } + }, + "node_modules/@react-native/js-polyfills": { + "version": "0.81.5", + "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.81.5.tgz", + "integrity": "sha512-fB7M1CMOCIUudTRuj7kzxIBTVw2KXnsgbQ6+4cbqSxo8NmRRhA0Ul4ZUzZj3rFd3VznTL4Brmocv1oiN0bWZ8w==", + "license": "MIT", + "engines": { + "node": ">= 20.19.4" + } + }, + "node_modules/@react-native/normalize-colors": { + "version": "0.81.5", + "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.81.5.tgz", + "integrity": "sha512-0HuJ8YtqlTVRXGZuGeBejLE04wSQsibpTI+RGOyVqxZvgtlLLC/Ssw0UmbHhT4lYMp2fhdtvKZSs5emWB1zR/g==", + "license": "MIT" + }, + "node_modules/@react-navigation/bottom-tabs": { + "version": "7.15.9", + "resolved": "https://registry.npmjs.org/@react-navigation/bottom-tabs/-/bottom-tabs-7.15.9.tgz", + "integrity": "sha512-Ou28A1aZLj5wiFQ3F93aIsrI4NCwn3IJzkkjNo9KLFXsc0Yks+UqrVaFlffHFLsrbajuGRG/OQpnMA1ljayY5Q==", + "license": "MIT", + "dependencies": { + "@react-navigation/elements": "^2.9.14", + "color": "^4.2.3", + "sf-symbols-typescript": "^2.1.0" + }, + "peerDependencies": { + "@react-navigation/native": "^7.2.2", + "react": ">= 18.2.0", + "react-native": "*", + "react-native-safe-area-context": ">= 4.0.0", + "react-native-screens": ">= 4.0.0" + } + }, + "node_modules/@react-navigation/core": { + "version": "7.17.2", + "resolved": "https://registry.npmjs.org/@react-navigation/core/-/core-7.17.2.tgz", + "integrity": "sha512-Rt2OZwcgOmjv401uLGAKaRM6xo0fiBce/A7LfRHI1oe5FV+KooWcgAoZ2XOtgKj6UzVMuQWt3b2e6rxo/mDJRA==", + "license": "MIT", + "dependencies": { + "@react-navigation/routers": "^7.5.3", + "escape-string-regexp": "^4.0.0", + "fast-deep-equal": "^3.1.3", + "nanoid": "^3.3.11", + "query-string": "^7.1.3", + "react-is": "^19.1.0", + "use-latest-callback": "^0.2.4", + "use-sync-external-store": "^1.5.0" + }, + "peerDependencies": { + "react": ">= 18.2.0" + } + }, + "node_modules/@react-navigation/elements": { + "version": "2.9.14", + "resolved": "https://registry.npmjs.org/@react-navigation/elements/-/elements-2.9.14.tgz", + "integrity": "sha512-lKqzu+su2pI/YIZmR7L7xdOs4UL+rVXKJAMpRMBrwInEy96SjIFst6QDGpE89Dunnu3VjVpjWfByo9f2GWBHDQ==", + "license": "MIT", + "dependencies": { + "color": "^4.2.3", + "use-latest-callback": "^0.2.4", + "use-sync-external-store": "^1.5.0" + }, + "peerDependencies": { + "@react-native-masked-view/masked-view": ">= 0.2.0", + "@react-navigation/native": "^7.2.2", + "react": ">= 18.2.0", + "react-native": "*", + "react-native-safe-area-context": ">= 4.0.0" + }, + "peerDependenciesMeta": { + "@react-native-masked-view/masked-view": { + "optional": true + } + } + }, + "node_modules/@react-navigation/native": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@react-navigation/native/-/native-7.2.2.tgz", + "integrity": "sha512-kem1Ko2BcbAjmbQIv66dNmr6EtfDut3QU0qjsVhMnLLhktwyXb6FzZYp8gTrUb6AvkAbaJoi+BF5Pl55pAUa5w==", + "license": "MIT", + "dependencies": { + "@react-navigation/core": "^7.17.2", + "escape-string-regexp": "^4.0.0", + "fast-deep-equal": "^3.1.3", + "nanoid": "^3.3.11", + "use-latest-callback": "^0.2.4" + }, + "peerDependencies": { + "react": ">= 18.2.0", + "react-native": "*" + } + }, + "node_modules/@react-navigation/native-stack": { + "version": "7.14.11", + "resolved": "https://registry.npmjs.org/@react-navigation/native-stack/-/native-stack-7.14.11.tgz", + "integrity": "sha512-1ufBtJ7KbVFlQhXsYSYHqjgkmP30AzJSgW48YjWMQZ3NZGAyYe34w9Wd4KpdebQCfDClPe9maU+8crA/awa6lQ==", + "license": "MIT", + "dependencies": { + "@react-navigation/elements": "^2.9.14", + "color": "^4.2.3", + "sf-symbols-typescript": "^2.1.0", + "warn-once": "^0.1.1" + }, + "peerDependencies": { + "@react-navigation/native": "^7.2.2", + "react": ">= 18.2.0", + "react-native": "*", + "react-native-safe-area-context": ">= 4.0.0", + "react-native-screens": ">= 4.0.0" + } + }, + "node_modules/@react-navigation/routers": { + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/@react-navigation/routers/-/routers-7.5.3.tgz", + "integrity": "sha512-1tJHg4KKRJuQ1/EvJxatrMef3NZXEPzwUIUZ3n1yJ2t7Q97siwRtbynRpQG9/69ebbtiZ8W3ScOZF/OmhvM4Rg==", + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.10", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz", + "integrity": "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==", + "license": "MIT" + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@turf/distance": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/@turf/distance/-/distance-7.3.5.tgz", + "integrity": "sha512-uQAC63zg/l91KUxzfhqio7Ii3+UXTrPOVJScIdRj6EO6+9XHI4kC+AdyIS4cPAv14sZfJLIBxzMnzcGrss+kEA==", + "license": "MIT", + "dependencies": { + "@turf/helpers": "7.3.5", + "@turf/invariant": "7.3.5", + "@types/geojson": "^7946.0.10", + "tslib": "^2.8.1" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/helpers": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-7.3.5.tgz", + "integrity": "sha512-E/NMGV5MwbjjP7AJXBtsanC3yY8N2MQ87IGdIgkB2ji5AtBpwnH4L3gEqpYN4RlCJJWbLbzO91BbKv2waUd0eg==", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.8.1" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/invariant": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-7.3.5.tgz", + "integrity": "sha512-ZVIvsBvjr8lO7WxC5zYNjRsjSDvyGvWkJMjuWaJjTU8x+1tmfNnw3gDX/TI2Sit83gcRYLYkNo23lB/udqx/Hg==", + "license": "MIT", + "dependencies": { + "@turf/helpers": "7.3.5", + "@types/geojson": "^7946.0.10", + "tslib": "^2.8.1" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/length": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/@turf/length/-/length-7.3.5.tgz", + "integrity": "sha512-Bi+vEP54wt1ly3BRcCOP0nd2kGTYEhGk6haQxTpkrqr3XtmqDh8c3NowSgseN2cegIZRjwCOEC8eSsZ0JemJdA==", + "license": "MIT", + "dependencies": { + "@turf/distance": "7.3.5", + "@turf/helpers": "7.3.5", + "@turf/meta": "7.3.5", + "@types/geojson": "^7946.0.10", + "tslib": "^2.8.1" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/meta": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/@turf/meta/-/meta-7.3.5.tgz", + "integrity": "sha512-r+ohqxoyqeigFB0oFrQx/YEHIkOKqcKpCjvZkvZs7Tkv+IFco5MezAd2zd4rzK+0DfFgDP3KpJc7HqrYjvEjhg==", + "license": "MIT", + "dependencies": { + "@turf/helpers": "7.3.5", + "@types/geojson": "^7946.0.10", + "tslib": "^2.8.1" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/nearest-point-on-line": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/@turf/nearest-point-on-line/-/nearest-point-on-line-7.3.5.tgz", + "integrity": "sha512-MZn6OkEFZpjS6BNUANfqiHMIbQSivu7TNji3a+OAIrnPJ71vp8cbz0N2aVEa5M7I8ipvxoxAPIV3eqg3h280Vg==", + "license": "MIT", + "dependencies": { + "@turf/distance": "7.3.5", + "@turf/helpers": "7.3.5", + "@turf/invariant": "7.3.5", + "@turf/meta": "7.3.5", + "@types/geojson": "^7946.0.10", + "tslib": "^2.8.1" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/geojson": { + "version": "7946.0.16", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", + "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", + "license": "MIT" + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "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": "25.6.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.6.0.tgz", + "integrity": "sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ==", + "license": "MIT", + "dependencies": { + "undici-types": "~7.19.0" + } + }, + "node_modules/@types/react": { + "version": "19.1.17", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.17.tgz", + "integrity": "sha512-Qec1E3mhALmaspIrhWt9jkQMNdw6bReVu64mjvhbhq2NFPftLPVr+l1SZgmw/66WwBNpDh7ao5AT6gF5v41PFA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.0.2" + } + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "license": "MIT" + }, + "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.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "license": "ISC" + }, + "node_modules/@urql/core": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@urql/core/-/core-5.2.0.tgz", + "integrity": "sha512-/n0ieD0mvvDnVAXEQgX/7qJiVcvYvNkOHeBvkwtylfjydar123caCXcl58PXFY11oU1oquJocVXHxLAbtv4x1A==", + "license": "MIT", + "dependencies": { + "@0no-co/graphql.web": "^1.0.13", + "wonka": "^6.3.2" + } + }, + "node_modules/@urql/exchange-retry": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@urql/exchange-retry/-/exchange-retry-1.3.2.tgz", + "integrity": "sha512-TQMCz2pFJMfpNxmSfX1VSfTjwUIFx/mL+p1bnfM1xjjdla7Z+KnGMW/EhFbpckp3LyWAH4PgOsMwOMnIN+MBFg==", + "license": "MIT", + "dependencies": { + "@urql/core": "^5.1.2", + "wonka": "^6.3.2" + }, + "peerDependencies": { + "@urql/core": "^5.0.0" + } + }, + "node_modules/@xmldom/xmldom": { + "version": "0.8.13", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.13.tgz", + "integrity": "sha512-KRYzxepc14G/CEpEGc3Yn+JKaAeT63smlDr+vjB8jRfgTBBI9wRj/nkQEO+ucV8p8I9bfKLWp37uHgFrbntPvw==", + "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": "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/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "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/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/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "license": "MIT" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "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": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/aria-hidden": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", + "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "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/assert": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-2.1.0.tgz", + "integrity": "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "is-nan": "^1.3.2", + "object-is": "^1.1.5", + "object.assign": "^4.1.4", + "util": "^0.12.5" + } + }, + "node_modules/async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "license": "MIT" + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/await-lock": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/await-lock/-/await-lock-2.2.2.tgz", + "integrity": "sha512-aDczADvlvTGajTDjcjpJMqRkOF6Qdz3YbPZm/PyW6tKPkx2hlYBzxMhEywM/tU72HrVZjgl5VCdRuMlA7pZ8Gw==", + "license": "MIT" + }, + "node_modules/babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "license": "MIT", + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "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-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.29.1", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.29.1.tgz", + "integrity": "sha512-2WFYnoWGdmih1I1J5eIqxATOeycOqRwYxAQBu3cUu/rhwInwHUg7k60AFNbuGjSDL8tje5GDrAnxzRLcu2pYcA==", + "license": "MIT", + "dependencies": { + "hermes-parser": "0.29.1" + } + }, + "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/babel-preset-current-node-syntax": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", + "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5" + }, + "peerDependencies": { + "@babel/core": "^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/babel-preset-expo": { + "version": "54.0.10", + "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-54.0.10.tgz", + "integrity": "sha512-wTt7POavLFypLcPW/uC5v8y+mtQKDJiyGLzYCjqr9tx0Qc3vCXcDKk1iCFIj/++Iy5CWhhTflEa7VvVPNWeCfw==", + "license": "MIT", + "dependencies": { + "@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-export-default-from": "^7.24.7", + "@babel/plugin-transform-class-static-block": "^7.27.1", + "@babel/plugin-transform-export-namespace-from": "^7.25.9", + "@babel/plugin-transform-flow-strip-types": "^7.25.2", + "@babel/plugin-transform-modules-commonjs": "^7.24.8", + "@babel/plugin-transform-object-rest-spread": "^7.24.7", + "@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-runtime": "^7.24.7", + "@babel/preset-react": "^7.22.15", + "@babel/preset-typescript": "^7.23.0", + "@react-native/babel-preset": "0.81.5", + "babel-plugin-react-compiler": "^1.0.0", + "babel-plugin-react-native-web": "~0.21.0", + "babel-plugin-syntax-hermes-parser": "^0.29.1", + "babel-plugin-transform-flow-enums": "^0.0.2", + "debug": "^4.3.4", + "resolve-from": "^5.0.0" + }, + "peerDependencies": { + "@babel/runtime": "^7.20.0", + "expo": "*", + "react-refresh": ">=0.14.0 <1.0.0" + }, + "peerDependenciesMeta": { + "@babel/runtime": { + "optional": true + }, + "expo": { + "optional": true + } + } + }, + "node_modules/babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/badgin": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/badgin/-/badgin-1.2.3.tgz", + "integrity": "sha512-NQGA7LcfCpSzIbGRbkgjgdWkjy7HI+Th5VLxTJfW5EeaAf3fnS+xWQaQOCYiny+q6QSvxqoSO04vCx+4u++EJw==", + "license": "MIT" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "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.10.21", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.21.tgz", + "integrity": "sha512-Q+rUQ7Uz8AHM7DEaNdwvfFCTq7a43lNTzuS94eiWqwyxfV/wJv+oUivef51T91mmRY4d4A1u9rcSvkeufCVXlA==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/better-opn": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/better-opn/-/better-opn-3.0.2.tgz", + "integrity": "sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==", + "license": "MIT", + "dependencies": { + "open": "^8.0.4" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/better-opn/node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/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/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "license": "ISC" + }, + "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": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "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.28.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", + "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", + "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.10.12", + "caniuse-lite": "^1.0.30001782", + "electron-to-chromium": "^1.5.328", + "node-releases": "^2.0.36", + "update-browserslist-db": "^1.2.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": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "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/call-bind": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", + "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "get-intrinsic": "^1.3.0", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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.30001790", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001790.tgz", + "integrity": "sha512-bOoxfJPyYo+ds6W0YfptaCWbFnJYjh2Y1Eow5lRv+vI2u8ganPZqNm1JwNh0t2ELQCqIWg4B3dWEusgAmsoyOw==", + "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/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "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.2.0", + "resolved": "https://registry.npmjs.org/chromium-edge-launcher/-/chromium-edge-launcher-0.2.0.tgz", + "integrity": "sha512-JfJjUnq25y9yg4FABRRVPmBGWPZZi+AQXT4mxupb67766/0UlhG8PAZCz6xzEMXTbW3CsSoE8PcCWA49n35mKg==", + "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", + "rimraf": "^3.0.2" + } + }, + "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/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", + "license": "MIT" + }, + "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": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, + "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/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "license": "MIT", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "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.1", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", + "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "compressible": "~2.0.18", + "debug": "2.6.9", + "negotiator": "~0.6.4", + "on-headers": "~1.1.0", + "safe-buffer": "5.2.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "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/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "license": "MIT" + }, + "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/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.49.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.49.0.tgz", + "integrity": "sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.1" + }, + "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/css-select": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/css-tree/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/css-what": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "devOptional": true, + "license": "MIT" + }, + "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/decode-uri-component": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "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/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", + "license": "MIT" + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dotenv": { + "version": "16.4.7", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", + "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dotenv-expand": { + "version": "11.0.7", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.7.tgz", + "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==", + "license": "BSD-2-Clause", + "dependencies": { + "dotenv": "^16.4.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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.344", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.344.tgz", + "integrity": "sha512-4MxfbmNDm+KPh066EZy+eUnkcDPcZ35wNmOWzFuh/ijvHsve6kbLTLURy88uCNK5FbpN+yk2nQY6BYh1GEt+wg==", + "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/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-editor": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/env-editor/-/env-editor-0.4.2.tgz", + "integrity": "sha512-ObFo8v4rQJAE59M69QzwloxPZtd33TpYEIjtKD1rrFDcM1Gd7IkDxEBU+HriziN6HSHQnBJi8Dmy+JWkav5HKA==", + "license": "MIT", + "engines": { + "node": ">=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-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "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/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "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": "54.0.33", + "resolved": "https://registry.npmjs.org/expo/-/expo-54.0.33.tgz", + "integrity": "sha512-3yOEfAKqo+gqHcV8vKcnq0uA5zxlohnhA3fu4G43likN8ct5ZZ3LjAh9wDdKteEkoad3tFPvwxmXW711S5OHUw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.20.0", + "@expo/cli": "54.0.23", + "@expo/config": "~12.0.13", + "@expo/config-plugins": "~54.0.4", + "@expo/devtools": "0.1.8", + "@expo/fingerprint": "0.15.4", + "@expo/metro": "~54.2.0", + "@expo/metro-config": "54.0.14", + "@expo/vector-icons": "^15.0.3", + "@ungap/structured-clone": "^1.3.0", + "babel-preset-expo": "~54.0.10", + "expo-asset": "~12.0.12", + "expo-constants": "~18.0.13", + "expo-file-system": "~19.0.21", + "expo-font": "~14.0.11", + "expo-keep-awake": "~15.0.8", + "expo-modules-autolinking": "3.0.24", + "expo-modules-core": "3.0.29", + "pretty-format": "^29.7.0", + "react-refresh": "^0.14.2", + "whatwg-url-without-unicode": "8.0.0-3" + }, + "bin": { + "expo": "bin/cli", + "expo-modules-autolinking": "bin/autolinking", + "fingerprint": "bin/fingerprint" + }, + "peerDependencies": { + "@expo/dom-webview": "*", + "@expo/metro-runtime": "*", + "react": "*", + "react-native": "*", + "react-native-webview": "*" + }, + "peerDependenciesMeta": { + "@expo/dom-webview": { + "optional": true + }, + "@expo/metro-runtime": { + "optional": true + }, + "react-native-webview": { + "optional": true + } + } + }, + "node_modules/expo-application": { + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/expo-application/-/expo-application-7.0.8.tgz", + "integrity": "sha512-qFGyxk7VJbrNOQWBbE09XUuGuvkOgFS9QfToaK2FdagM2aQ+x3CvGV2DuVgl/l4ZxPgIf3b/MNh9xHpwSwn74Q==", + "license": "MIT", + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-asset": { + "version": "12.0.12", + "resolved": "https://registry.npmjs.org/expo-asset/-/expo-asset-12.0.12.tgz", + "integrity": "sha512-CsXFCQbx2fElSMn0lyTdRIyKlSXOal6ilLJd+yeZ6xaC7I9AICQgscY5nj0QcwgA+KYYCCEQEBndMsmj7drOWQ==", + "license": "MIT", + "dependencies": { + "@expo/image-utils": "^0.8.8", + "expo-constants": "~18.0.12" + }, + "peerDependencies": { + "expo": "*", + "react": "*", + "react-native": "*" + } + }, + "node_modules/expo-background-fetch": { + "version": "14.0.9", + "resolved": "https://registry.npmjs.org/expo-background-fetch/-/expo-background-fetch-14.0.9.tgz", + "integrity": "sha512-IhdbjIu9EdsYaL7mCCvf/i48Qy4a5rpRy038/4KNUoa9xmsETRwFCdsoZj4VHg4dVt2D0kiDrgqVVlPBSSWt+Q==", + "license": "MIT", + "dependencies": { + "expo-task-manager": "~14.0.9" + }, + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-constants": { + "version": "18.0.13", + "resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-18.0.13.tgz", + "integrity": "sha512-FnZn12E1dRYKDHlAdIyNFhBurKTS3F9CrfrBDJI5m3D7U17KBHMQ6JEfYlSj7LG7t+Ulr+IKaj58L1k5gBwTcQ==", + "license": "MIT", + "dependencies": { + "@expo/config": "~12.0.13", + "@expo/env": "~2.0.8" + }, + "peerDependencies": { + "expo": "*", + "react-native": "*" + } + }, + "node_modules/expo-document-picker": { + "version": "14.0.8", + "resolved": "https://registry.npmjs.org/expo-document-picker/-/expo-document-picker-14.0.8.tgz", + "integrity": "sha512-3tyQKpPqWWFlI8p9RiMX1+T1Zge5mEKeBuXWp1h8PEItFMUDSiOJbQ112sfdC6Hxt8wSxreV9bCRl/NgBdt+fA==", + "license": "MIT", + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-file-system": { + "version": "19.0.21", + "resolved": "https://registry.npmjs.org/expo-file-system/-/expo-file-system-19.0.21.tgz", + "integrity": "sha512-s3DlrDdiscBHtab/6W1osrjGL+C2bvoInPJD7sOwmxfJ5Woynv2oc+Fz1/xVXaE/V7HE/+xrHC/H45tu6lZzzg==", + "license": "MIT", + "peerDependencies": { + "expo": "*", + "react-native": "*" + } + }, + "node_modules/expo-font": { + "version": "14.0.11", + "resolved": "https://registry.npmjs.org/expo-font/-/expo-font-14.0.11.tgz", + "integrity": "sha512-ga0q61ny4s/kr4k8JX9hVH69exVSIfcIc19+qZ7gt71Mqtm7xy2c6kwsPTCyhBW2Ro5yXTT8EaZOpuRi35rHbg==", + "license": "MIT", + "dependencies": { + "fontfaceobserver": "^2.1.0" + }, + "peerDependencies": { + "expo": "*", + "react": "*", + "react-native": "*" + } + }, + "node_modules/expo-keep-awake": { + "version": "15.0.8", + "resolved": "https://registry.npmjs.org/expo-keep-awake/-/expo-keep-awake-15.0.8.tgz", + "integrity": "sha512-YK9M1VrnoH1vLJiQzChZgzDvVimVoriibiDIFLbQMpjYBnvyfUeHJcin/Gx1a+XgupNXy92EQJLgI/9ZuXajYQ==", + "license": "MIT", + "peerDependencies": { + "expo": "*", + "react": "*" + } + }, + "node_modules/expo-linking": { + "version": "8.0.11", + "resolved": "https://registry.npmjs.org/expo-linking/-/expo-linking-8.0.11.tgz", + "integrity": "sha512-+VSaNL5om3kOp/SSKO5qe6cFgfSIWnnQDSbA7XLs3ECkYzXRquk5unxNS3pg7eK5kNUmQ4kgLI7MhTggAEUBLA==", + "license": "MIT", + "dependencies": { + "expo-constants": "~18.0.12", + "invariant": "^2.2.4" + }, + "peerDependencies": { + "react": "*", + "react-native": "*" + } + }, + "node_modules/expo-modules-autolinking": { + "version": "3.0.24", + "resolved": "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-3.0.24.tgz", + "integrity": "sha512-TP+6HTwhL7orDvsz2VzauyQlXJcAWyU3ANsZ7JGL4DQu8XaZv/A41ZchbtAYLfozNA2Ya1Hzmhx65hXryBMjaQ==", + "license": "MIT", + "dependencies": { + "@expo/spawn-async": "^1.7.2", + "chalk": "^4.1.0", + "commander": "^7.2.0", + "require-from-string": "^2.0.2", + "resolve-from": "^5.0.0" + }, + "bin": { + "expo-modules-autolinking": "bin/expo-modules-autolinking.js" + } + }, + "node_modules/expo-modules-core": { + "version": "3.0.29", + "resolved": "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-3.0.29.tgz", + "integrity": "sha512-LzipcjGqk8gvkrOUf7O2mejNWugPkf3lmd9GkqL9WuNyeN2fRwU0Dn77e3ZUKI3k6sI+DNwjkq4Nu9fNN9WS7Q==", + "license": "MIT", + "dependencies": { + "invariant": "^2.2.4" + }, + "peerDependencies": { + "react": "*", + "react-native": "*" + } + }, + "node_modules/expo-notifications": { + "version": "0.32.16", + "resolved": "https://registry.npmjs.org/expo-notifications/-/expo-notifications-0.32.16.tgz", + "integrity": "sha512-QQD/UA6v7LgvwIJ+tS7tSvqJZkdp0nCSj9MxsDk/jU1GttYdK49/5L2LvE/4U0H7sNBz1NZAyhDZozg8xgBLXw==", + "license": "MIT", + "dependencies": { + "@expo/image-utils": "^0.8.8", + "@ide/backoff": "^1.0.0", + "abort-controller": "^3.0.0", + "assert": "^2.0.0", + "badgin": "^1.1.5", + "expo-application": "~7.0.8", + "expo-constants": "~18.0.13" + }, + "peerDependencies": { + "expo": "*", + "react": "*", + "react-native": "*" + } + }, + "node_modules/expo-router": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/expo-router/-/expo-router-6.0.23.tgz", + "integrity": "sha512-qCxVAiCrCyu0npky6azEZ6dJDMt77OmCzEbpF6RbUTlfkaCA417LvY14SBkk0xyGruSxy/7pvJOI6tuThaUVCA==", + "license": "MIT", + "dependencies": { + "@expo/metro-runtime": "^6.1.2", + "@expo/schema-utils": "^0.1.8", + "@radix-ui/react-slot": "1.2.0", + "@radix-ui/react-tabs": "^1.1.12", + "@react-navigation/bottom-tabs": "^7.4.0", + "@react-navigation/native": "^7.1.8", + "@react-navigation/native-stack": "^7.3.16", + "client-only": "^0.0.1", + "debug": "^4.3.4", + "escape-string-regexp": "^4.0.0", + "expo-server": "^1.0.5", + "fast-deep-equal": "^3.1.3", + "invariant": "^2.2.4", + "nanoid": "^3.3.8", + "query-string": "^7.1.3", + "react-fast-compare": "^3.2.2", + "react-native-is-edge-to-edge": "^1.1.6", + "semver": "~7.6.3", + "server-only": "^0.0.1", + "sf-symbols-typescript": "^2.1.0", + "shallowequal": "^1.1.0", + "use-latest-callback": "^0.2.1", + "vaul": "^1.1.2" + }, + "peerDependencies": { + "@expo/metro-runtime": "^6.1.2", + "@react-navigation/drawer": "^7.5.0", + "@testing-library/react-native": ">= 12.0.0", + "expo": "*", + "expo-constants": "^18.0.13", + "expo-linking": "^8.0.11", + "react": "*", + "react-dom": "*", + "react-native": "*", + "react-native-gesture-handler": "*", + "react-native-reanimated": "*", + "react-native-safe-area-context": ">= 5.4.0", + "react-native-screens": "*", + "react-native-web": "*", + "react-server-dom-webpack": "~19.0.4 || ~19.1.5 || ~19.2.4" + }, + "peerDependenciesMeta": { + "@react-navigation/drawer": { + "optional": true + }, + "@testing-library/react-native": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "react-native-gesture-handler": { + "optional": true + }, + "react-native-reanimated": { + "optional": true + }, + "react-native-web": { + "optional": true + }, + "react-server-dom-webpack": { + "optional": true + } + } + }, + "node_modules/expo-router/node_modules/@radix-ui/react-collection": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz", + "integrity": "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/expo-router/node_modules/@radix-ui/react-collection/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/expo-router/node_modules/@radix-ui/react-presence": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.5.tgz", + "integrity": "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/expo-router/node_modules/@radix-ui/react-primitive": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", + "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/expo-router/node_modules/@radix-ui/react-primitive/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/expo-router/node_modules/@radix-ui/react-roving-focus": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.11.tgz", + "integrity": "sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/expo-router/node_modules/@radix-ui/react-tabs": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.13.tgz", + "integrity": "sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/expo-router/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/expo-server": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/expo-server/-/expo-server-1.0.5.tgz", + "integrity": "sha512-IGR++flYH70rhLyeXF0Phle56/k4cee87WeQ4mamS+MkVAVP+dDlOHf2nN06Z9Y2KhU0Gp1k+y61KkghF7HdhA==", + "license": "MIT", + "engines": { + "node": ">=20.16.0" + } + }, + "node_modules/expo-splash-screen": { + "version": "31.0.13", + "resolved": "https://registry.npmjs.org/expo-splash-screen/-/expo-splash-screen-31.0.13.tgz", + "integrity": "sha512-1epJLC1cDlwwj089R2h8cxaU5uk4ONVAC+vzGiTZH4YARQhL4Stlz1MbR6yAS173GMosvkE6CAeihR7oIbCkDA==", + "license": "MIT", + "dependencies": { + "@expo/prebuild-config": "^54.0.8" + }, + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-sqlite": { + "version": "16.0.10", + "resolved": "https://registry.npmjs.org/expo-sqlite/-/expo-sqlite-16.0.10.tgz", + "integrity": "sha512-tUOKxE9TpfneRG3eOfbNfhN9236SJ7IiUnP8gCqU7umd9DtgDGB/5PhYVVfl+U7KskgolgNoB9v9OZ9iwXN8Eg==", + "license": "MIT", + "dependencies": { + "await-lock": "^2.2.2" + }, + "peerDependencies": { + "expo": "*", + "react": "*", + "react-native": "*" + } + }, + "node_modules/expo-status-bar": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/expo-status-bar/-/expo-status-bar-3.0.9.tgz", + "integrity": "sha512-xyYyVg6V1/SSOZWh4Ni3U129XHCnFHBTcUo0dhWtFDrZbNp/duw5AGsQfb2sVeU0gxWHXSY1+5F0jnKYC7WuOw==", + "license": "MIT", + "dependencies": { + "react-native-is-edge-to-edge": "^1.2.1" + }, + "peerDependencies": { + "react": "*", + "react-native": "*" + } + }, + "node_modules/expo-system-ui": { + "version": "6.0.9", + "resolved": "https://registry.npmjs.org/expo-system-ui/-/expo-system-ui-6.0.9.tgz", + "integrity": "sha512-eQTYGzw1V4RYiYHL9xDLYID3Wsec2aZS+ypEssmF64D38aDrqbDgz1a2MSlHLQp2jHXSs3FvojhZ9FVela1Zcg==", + "license": "MIT", + "dependencies": { + "@react-native/normalize-colors": "0.81.5", + "debug": "^4.3.2" + }, + "peerDependencies": { + "expo": "*", + "react-native": "*", + "react-native-web": "*" + }, + "peerDependenciesMeta": { + "react-native-web": { + "optional": true + } + } + }, + "node_modules/expo-task-manager": { + "version": "14.0.9", + "resolved": "https://registry.npmjs.org/expo-task-manager/-/expo-task-manager-14.0.9.tgz", + "integrity": "sha512-GKWtXrkedr4XChHfTm5IyTcSfMtCPxzx89y4CMVqKfyfROATibrE/8UI5j7UC/pUOfFoYlQvulQEvECMreYuUA==", + "license": "MIT", + "dependencies": { + "unimodules-app-loader": "~6.0.8" + }, + "peerDependencies": { + "expo": "*", + "react-native": "*" + } + }, + "node_modules/expo/node_modules/@expo/cli": { + "version": "54.0.23", + "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-54.0.23.tgz", + "integrity": "sha512-km0h72SFfQCmVycH/JtPFTVy69w6Lx1cHNDmfLfQqgKFYeeHTjx7LVDP4POHCtNxFP2UeRazrygJhlh4zz498g==", + "license": "MIT", + "dependencies": { + "@0no-co/graphql.web": "^1.0.8", + "@expo/code-signing-certificates": "^0.0.6", + "@expo/config": "~12.0.13", + "@expo/config-plugins": "~54.0.4", + "@expo/devcert": "^1.2.1", + "@expo/env": "~2.0.8", + "@expo/image-utils": "^0.8.8", + "@expo/json-file": "^10.0.8", + "@expo/metro": "~54.2.0", + "@expo/metro-config": "~54.0.14", + "@expo/osascript": "^2.3.8", + "@expo/package-manager": "^1.9.10", + "@expo/plist": "^0.4.8", + "@expo/prebuild-config": "^54.0.8", + "@expo/schema-utils": "^0.1.8", + "@expo/spawn-async": "^1.7.2", + "@expo/ws-tunnel": "^1.0.1", + "@expo/xcpretty": "^4.3.0", + "@react-native/dev-middleware": "0.81.5", + "@urql/core": "^5.0.6", + "@urql/exchange-retry": "^1.3.0", + "accepts": "^1.3.8", + "arg": "^5.0.2", + "better-opn": "~3.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", + "env-editor": "^0.4.1", + "expo-server": "^1.0.5", + "freeport-async": "^2.0.0", + "getenv": "^2.0.0", + "glob": "^13.0.0", + "lan-network": "^0.1.6", + "minimatch": "^9.0.0", + "node-forge": "^1.3.3", + "npm-package-arg": "^11.0.0", + "ora": "^3.4.0", + "picomatch": "^3.0.1", + "pretty-bytes": "^5.6.0", + "pretty-format": "^29.7.0", + "progress": "^2.0.3", + "prompts": "^2.3.2", + "qrcode-terminal": "0.11.0", + "require-from-string": "^2.0.2", + "requireg": "^0.2.2", + "resolve": "^1.22.2", + "resolve-from": "^5.0.0", + "resolve.exports": "^2.0.3", + "semver": "^7.6.0", + "send": "^0.19.0", + "slugify": "^1.3.4", + "source-map-support": "~0.5.21", + "stacktrace-parser": "^0.1.10", + "structured-headers": "^0.4.1", + "tar": "^7.5.2", + "terminal-link": "^2.1.1", + "undici": "^6.18.2", + "wrap-ansi": "^7.0.0", + "ws": "^8.12.1" + }, + "bin": { + "expo-internal": "build/bin/cli" + }, + "peerDependencies": { + "expo": "*", + "expo-router": "*", + "react-native": "*" + }, + "peerDependenciesMeta": { + "expo-router": { + "optional": true + }, + "react-native": { + "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/picomatch": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-3.0.2.tgz", + "integrity": "sha512-cfDHL6LStTEKlNilboNtobT/kEa30PtAf2Q1OgszfrG/rpVl1xaFWT9ktfkS306GmHgmnad1Sw4wabhlvFtsTw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/expo/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/expo/node_modules/ws": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.20.0.tgz", + "integrity": "sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==", + "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/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "license": "MIT" + }, + "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/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/filter-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz", + "integrity": "sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/freeport-async": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/freeport-async/-/freeport-async-2.0.0.tgz", + "integrity": "sha512-K7od3Uw45AJg00XUmy15+Hae2hOcgKcmN3/EF6Y7i01O0gaqiRx8sUSpsb9+BRNL8RPBrhzPsVfy8q9ADlJuWQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "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/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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/glob/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/glob/node_modules/brace-expansion": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "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/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz", + "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hermes-estree": { + "version": "0.29.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.29.1.tgz", + "integrity": "sha512-jl+x31n4/w+wEqm0I2r4CMimukLbLQEYpisys5oCre611CI5fc9TxhqkBBCJ1edDG4Kza0f7CgNz8xVMLZQOmQ==", + "license": "MIT" + }, + "node_modules/hermes-parser": { + "version": "0.29.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.29.1.tgz", + "integrity": "sha512-xBHWmUtRC5e/UL0tI7Ivt2riA/YBq9+SiYFU7C1oBa/j2jYGlIF9043oak1F47ihuDIxQ5nbsKueYJDRY02UgA==", + "license": "MIT", + "dependencies": { + "hermes-estree": "0.29.1" + } + }, + "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/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "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/image-size": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.2.1.tgz", + "integrity": "sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==", + "license": "MIT", + "dependencies": { + "queue": "6.0.2" + }, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=16.x" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "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-arguments": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", + "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.4.tgz", + "integrity": "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==", + "license": "MIT" + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "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-generator-function": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-nan": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", + "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "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-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "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": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "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/json-stringify-pretty-compact": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/json-stringify-pretty-compact/-/json-stringify-pretty-compact-4.0.0.tgz", + "integrity": "sha512-3CNZ2DnrpByG9Nqj6Xo8vqbjT4F6N+tb4Gb28ESAZjYZ5yqvmc56J+/kuIwkaAMOyblTQhUW7PxMkUb8Q36N3Q==", + "license": "MIT" + }, + "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.1.7", + "resolved": "https://registry.npmjs.org/lan-network/-/lan-network-0.1.7.tgz", + "integrity": "sha512-mnIlAEMu4OyEvUNdzco9xpuB9YVcPkQec+QsgycBCtPZvEqWPCDPfbAE4OJMdBBWpZWtpCn1xw9jJYlwjWI5zQ==", + "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.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "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.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "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.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "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.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "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.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "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.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "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.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "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.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "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.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "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.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "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.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "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.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "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/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "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/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "license": "CC0-1.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-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.83.3", + "resolved": "https://registry.npmjs.org/metro/-/metro-0.83.3.tgz", + "integrity": "sha512-+rP+/GieOzkt97hSJ0MrPOuAH/jpaS21ZDvL9DJ35QYRDlQcwzcvUlGUf79AnQxq/2NPiS/AULhhM4TKutIt8Q==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/core": "^7.25.2", + "@babel/generator": "^7.25.0", + "@babel/parser": "^7.25.3", + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.3", + "@babel/types": "^7.25.2", + "accepts": "^1.3.7", + "chalk": "^4.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.32.0", + "image-size": "^1.0.2", + "invariant": "^2.2.4", + "jest-worker": "^29.7.0", + "jsc-safe-url": "^0.2.2", + "lodash.throttle": "^4.1.1", + "metro-babel-transformer": "0.83.3", + "metro-cache": "0.83.3", + "metro-cache-key": "0.83.3", + "metro-config": "0.83.3", + "metro-core": "0.83.3", + "metro-file-map": "0.83.3", + "metro-resolver": "0.83.3", + "metro-runtime": "0.83.3", + "metro-source-map": "0.83.3", + "metro-symbolicate": "0.83.3", + "metro-transform-plugins": "0.83.3", + "metro-transform-worker": "0.83.3", + "mime-types": "^2.1.27", + "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" + } + }, + "node_modules/metro-babel-transformer": { + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.83.3.tgz", + "integrity": "sha512-1vxlvj2yY24ES1O5RsSIvg4a4WeL7PFXgKOHvXTXiW0deLvQr28ExXj6LjwCCDZ4YZLhq6HddLpZnX4dEdSq5g==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.25.2", + "flow-enums-runtime": "^0.0.6", + "hermes-parser": "0.32.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">=20.19.4" + } + }, + "node_modules/metro-babel-transformer/node_modules/hermes-estree": { + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.32.0.tgz", + "integrity": "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==", + "license": "MIT" + }, + "node_modules/metro-babel-transformer/node_modules/hermes-parser": { + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz", + "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", + "license": "MIT", + "dependencies": { + "hermes-estree": "0.32.0" + } + }, + "node_modules/metro-cache": { + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.83.3.tgz", + "integrity": "sha512-3jo65X515mQJvKqK3vWRblxDEcgY55Sk3w4xa6LlfEXgQ9g1WgMh9m4qVZVwgcHoLy0a2HENTPCCX4Pk6s8c8Q==", + "license": "MIT", + "dependencies": { + "exponential-backoff": "^3.1.1", + "flow-enums-runtime": "^0.0.6", + "https-proxy-agent": "^7.0.5", + "metro-core": "0.83.3" + }, + "engines": { + "node": ">=20.19.4" + } + }, + "node_modules/metro-cache-key": { + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.83.3.tgz", + "integrity": "sha512-59ZO049jKzSmvBmG/B5bZ6/dztP0ilp0o988nc6dpaDsU05Cl1c/lRf+yx8m9WW/JVgbmfO5MziBU559XjI5Zw==", + "license": "MIT", + "dependencies": { + "flow-enums-runtime": "^0.0.6" + }, + "engines": { + "node": ">=20.19.4" + } + }, + "node_modules/metro-config": { + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.83.3.tgz", + "integrity": "sha512-mTel7ipT0yNjKILIan04bkJkuCzUUkm2SeEaTads8VfEecCh+ltXchdq6DovXJqzQAXuR2P9cxZB47Lg4klriA==", + "license": "MIT", + "dependencies": { + "connect": "^3.6.5", + "flow-enums-runtime": "^0.0.6", + "jest-validate": "^29.7.0", + "metro": "0.83.3", + "metro-cache": "0.83.3", + "metro-core": "0.83.3", + "metro-runtime": "0.83.3", + "yaml": "^2.6.1" + }, + "engines": { + "node": ">=20.19.4" + } + }, + "node_modules/metro-core": { + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.83.3.tgz", + "integrity": "sha512-M+X59lm7oBmJZamc96usuF1kusd5YimqG/q97g4Ac7slnJ3YiGglW5CsOlicTR5EWf8MQFxxjDoB6ytTqRe8Hw==", + "license": "MIT", + "dependencies": { + "flow-enums-runtime": "^0.0.6", + "lodash.throttle": "^4.1.1", + "metro-resolver": "0.83.3" + }, + "engines": { + "node": ">=20.19.4" + } + }, + "node_modules/metro-file-map": { + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.83.3.tgz", + "integrity": "sha512-jg5AcyE0Q9Xbbu/4NAwwZkmQn7doJCKGW0SLeSJmzNB9Z24jBe0AL2PHNMy4eu0JiKtNWHz9IiONGZWq7hjVTA==", + "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" + } + }, + "node_modules/metro-minify-terser": { + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.83.3.tgz", + "integrity": "sha512-O2BmfWj6FSfzBLrNCXt/rr2VYZdX5i6444QJU0fFoc7Ljg+Q+iqebwE3K0eTvkI6TRjELsXk1cjU+fXwAR4OjQ==", + "license": "MIT", + "dependencies": { + "flow-enums-runtime": "^0.0.6", + "terser": "^5.15.0" + }, + "engines": { + "node": ">=20.19.4" + } + }, + "node_modules/metro-resolver": { + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.83.3.tgz", + "integrity": "sha512-0js+zwI5flFxb1ktmR///bxHYg7OLpRpWZlBBruYG8OKYxeMP7SV0xQ/o/hUelrEMdK4LJzqVtHAhBm25LVfAQ==", + "license": "MIT", + "dependencies": { + "flow-enums-runtime": "^0.0.6" + }, + "engines": { + "node": ">=20.19.4" + } + }, + "node_modules/metro-runtime": { + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.83.3.tgz", + "integrity": "sha512-JHCJb9ebr9rfJ+LcssFYA2x1qPYuSD/bbePupIGhpMrsla7RCwC/VL3yJ9cSU+nUhU4c9Ixxy8tBta+JbDeZWw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.25.0", + "flow-enums-runtime": "^0.0.6" + }, + "engines": { + "node": ">=20.19.4" + } + }, + "node_modules/metro-source-map": { + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.83.3.tgz", + "integrity": "sha512-xkC3qwUBh2psVZgVavo8+r2C9Igkk3DibiOXSAht1aYRRcztEZNFtAMtfSB7sdO2iFMx2Mlyu++cBxz/fhdzQg==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.3", + "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3", + "@babel/types": "^7.25.2", + "flow-enums-runtime": "^0.0.6", + "invariant": "^2.2.4", + "metro-symbolicate": "0.83.3", + "nullthrows": "^1.1.1", + "ob1": "0.83.3", + "source-map": "^0.5.6", + "vlq": "^1.0.0" + }, + "engines": { + "node": ">=20.19.4" + } + }, + "node_modules/metro-symbolicate": { + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.83.3.tgz", + "integrity": "sha512-F/YChgKd6KbFK3eUR5HdUsfBqVsanf5lNTwFd4Ca7uuxnHgBC3kR/Hba/RGkenR3pZaGNp5Bu9ZqqP52Wyhomw==", + "license": "MIT", + "dependencies": { + "flow-enums-runtime": "^0.0.6", + "invariant": "^2.2.4", + "metro-source-map": "0.83.3", + "nullthrows": "^1.1.1", + "source-map": "^0.5.6", + "vlq": "^1.0.0" + }, + "bin": { + "metro-symbolicate": "src/index.js" + }, + "engines": { + "node": ">=20.19.4" + } + }, + "node_modules/metro-transform-plugins": { + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.83.3.tgz", + "integrity": "sha512-eRGoKJU6jmqOakBMH5kUB7VitEWiNrDzBHpYbkBXW7C5fUGeOd2CyqrosEzbMK5VMiZYyOcNFEphvxk3OXey2A==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.25.2", + "@babel/generator": "^7.25.0", + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.3", + "flow-enums-runtime": "^0.0.6", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">=20.19.4" + } + }, + "node_modules/metro-transform-worker": { + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.83.3.tgz", + "integrity": "sha512-Ztekew9t/gOIMZX1tvJOgX7KlSLL5kWykl0Iwu2cL2vKMKVALRl1hysyhUw0vjpAvLFx+Kfq9VLjnHIkW32fPA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.25.2", + "@babel/generator": "^7.25.0", + "@babel/parser": "^7.25.3", + "@babel/types": "^7.25.2", + "flow-enums-runtime": "^0.0.6", + "metro": "0.83.3", + "metro-babel-transformer": "0.83.3", + "metro-cache": "0.83.3", + "metro-cache-key": "0.83.3", + "metro-minify-terser": "0.83.3", + "metro-source-map": "0.83.3", + "metro-transform-plugins": "0.83.3", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">=20.19.4" + } + }, + "node_modules/metro/node_modules/hermes-estree": { + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.32.0.tgz", + "integrity": "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==", + "license": "MIT" + }, + "node_modules/metro/node_modules/hermes-parser": { + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz", + "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", + "license": "MIT", + "dependencies": { + "hermes-estree": "0.32.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.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/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/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": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/minizlib": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "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/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "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": "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/nested-error-stacks": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.0.1.tgz", + "integrity": "sha512-SrQrok4CATudVzBS7coSz26QRSmlK9TzzoFbeKfcPBUFPjcQM9Rqvr/DlJkOrwI/0KcgvMub1n1g5Jt9EgRn4A==", + "license": "MIT" + }, + "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.38", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.38.tgz", + "integrity": "sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw==", + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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/npm-package-arg/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "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.83.3", + "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.83.3.tgz", + "integrity": "sha512-egUxXCDwoWG06NGCS5s5AdcpnumHKJlfd3HH06P3m9TEMwwScfcY35wpQxbm9oHof+dM/lVH9Rfyu1elTVelSA==", + "license": "MIT", + "dependencies": { + "flow-enums-runtime": "^0.0.6" + }, + "engines": { + "node": ">=20.19.4" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-is": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "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/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "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/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "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.3.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.3.5.tgz", + "integrity": "sha512-NxVFwLAnrd9i7KUBxC4DrUhmgjzOs+1Qm50D3oF1/oL+r1NpZ4gA7xvG0/zJ8evR7zIKn4vLf7qTNduWFtCrRw==", + "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/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/plist": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", + "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", + "license": "MIT", + "dependencies": { + "@xmldom/xmldom": "^0.8.8", + "base64-js": "^1.5.1", + "xmlbuilder": "^15.1.1" + }, + "engines": { + "node": ">=10.4.0" + } + }, + "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/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", + "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.7", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/pretty-format/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/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/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/qrcode-terminal": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.11.0.tgz", + "integrity": "sha512-Uu7ii+FQy4Qf82G4xu7ShHhjhGahEpCWc3x8UavY3CTcWV+ufmmCtwkr7ZKsX42jdL0kr1B5FKUeqJvAn51jzQ==", + "bin": { + "qrcode-terminal": "bin/qrcode-terminal.js" + } + }, + "node_modules/query-string": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-7.1.3.tgz", + "integrity": "sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==", + "license": "MIT", + "dependencies": { + "decode-uri-component": "^0.2.2", + "filter-obj": "^1.1.0", + "split-on-first": "^1.0.0", + "strict-uri-encode": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/queue": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", + "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", + "license": "MIT", + "dependencies": { + "inherits": "~2.0.3" + } + }, + "node_modules/quickselect": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-3.0.0.tgz", + "integrity": "sha512-XdjUArbK4Bm5fLLvlm5KpTFOiOThgfWWI4axAZDWg4E/0mKdZyI9tNEfds27qCi1ze/vwTR16kvmmGhRra3c2g==", + "license": "ISC" + }, + "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/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/react": { + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz", + "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==", + "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-dom": { + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz", + "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.26.0" + }, + "peerDependencies": { + "react": "^19.1.0" + } + }, + "node_modules/react-fast-compare": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", + "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==", + "license": "MIT" + }, + "node_modules/react-freeze": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/react-freeze/-/react-freeze-1.0.4.tgz", + "integrity": "sha512-r4F0Sec0BLxWicc7HEyo2x3/2icUTrRmDjaaRyzzn+7aDyFZliszMDOgLVwSnQnYENOlL1o569Ze2HZefk8clA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "react": ">=17.0.0" + } + }, + "node_modules/react-is": { + "version": "19.2.5", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.5.tgz", + "integrity": "sha512-Dn0t8IQhCmeIT3wu+Apm1/YVsJXsGWi6k4sPdnBIdqMVtHtv0IGi6dcpNpNkNac0zB2uUAqNX3MHzN8c+z2rwQ==", + "license": "MIT" + }, + "node_modules/react-native": { + "version": "0.81.5", + "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.81.5.tgz", + "integrity": "sha512-1w+/oSjEXZjMqsIvmkCRsOc8UBYv163bTWKTI8+1mxztvQPhCRYGTvZ/PL1w16xXHneIj/SLGfxWg2GWN2uexw==", + "license": "MIT", + "dependencies": { + "@jest/create-cache-key-function": "^29.7.0", + "@react-native/assets-registry": "0.81.5", + "@react-native/codegen": "0.81.5", + "@react-native/community-cli-plugin": "0.81.5", + "@react-native/gradle-plugin": "0.81.5", + "@react-native/js-polyfills": "0.81.5", + "@react-native/normalize-colors": "0.81.5", + "@react-native/virtualized-lists": "0.81.5", + "abort-controller": "^3.0.0", + "anser": "^1.4.9", + "ansi-regex": "^5.0.0", + "babel-jest": "^29.7.0", + "babel-plugin-syntax-hermes-parser": "0.29.1", + "base64-js": "^1.5.1", + "commander": "^12.0.0", + "flow-enums-runtime": "^0.0.6", + "glob": "^7.1.1", + "invariant": "^2.2.4", + "jest-environment-node": "^29.7.0", + "memoize-one": "^5.0.0", + "metro-runtime": "^0.83.1", + "metro-source-map": "^0.83.1", + "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.26.0", + "semver": "^7.1.3", + "stacktrace-parser": "^0.1.10", + "whatwg-fetch": "^3.0.0", + "ws": "^6.2.3", + "yargs": "^17.6.2" + }, + "bin": { + "react-native": "cli.js" + }, + "engines": { + "node": ">= 20.19.4" + }, + "peerDependencies": { + "@types/react": "^19.1.0", + "react": "^19.1.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-native-is-edge-to-edge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/react-native-is-edge-to-edge/-/react-native-is-edge-to-edge-1.3.1.tgz", + "integrity": "sha512-NIXU/iT5+ORyCc7p0z2nnlkouYKX425vuU1OEm6bMMtWWR9yvb+Xg5AZmImTKoF9abxCPqrKC3rOZsKzUYgYZA==", + "license": "MIT", + "peerDependencies": { + "react": "*", + "react-native": "*" + } + }, + "node_modules/react-native-safe-area-context": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/react-native-safe-area-context/-/react-native-safe-area-context-5.6.2.tgz", + "integrity": "sha512-4XGqMNj5qjUTYywJqpdWZ9IG8jgkS3h06sfVjfw5yZQZfWnRFXczi0GnYyFyCc2EBps/qFmoCH8fez//WumdVg==", + "license": "MIT", + "peerDependencies": { + "react": "*", + "react-native": "*" + } + }, + "node_modules/react-native-screens": { + "version": "4.16.0", + "resolved": "https://registry.npmjs.org/react-native-screens/-/react-native-screens-4.16.0.tgz", + "integrity": "sha512-yIAyh7F/9uWkOzCi1/2FqvNvK6Wb9Y1+Kzn16SuGfN9YFJDTbwlzGRvePCNTOX0recpLQF3kc2FmvMUhyTCH1Q==", + "license": "MIT", + "dependencies": { + "react-freeze": "^1.0.0", + "react-native-is-edge-to-edge": "^1.2.1", + "warn-once": "^0.1.0" + }, + "peerDependencies": { + "react": "*", + "react-native": "*" + } + }, + "node_modules/react-native-svg": { + "version": "15.15.4", + "resolved": "https://registry.npmjs.org/react-native-svg/-/react-native-svg-15.15.4.tgz", + "integrity": "sha512-boT/vIRgj6zZKBpfTPJJiYWMbZE9duBMOwPK6kCSTgxsS947IFMOq9OgIFkpWZTB7t229H24pDRkh3W9ZK/J1A==", + "license": "MIT", + "dependencies": { + "css-select": "^5.1.0", + "css-tree": "^1.1.3", + "warn-once": "0.1.1" + }, + "peerDependencies": { + "react": "*", + "react-native": "*" + } + }, + "node_modules/react-native-webview": { + "version": "13.15.0", + "resolved": "https://registry.npmjs.org/react-native-webview/-/react-native-webview-13.15.0.tgz", + "integrity": "sha512-Vzjgy8mmxa/JO6l5KZrsTC7YemSdq+qB01diA0FqjUTaWGAGwuykpJ73MDj3+mzBSlaDxAEugHzTtkUQkQEQeQ==", + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^4.0.0", + "invariant": "2.2.4" + }, + "peerDependencies": { + "react": "*", + "react-native": "*" + } + }, + "node_modules/react-native/node_modules/@react-native/virtualized-lists": { + "version": "0.81.5", + "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.81.5.tgz", + "integrity": "sha512-UVXgV/db25OPIvwZySeToXD/9sKKhOdkcWmmf4Jh8iBZuyfML+/5CasaZ1E7Lqg6g3uqVQq75NqIwkYmORJMPw==", + "license": "MIT", + "dependencies": { + "invariant": "^2.2.4", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 20.19.4" + }, + "peerDependencies": { + "@types/react": "^19.1.0", + "react": "*", + "react-native": "*" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-native/node_modules/brace-expansion": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "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-native/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/react-native/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/react-native/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/react-native/node_modules/ws": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", + "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", + "license": "MIT", + "dependencies": { + "async-limiter": "~1.0.0" + } + }, + "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/react-remove-scroll": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz", + "integrity": "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==", + "license": "MIT", + "dependencies": { + "react-remove-scroll-bar": "^2.3.7", + "react-style-singleton": "^2.2.3", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.3", + "use-sidecar": "^1.1.3" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", + "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", + "license": "MIT", + "dependencies": { + "react-style-singleton": "^2.2.2", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-style-singleton": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", + "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", + "license": "MIT", + "dependencies": { + "get-nonce": "^1.0.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "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.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.1.tgz", + "integrity": "sha512-dLsljMd9sqwRkby8zhO1gSg3PnJIBFid8f4CQj/sXx+7cKx+E7u0PKhZ+U4wmhx7EfmtvnA318oVaIkAB1lRJw==", + "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/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requireg": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/requireg/-/requireg-0.2.2.tgz", + "integrity": "sha512-nYzyjnFcPNGR3lx9lwPPPnuQxv6JWEZd2Ci0u9opN7N5zUEPIhY/GbL3vMGOr2UXwEg9WwSyV9X9Y/kLFgPsOg==", + "dependencies": { + "nested-error-stacks": "~2.0.1", + "rc": "~1.2.7", + "resolve": "~1.7.1" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/requireg/node_modules/resolve": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz", + "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", + "license": "MIT", + "dependencies": { + "path-parse": "^1.0.5" + } + }, + "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/resolve.exports": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", + "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "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/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/brace-expansion": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", + "license": "BSD-3-Clause" + }, + "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/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sax": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", + "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=11.0.0" + } + }, + "node_modules/scheduler": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", + "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", + "license": "MIT" + }, + "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/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/server-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/server-only/-/server-only-0.0.1.tgz", + "integrity": "sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA==", + "license": "MIT" + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/sf-symbols-typescript": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/sf-symbols-typescript/-/sf-symbols-typescript-2.2.0.tgz", + "integrity": "sha512-TPbeg0b7ylrswdGCji8FRGFAKuqbpQlLbL8SOle3j1iHSs5Ob5mhvMAxWN2UItOjgALAB5Zp3fmMfj8mbWvXKw==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", + "license": "MIT" + }, + "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.8.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", + "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/simple-swizzle": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.4.tgz", + "integrity": "sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "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/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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/split-on-first": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", + "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "license": "BSD-3-Clause" + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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/strict-uri-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", + "integrity": "sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "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/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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/sucrase": { + "version": "3.35.1", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", + "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "tinyglobby": "^0.2.11", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/sucrase/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "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/tar": { + "version": "7.5.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.13.tgz", + "integrity": "sha512-tOG/7GyXpFevhXVh8jOPJrmtRpOTsYqUIkVdVooZYJS/z8WhfQUX8RJILmeuJNinGAMSu1veBr4asSHFt5/hng==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "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.46.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.46.2.tgz", + "integrity": "sha512-uxfo9fPcSgLDYob/w1FuL0c99MWiJDnv+5qXSQc5+Ki5NjVNsYi66INnMFBjf6uFz6OnX12piJQPF4IpjJTNTw==", + "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/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/test-exclude/node_modules/brace-expansion": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/test-exclude/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/test-exclude/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "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.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "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.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/tinyqueue": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-3.0.0.tgz", + "integrity": "sha512-gRa9gwYU3ECmQYv3lslts5hxuIa90veaEcxDYuu3QGOIAEM2mOZkVHp48ANJuu1CURtRdHKUBY5Lm1tHV+sD4g==", + "license": "ISC" + }, + "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/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "license": "Apache-2.0" + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "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/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "devOptional": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici": { + "version": "6.25.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.25.0.tgz", + "integrity": "sha512-ZgpWDC5gmNiuY9CnLVXEH8rl50xhRCuLNA97fAUnKi8RRuV4E6KG31pDTsLVUKnohJE0I3XDrTeEydAXRw47xg==", + "license": "MIT", + "engines": { + "node": ">=18.17" + } + }, + "node_modules/undici-types": { + "version": "7.19.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.19.2.tgz", + "integrity": "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==", + "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/unimodules-app-loader": { + "version": "6.0.8", + "resolved": "https://registry.npmjs.org/unimodules-app-loader/-/unimodules-app-loader-6.0.8.tgz", + "integrity": "sha512-fqS8QwT/MC/HAmw1NKCHdzsPA6WaLm0dNmoC5Pz6lL+cDGYeYCNdHMO9fy08aL2ZD7cVkNM0pSR/AoNRe+rslA==", + "license": "MIT" + }, + "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.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "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/use-callback-ref": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", + "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-latest-callback": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/use-latest-callback/-/use-latest-callback-0.2.6.tgz", + "integrity": "sha512-FvRG9i1HSo0wagmX63Vrm8SnlUU3LMM3WyZkQ76RnslpBrX694AdG4A0zQBx2B3ZifFA0yv/BaEHGBnEax5rZg==", + "license": "MIT", + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/use-sidecar": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", + "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", + "license": "MIT", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sync-external-store": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", + "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, + "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==", + "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/vaul": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vaul/-/vaul-1.1.2.tgz", + "integrity": "sha512-ZFkClGpWyI2WUQjdLJ/BaGuV6AVQiJ3uELGk3OYtP+B6yCO7Cmn9vPFXVJkRaGkOJu3m8bQMgtyzNHixULceQA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-dialog": "^1.1.1" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc" + } + }, + "node_modules/vaul/node_modules/@radix-ui/react-dialog": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.15.tgz", + "integrity": "sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/vaul/node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz", + "integrity": "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-escape-keydown": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/vaul/node_modules/@radix-ui/react-focus-scope": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz", + "integrity": "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/vaul/node_modules/@radix-ui/react-portal": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz", + "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/vaul/node_modules/@radix-ui/react-presence": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.5.tgz", + "integrity": "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/vaul/node_modules/@radix-ui/react-primitive": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", + "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/vaul/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "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/warn-once": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/warn-once/-/warn-once-0.1.1.tgz", + "integrity": "sha512-VkQZJbO8zVImzYFteBXvBOZEl1qL175WH8VmZcxF2fZAoudNhNDvHi+doCaAEdU2l2vtcIwa2zn0QK5+I1HQ3Q==", + "license": "MIT" + }, + "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/webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=8" + } + }, + "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-without-unicode": { + "version": "8.0.0-3", + "resolved": "https://registry.npmjs.org/whatwg-url-without-unicode/-/whatwg-url-without-unicode-8.0.0-3.tgz", + "integrity": "sha512-HoKuzZrUlgpz35YO27XgD28uh/WJH4B0+3ttFqRo//lmq+9T/mIOJ6kqmINI9HpUpz1imRC/nR/lxKpJiv0uig==", + "license": "MIT", + "dependencies": { + "buffer": "^5.4.3", + "punycode": "^2.1.1", + "webidl-conversions": "^5.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.20", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", + "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wonka": { + "version": "6.3.6", + "resolved": "https://registry.npmjs.org/wonka/-/wonka-6.3.6.tgz", + "integrity": "sha512-MXH+6mDHAZ2GuMpgKS055FR6v0xVP3XwquxIMYXgiW+FejHQlMGlvVRZT4qMCxR+bEo/FCtIdKxwej9WV3YQag==", + "license": "MIT" + }, + "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/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "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.8.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.3.tgz", + "integrity": "sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "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/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..b60a2f1 --- /dev/null +++ b/package.json @@ -0,0 +1,40 @@ +{ + "name": "bincio", + "version": "0.1.0", + "private": true, + "main": "expo-router/entry", + "scripts": { + "start": "expo start", + "android": "expo run:android", + "ios": "expo run:ios", + "lint": "expo lint" + }, + "dependencies": { + "@maplibre/maplibre-react-native": "~11.0.0", + "expo": "~54.0.33", + "expo-background-fetch": "~14.0.9", + "expo-constants": "~18.0.13", + "expo-document-picker": "~14.0.8", + "expo-file-system": "~19.0.21", + "expo-linking": "~8.0.11", + "expo-notifications": "~0.32.16", + "expo-router": "~6.0.23", + "expo-splash-screen": "~31.0.13", + "expo-sqlite": "~16.0.10", + "expo-status-bar": "~3.0.9", + "expo-system-ui": "~6.0.9", + "expo-task-manager": "~14.0.9", + "react": "19.1.0", + "react-dom": "19.1.0", + "react-native": "0.81.5", + "react-native-safe-area-context": "~5.6.0", + "react-native-screens": "~4.16.0", + "react-native-svg": "~15.15.0", + "react-native-webview": "13.15.0" + }, + "devDependencies": { + "@babel/core": "^7.25.0", + "@types/react": "~19.1.0", + "typescript": "~5.9.2" + } +} diff --git a/setup.sh b/setup.sh new file mode 100755 index 0000000..d530f66 --- /dev/null +++ b/setup.sh @@ -0,0 +1,104 @@ +#!/usr/bin/env bash +# Bincio mobile app — one-time setup +# Run from the mobile/ directory: ./setup.sh +# Or from the repo root: bash mobile/setup.sh +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +cd "$SCRIPT_DIR" + +# ── Colours ─────────────────────────────────────────────────────────────────── +GREEN='\033[0;32m'; YELLOW='\033[1;33m'; RED='\033[0;31m'; RESET='\033[0m' +ok() { echo -e "${GREEN}✓${RESET} $*"; } +warn() { echo -e "${YELLOW}⚠${RESET} $*"; } +die() { echo -e "${RED}✗${RESET} $*" >&2; exit 1; } +step() { echo -e "\n${YELLOW}▸${RESET} $*"; } + +echo "" +echo " Bincio mobile setup" +echo " ═══════════════════" +echo "" + +# ── 1. Node.js ──────────────────────────────────────────────────────────────── +step "Checking Node.js..." +if ! command -v node &>/dev/null; then + die "Node.js not found. Install from https://nodejs.org (v20+ recommended)." +fi +NODE_MAJOR=$(node -v | sed 's/v//' | cut -d. -f1) +if [ "$NODE_MAJOR" -lt 18 ]; then + die "Node.js 18+ required (found $(node -v)). Update at https://nodejs.org" +fi +ok "Node.js $(node -v)" + +# ── 2. npm ──────────────────────────────────────────────────────────────────── +if ! command -v npm &>/dev/null; then + die "npm not found. It ships with Node.js — check your installation." +fi +ok "npm $(npm -v)" + +# ── 3. Expo CLI (global, optional — we use npx) ─────────────────────────────── +step "Checking Expo CLI..." +if command -v expo &>/dev/null; then + ok "Expo CLI $(expo --version) (global)" +else + warn "Expo CLI not installed globally. Using npx instead (slightly slower)." + warn "Install globally with: npm install -g expo-cli" +fi + +# ── 4. Platform tools ───────────────────────────────────────────────────────── +step "Checking platform tools..." +PLATFORM="$(uname -s)" + +if [ "$PLATFORM" = "Darwin" ]; then + if command -v xcodebuild &>/dev/null; then + ok "Xcode $(xcodebuild -version 2>/dev/null | head -1 | awk '{print $2}')" + else + warn "Xcode not found — iOS builds will not work." + warn "Install Xcode from the App Store, then: xcode-select --install" + fi + if command -v xcrun &>/dev/null && xcrun --sdk iphoneos --show-sdk-version &>/dev/null; then + ok "iOS SDK available" + fi +fi + +if command -v adb &>/dev/null; then + ok "Android SDK / adb found" +else + warn "adb not found — Android builds require Android Studio." + warn "Install from https://developer.android.com/studio" +fi + +# ── 5. Install dependencies ─────────────────────────────────────────────────── +step "Installing npm dependencies..." +if [ -d node_modules ] && [ -f node_modules/.package-lock.json ]; then + ok "node_modules already present — running npm install to sync..." +fi +npm install +ok "Dependencies installed" + +# ── 6. expo-env.d.ts (required by expo-router) ──────────────────────────────── +step "Generating Expo type declarations..." +npx expo customize expo-env.d.ts --no-install 2>/dev/null || true +if [ ! -f expo-env.d.ts ]; then + echo '/// ' > expo-env.d.ts +fi +ok "expo-env.d.ts ready" + +# ── 7. Summary ──────────────────────────────────────────────────────────────── +echo "" +echo " ══════════════════════════════════════════" +echo " Setup complete! Next steps:" +echo "" +echo " Start with Expo Go (scan QR on your phone):" +echo " npx expo start" +echo "" +echo " Run on Android emulator:" +echo " npx expo run:android" +echo "" +echo " Run on iOS simulator (macOS only):" +echo " npx expo run:ios" +echo "" +echo " Build APK for Karoo sideload:" +echo " npx eas build -p android --profile preview" +echo " ══════════════════════════════════════════" +echo "" diff --git a/theme.ts b/theme.ts new file mode 100644 index 0000000..a0963ab --- /dev/null +++ b/theme.ts @@ -0,0 +1,29 @@ +export type PaletteKey = 'auto' | 'default' | 'giro' | 'tour' | 'vuelta'; + +export const PALETTES = { + default: { accent: '#60a5fa', dim: 'rgba(96,165,250,0.15)', label: 'Default' }, + giro: { accent: '#f472b6', dim: 'rgba(244,114,182,0.15)', label: "Giro d'Italia" }, + tour: { accent: '#facc15', dim: 'rgba(250,204,21,0.15)', label: 'Tour de France' }, + vuelta: { accent: '#ef4444', dim: 'rgba(239,68,68,0.15)', label: 'Vuelta a España' }, +} as const satisfies Record; + +export type Theme = (typeof PALETTES)[keyof typeof PALETTES]; + +// Race windows [month 0-indexed, day inclusive] — update each year +const RACES: Array<{ key: Exclude; start: [number, number]; end: [number, number] }> = [ + { key: 'giro', start: [4, 8], end: [5, 1] }, // May 8 – Jun 1 + { key: 'tour', start: [5, 27], end: [6, 19] }, // Jun 27 – Jul 19 + { key: 'vuelta', start: [7, 15], end: [8, 6] }, // Aug 15 – Sep 6 +]; + +export function autoKey(): Exclude { + const now = new Date(); + const y = now.getFullYear(); + for (const r of RACES) { + const start = new Date(y, r.start[0], r.start[1]); + const end = new Date(y, r.end[0], r.end[1] + 1); + if (now >= start && now < end) return r.key; + } + return 'default'; +} + diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..b9965f5 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,16 @@ +{ + "extends": "expo/tsconfig.base", + "compilerOptions": { + "strict": true, + "paths": { + "@/*": [ + "./*" + ] + } + }, + "include": [ + "**/*.ts", + "**/*.tsx", + ".expo/types/**/*.d.ts" + ] +}