From db4226af46d1533c9b86bd384f2d1cdcf0d413ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Gadomski?= Date: Mon, 27 Jul 2026 12:46:47 +0200 Subject: [PATCH 1/7] Add voip call example --- mobile-react-native/README.md | 5 + mobile-react-native/voip-call/README.md | 97 + .../voip-call/app/.env.example | 3 + .../voip-call/app/.eslintrc.js | 16 + mobile-react-native/voip-call/app/.gitignore | 24 + mobile-react-native/voip-call/app/App.tsx | 107 + mobile-react-native/voip-call/app/README.md | 28 + mobile-react-native/voip-call/app/app.json | 69 + .../app/assets/images/adaptive-icon.png | Bin 0 -> 3648 bytes .../voip-call/app/assets/images/favicon.png | Bin 0 -> 1129 bytes .../app/assets/images/fishjam-logo.png | Bin 0 -> 3761 bytes .../voip-call/app/assets/images/icon.png | Bin 0 -> 6483 bytes .../voip-call/app/assets/images/splash.png | Bin 0 -> 6506 bytes .../voip-call/app/babel.config.js | 6 + mobile-react-native/voip-call/app/index.js | 6 + .../voip-call/app/metro.config.js | 30 + .../voip-call/app/package.json | 42 + .../voip-call/app/prettier.config.js | 1 + .../voip-call/app/src/components/Avatar.tsx | 62 + .../app/src/components/InCallButton.tsx | 70 + .../app/src/components/VideoCallView.tsx | 99 + .../voip-call/app/src/components/index.ts | 3 + .../voip-call/app/src/hooks/useCallRoom.ts | 89 + .../app/src/hooks/useCallSignaling.ts | 122 + .../app/src/hooks/useDeviceRegistration.ts | 27 + .../voip-call/app/src/hooks/usePlaceCall.ts | 50 + .../app/src/hooks/useRecentsRedial.ts | 25 + .../app/src/hooks/useRequestPermissions.ts | 30 + .../voip-call/app/src/screens/CallScreen.tsx | 44 + .../voip-call/app/src/screens/InCallView.tsx | 343 + .../voip-call/app/src/screens/LoginScreen.tsx | 165 + .../app/src/screens/OutgoingCallView.tsx | 81 + .../voip-call/app/src/screens/UsersScreen.tsx | 149 + .../voip-call/app/src/theme/colors.ts | 27 + .../voip-call/app/src/user/UserContext.ts | 24 + .../voip-call/app/src/user/UserProvider.tsx | 93 + .../voip-call/app/tsconfig.json | 9 + mobile-react-native/voip-call/app/yarn.lock | 6825 +++++++++++++++++ .../voip-call/server/.env.example | 0 .../voip-call/server/.gitignore | 3 + .../voip-call/server/README.md | 146 + .../voip-call/server/avatars/coral.png | Bin 0 -> 10720 bytes .../voip-call/server/avatars/mint.png | Bin 0 -> 11036 bytes .../voip-call/server/avatars/ocean.png | Bin 0 -> 10867 bytes .../voip-call/server/avatars/orchid.png | Bin 0 -> 10897 bytes .../voip-call/server/avatars/sunny.png | Bin 0 -> 10136 bytes .../voip-call/server/deno.json | 12 + .../voip-call/server/deno.lock | 207 + mobile-react-native/voip-call/server/main.ts | 323 + 49 files changed, 9462 insertions(+) create mode 100644 mobile-react-native/voip-call/README.md create mode 100644 mobile-react-native/voip-call/app/.env.example create mode 100644 mobile-react-native/voip-call/app/.eslintrc.js create mode 100644 mobile-react-native/voip-call/app/.gitignore create mode 100644 mobile-react-native/voip-call/app/App.tsx create mode 100644 mobile-react-native/voip-call/app/README.md create mode 100644 mobile-react-native/voip-call/app/app.json create mode 100644 mobile-react-native/voip-call/app/assets/images/adaptive-icon.png create mode 100644 mobile-react-native/voip-call/app/assets/images/favicon.png create mode 100644 mobile-react-native/voip-call/app/assets/images/fishjam-logo.png create mode 100644 mobile-react-native/voip-call/app/assets/images/icon.png create mode 100644 mobile-react-native/voip-call/app/assets/images/splash.png create mode 100644 mobile-react-native/voip-call/app/babel.config.js create mode 100644 mobile-react-native/voip-call/app/index.js create mode 100644 mobile-react-native/voip-call/app/metro.config.js create mode 100644 mobile-react-native/voip-call/app/package.json create mode 100644 mobile-react-native/voip-call/app/prettier.config.js create mode 100644 mobile-react-native/voip-call/app/src/components/Avatar.tsx create mode 100644 mobile-react-native/voip-call/app/src/components/InCallButton.tsx create mode 100644 mobile-react-native/voip-call/app/src/components/VideoCallView.tsx create mode 100644 mobile-react-native/voip-call/app/src/components/index.ts create mode 100644 mobile-react-native/voip-call/app/src/hooks/useCallRoom.ts create mode 100644 mobile-react-native/voip-call/app/src/hooks/useCallSignaling.ts create mode 100644 mobile-react-native/voip-call/app/src/hooks/useDeviceRegistration.ts create mode 100644 mobile-react-native/voip-call/app/src/hooks/usePlaceCall.ts create mode 100644 mobile-react-native/voip-call/app/src/hooks/useRecentsRedial.ts create mode 100644 mobile-react-native/voip-call/app/src/hooks/useRequestPermissions.ts create mode 100644 mobile-react-native/voip-call/app/src/screens/CallScreen.tsx create mode 100644 mobile-react-native/voip-call/app/src/screens/InCallView.tsx create mode 100644 mobile-react-native/voip-call/app/src/screens/LoginScreen.tsx create mode 100644 mobile-react-native/voip-call/app/src/screens/OutgoingCallView.tsx create mode 100644 mobile-react-native/voip-call/app/src/screens/UsersScreen.tsx create mode 100644 mobile-react-native/voip-call/app/src/theme/colors.ts create mode 100644 mobile-react-native/voip-call/app/src/user/UserContext.ts create mode 100644 mobile-react-native/voip-call/app/src/user/UserProvider.tsx create mode 100644 mobile-react-native/voip-call/app/tsconfig.json create mode 100644 mobile-react-native/voip-call/app/yarn.lock create mode 100644 mobile-react-native/voip-call/server/.env.example create mode 100644 mobile-react-native/voip-call/server/.gitignore create mode 100644 mobile-react-native/voip-call/server/README.md create mode 100644 mobile-react-native/voip-call/server/avatars/coral.png create mode 100644 mobile-react-native/voip-call/server/avatars/mint.png create mode 100644 mobile-react-native/voip-call/server/avatars/ocean.png create mode 100644 mobile-react-native/voip-call/server/avatars/orchid.png create mode 100644 mobile-react-native/voip-call/server/avatars/sunny.png create mode 100644 mobile-react-native/voip-call/server/deno.json create mode 100644 mobile-react-native/voip-call/server/deno.lock create mode 100644 mobile-react-native/voip-call/server/main.ts diff --git a/mobile-react-native/README.md b/mobile-react-native/README.md index 95b1d92..67988dd 100644 --- a/mobile-react-native/README.md +++ b/mobile-react-native/README.md @@ -20,3 +20,8 @@ - [Video Player](./video-player/) - minimal livestreaming viewer - joining an existing livestream as a viewer + +- [VoIP Call](./voip-call/) - two-user calling app with native call UI + - ringing through CallKit on iOS and Telecom on Android + - receiving calls while the app is backgrounded or killed + - APNs / FCM push signaling via a small Deno server diff --git a/mobile-react-native/voip-call/README.md b/mobile-react-native/voip-call/README.md new file mode 100644 index 0000000..5a0dbae --- /dev/null +++ b/mobile-react-native/voip-call/README.md @@ -0,0 +1,97 @@ +# VoIP call example + +A two-user calling app: an Expo React Native client (`app/`) and a small Deno +push + signaling server (`server/`). Calls ring through the native call UI +(CallKit on iOS, Telecom on Android) even when the app is backgrounded or +killed, and connect through a Fishjam room. + +How it all works (native configuration, `VoipProvider`, and the JS call flow) +is documented in the +[VoIP calls guide](https://documentation.fishjam.io/docs/how-to/client/voip-calls); +this README only covers running the example. + +## Running the example + +VoIP pushes can only be delivered through your own Apple and Firebase accounts, +so the first step is minting push credentials. Configure APNs to call iOS +devices, FCM to call Android devices, or both to call between them. + +1. **Server credentials.** Create the APNs VoIP certificate (`apns.pem`) and/or + the FCM service account key (`fcm-credentials.json`) as described in + [`server/README.md`](./server/README.md), then start the server: + + ```bash + cd server + deno task start # listens on :4400 + ``` + +2. **`google-services.json` (Android only).** The file is gitignored, so you + have to fetch your own. In the + [Firebase console](https://console.firebase.google.com/), open the same + project the server's `fcm-credentials.json` came from → _Project settings_ → + _Your apps_ → add an **Android** app if none exists → download + `google-services.json` → save it at `app/google-services.json`. + + Its `package_name` must match `android.package` in `app.json` exactly + (`io.fishjam.example.voipcall`), or the build fails with + `No matching client found for package name`. Keep the file at the app root: + `expo prebuild` copies it into `android/` for you, and a copy placed inside + `android/` by hand doesn't survive `expo prebuild --clean`. + +3. **App environment.** Copy `app/.env.example` to `app/.env` and fill it in: + - `EXPO_PUBLIC_FISHJAM_ID`: your Fishjam app id. + - `EXPO_PUBLIC_SANDBOX_API_URL`: the Sandbox API url from your Fishjam + dashboard, used to mint peer tokens. + - `EXPO_PUBLIC_VOIP_SERVER_URL`: where the devices can reach the server + above. Not `localhost` when running on a physical phone; use your + machine's LAN address. + +4. **Run on real devices.** VoIP pushes never reach the iOS Simulator, and FCM + needs Google Play services. + + ```bash + cd app + yarn + yarn ios # or: yarn android + ``` + +To test it, register two users on two devices and call between them. The +[guide's checklist](https://documentation.fishjam.io/docs/how-to/client/voip-calls#11-test-it) +lists the paths worth checking: ringing with the app killed, Recents redial, +and Hold & Accept. + +## Local SDK checkout + +Unlike the other examples here, this one does not build against published +packages alone. The VoIP support it needs is not on npm yet: + +- `@fishjam-cloud/ios-expo-voip` has never been published. +- The `useVoip` / `VoipProvider` API is missing from the published + `@fishjam-cloud/react-native-client`. +- The iOS `VoipManager` native code is missing from the published + `@fishjam-cloud/react-native-webrtc`. + +So `app/package.json` resolves those three through `link:` to a local +[`web-client-sdk`](https://github.com/fishjam-cloud/web-client-sdk) checkout, +expected as a sibling of this repository: + +``` +Desktop/ + examples/ <- you are here + web-client-sdk/ <- expected at ../../../../web-client-sdk +``` + +Two extra pieces make that work under Yarn 1 and Metro: + +- **`resolutions` in `app/package.json`.** The linked packages declare their own + dependencies with Yarn Berry's `workspace:*` protocol, which Yarn 1 cannot + resolve. The overrides pin those to the published `0.29.0` instead. The + top-level `link:` still wins for `react-native-webrtc`, so the local native + code is what actually gets built. +- **`app/metro.config.js`.** It adds the checkout to `watchFolders` and to + `nodeModulesPaths`, so Metro can bundle the symlinked sources, and forces a + single copy of `react` / `react-native`. + +If your checkout lives elsewhere, adjust the `link:` paths. Once the packages +ship to npm, replace each `link:` with a plain version range and delete both +`resolutions` and `app/metro.config.js`. diff --git a/mobile-react-native/voip-call/app/.env.example b/mobile-react-native/voip-call/app/.env.example new file mode 100644 index 0000000..6b4e7be --- /dev/null +++ b/mobile-react-native/voip-call/app/.env.example @@ -0,0 +1,3 @@ +EXPO_PUBLIC_FISHJAM_ID= +EXPO_PUBLIC_SANDBOX_API_URL= +EXPO_PUBLIC_VOIP_SERVER_URL=http://localhost:4400 diff --git a/mobile-react-native/voip-call/app/.eslintrc.js b/mobile-react-native/voip-call/app/.eslintrc.js new file mode 100644 index 0000000..61c7625 --- /dev/null +++ b/mobile-react-native/voip-call/app/.eslintrc.js @@ -0,0 +1,16 @@ +module.exports = { + root: true, + extends: ['expo'], + ignorePatterns: [ + 'dist/*', + 'node_modules/*', + 'ios/*', + 'android/*', + 'server/*', + '.eslintrc.js', + 'prettier.config.js', + ], + rules: { + 'import/no-unresolved': 'off', + }, +}; diff --git a/mobile-react-native/voip-call/app/.gitignore b/mobile-react-native/voip-call/app/.gitignore new file mode 100644 index 0000000..935c017 --- /dev/null +++ b/mobile-react-native/voip-call/app/.gitignore @@ -0,0 +1,24 @@ +# dependencies +node_modules/ + +# Expo +.expo/ +dist/ +expo-env.d.ts + +# debug +npm-debug.* +yarn-debug.* +yarn-error.* + +# macOS +.DS_Store + +# typescript +*.tsbuildinfo + +# generated native folders +/ios +/android + +google-services.json \ No newline at end of file diff --git a/mobile-react-native/voip-call/app/App.tsx b/mobile-react-native/voip-call/app/App.tsx new file mode 100644 index 0000000..476ef05 --- /dev/null +++ b/mobile-react-native/voip-call/app/App.tsx @@ -0,0 +1,107 @@ +import { + FishjamProvider, + useVoip, + VoipProvider, +} from '@fishjam-cloud/react-native-client'; +import { StatusBar } from 'expo-status-bar'; +import { useCallback, useEffect, useRef } from 'react'; +import { ActivityIndicator, StyleSheet, View } from 'react-native'; +import { SafeAreaProvider } from 'react-native-safe-area-context'; + +import type { VoipIncomingPayload } from '@fishjam-cloud/react-native-client'; +import { + useCallSignaling, + type SendSignalRef, +} from './src/hooks/useCallSignaling'; +import { useDeviceRegistration } from './src/hooks/useDeviceRegistration'; +import { useRecentsRedial } from './src/hooks/useRecentsRedial'; +import { useRequestPermissions } from './src/hooks/useRequestPermissions'; +import { CallScreen } from './src/screens/CallScreen'; +import { LoginScreen } from './src/screens/LoginScreen'; +import { UsersScreen } from './src/screens/UsersScreen'; +import { BrandColors } from './src/theme/colors'; +import { useUser } from './src/user/UserContext'; +import { UserProvider } from './src/user/UserProvider'; + +function Main({ sendSignalRef }: { sendSignalRef: SendSignalRef }) { + const { username, isLoading } = useUser(); + const { status, lastEndedReason } = useVoip(); + + useRequestPermissions(); + useCallSignaling(sendSignalRef); + useDeviceRegistration(); + useRecentsRedial(); + + useEffect(() => { + if (!lastEndedReason) return; + console.log( + `On user: ${username}, [VoIP] Call ended — reason: ${lastEndedReason}`, + ); + }, [lastEndedReason, username]); + + // Checked before the session gates below: a call can exist while the user session + // is still loading (answering a VoIP push right after a cold start) or missing + // (still registered for pushes after a logout), and it must connect regardless. + if (status === 'connecting' || status === 'active') { + return ; + } + + if (isLoading) { + return ( + + + + ); + } + + if (!username) { + return ; + } + + return ; +} + +function VoipApp() { + const sendSignalRef: SendSignalRef = useRef(undefined); + + // A call we declined while another one was ringing never reaches the callee's + // signaling flow, so tell the caller ourselves. + const onWaitingCallDeclined = useCallback((payload: VoipIncomingPayload) => { + sendSignalRef.current?.({ + type: 'call-rejected', + to: payload.handle, + roomName: payload.roomName, + }); + }, []); + + return ( + + + + +
+ + + + ); +} + +const App = () => ( + + + + + +); + +export default App; + +const styles = StyleSheet.create({ + root: { flex: 1, backgroundColor: BrandColors.seaBlue20 }, + center: { + flex: 1, + alignItems: 'center', + justifyContent: 'center', + backgroundColor: BrandColors.seaBlue20, + }, +}); diff --git a/mobile-react-native/voip-call/app/README.md b/mobile-react-native/voip-call/app/README.md new file mode 100644 index 0000000..9d482b6 --- /dev/null +++ b/mobile-react-native/voip-call/app/README.md @@ -0,0 +1,28 @@ +# voip-call-app + +The Expo React Native client of the VoIP call example. Setup and run +instructions (push credentials, `google-services.json`, `.env`) are in the +[example README](../README.md) one level up; how the integration works is in +the [VoIP calls guide](https://documentation.fishjam.io/docs/how-to/client/voip-calls). + +## Run + +With the [server](../server/README.md) running and `.env` filled in: + +```bash +yarn +yarn ios # or: yarn android +``` + +Real devices only: VoIP pushes never reach the iOS Simulator, and FCM needs +Google Play services. + +## iOS native registration + +On Expo, the app depends on `@fishjam-cloud/ios-expo-voip` (not on npm yet — +resolved through a `link:` to a local checkout, see the +[example README](../README.md#local-sdk-checkout)), +which registers the native subscriptions the SDK needs at launch: PushKit and +the Recents redial intent forwarding. Without the PushKit registration the app +never receives `didReceiveIncomingPush`, so VoIP pushes don't work at all, and +tap-to-redial silently does nothing. diff --git a/mobile-react-native/voip-call/app/app.json b/mobile-react-native/voip-call/app/app.json new file mode 100644 index 0000000..9211b42 --- /dev/null +++ b/mobile-react-native/voip-call/app/app.json @@ -0,0 +1,69 @@ +{ + "expo": { + "name": "voip-call", + "slug": "voip-call", + "version": "1.0.0", + "orientation": "portrait", + "icon": "./assets/images/icon.png", + "scheme": "voipcall", + "userInterfaceStyle": "automatic", + "newArchEnabled": true, + "ios": { + "bundleIdentifier": "io.fishjam.example.voipcall", + "infoPlist": { + "NSMicrophoneUsageDescription": "Allow $(PRODUCT_NAME) to access your microphone.", + "NSCameraUsageDescription": "Allow $(PRODUCT_NAME) to access your camera for video calls.", + "ITSAppUsesNonExemptEncryption": false + }, + "entitlements": { + "aps-environment": "development" + }, + "appleTeamId": "J5FM626PE2" + }, + "android": { + "package": "io.fishjam.example.voipcall", + "googleServicesFile": "./google-services.json", + "adaptiveIcon": { + "foregroundImage": "./assets/images/adaptive-icon.png", + "monochromeImage": "./assets/images/adaptive-icon.png", + "backgroundColor": "#F1FAFE" + }, + "edgeToEdgeEnabled": true, + "permissions": [ + "android.permission.CAMERA", + "android.permission.RECORD_AUDIO", + "android.permission.MODIFY_AUDIO_SETTINGS", + "android.permission.ACCESS_NETWORK_STATE", + "android.permission.ACCESS_WIFI_STATE" + ] + }, + "web": { + "favicon": "./assets/images/favicon.png" + }, + "plugins": [ + [ + "@fishjam-cloud/react-native-client", + { + "android": { + "enableVoip": true + }, + "ios": { + "enableVoIPBackgroundMode": true + }, + "voip": { + "incomingCallTimeout": 20, + "outgoingCallTimeout": 20 + } + } + ], + [ + "expo-splash-screen", + { + "image": "./assets/images/splash.png", + "resizeMode": "contain", + "backgroundColor": "#F1FAFE" + } + ] + ] + } +} diff --git a/mobile-react-native/voip-call/app/assets/images/adaptive-icon.png b/mobile-react-native/voip-call/app/assets/images/adaptive-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..4053315ea8cad2af412f94df1e5afe347afe93f8 GIT binary patch literal 3648 zcmd5<`#V%?8-CZ!pfMVD8YFbsp@@i5b`#|gN|YEmPANGJwsRv{I=2<=GTKp04#i*w zA;xKS)BzcXJ5jB?62d`y{d>9_AM_t5@5o^{{X`@ZYCHNZ4r$SQnk<#g;BQCvNLr$-^Qt8rI zWWSYB3|UkcqU|qg|B*h?x$>6itu~tL*Bjs01!vUeb=c2*+Eg5KmQq3~5PrK?{faiD z7LVxAFAWzhF4V`8$d;nHJ@oTtV^@WSX-^7-UE~HGdWvrlh5&0)5AnidGlWOdIJRRT zI=as~xh<$D`|;eKIk=>789CVv{%j?lQ7n5~_JM#$TCJE}E0Tsx=_fzr64V;DqgZ}j zBmbV8wZmAI8uqo}^;kq3W00f;;um9cmo|dz0L;{g31cxG+^_?;72$tz>vuyohyRbE z?xfseU~bKJUk@);M(_W2u#@-u4yQY3Bgb^;IlckgL*%`!lG{D3(B85d{40X9&!8V< zIZEX@#b(&g>}vYxJky?WhD1Ir+HswX5DhYH)o}GUHF9^SBdews-wXGpJ;6snO7M}Q z?2&nka|*_#ku!1&5}Mn0)XM5Z(~-@^LmLKFUz~P-hCe3RQwk^YxY?3 zT7=+c_Ml3~G_2F*L+`l$B?>RnIBM1vqkpGuo`U_&WRdo3j%FJ#Nx#+UeOw zuW*s7=Yi}Bx-VzVl-*9g)$-iJQACG(yGR$REDXS+FW+>%Te@bMQUP&_GP(+Ah%%$Y zD7JiuCnoenhcu#mVcVb^2>U5l)oG)C-sQ0r5R|2Bn^ghMZ3K5azSkiEd(YF(AInYK zwz;tv?=G?0;puH+$Z@E_$fOUNT>SZG%8MBkeFiypU+G>Ih zj~Y)3g;&TJ@Uo(`D!_?uF3KSKnR163msN#l7wbJJ9~Km4Sx_!(Ho1x_ox|nZ7k)63 zpuuXE0T|k7uDq+R6&swT>#rx(A7&?C`4>CKxjBK0eB(Q-z+uF8sU-G~NFI+7!N`h8 z@X_s|S&^wDDonge5BD9|!zpDQ*GU}L;@)P@IcxD4jh;Q2!mNX%0q;v?ZUlOcX1lx# zQ&6L<5x(2mv+9t{vm@mPQF2P$Q0Pf{73XR!%I)gZdQzI}?`1kEpRAwDDQfg=iAkN^ zduF`*l)Q?=AMetIM;E)(0j=N9lylR=spECR<3Z8JM>23|yFeM;b+*Au% zeAY^}x1y+P6kfU7mzQm{{#`oWr+TK#60-ARWrP{n`?v$V3V6o^h#i4-D0%tStn=pr z9fU7C_?W$;V^B9TP@e5hOYS&ZQhTSr<5#u;Pq8&+`?@=e17D-$^Ujy2 z-LSnmdeYAS!L?SbMi(Ub@ii_d`YMS*W_BkRX+M@5eKaqh`D0G2*I~Xk>w7EmjFIf> zB950#3g7n8>%AG?s=F!`<03Uh67j}j@4MdWmI z?*GN$AB_K5B!X_vY7=DxV!$b)fwO=NedYts(% zdDq#4GneLTYeN!6JHMUS0SVPGEO#KNIU7_UBIcjqYe@HRpmXJGX$7L~qbJnac?@-^ zqFdh_T#5X2%*@hZ&TxDmQ_USC9hgMKDv&!H_$EVmq?m|t93r;(W2LCBGRlFO)(*3O zO8mZ5E5RG|h?pq_az_Ir+#C-(T)Yyh0NX{w6?g@BpS?CnuEt1F9c7@rGAX}w0I9U^ z0~%S{i>o1(R}q+&hy;v5-bG;fLFE6F_X8a3!KV7aKrUcE6w~Xn8C?7#!+bu8G1hoW zl0}%f^;PEqt5!NjG~7VDj4{{@*#z&0KJjsQgt-X)=gf?8rWWu~_yrc@UtvS|MQT8W zF{Y4M64!W;idw)6)LqLMZu=>6@gqezb6M@;;OG|% zFXoan4>+Lq0DF|-eY2RUYPP#hsBI#=5!kyc_dhuWgX z&D)$QbYc(@YT5y(_dhfq`7*qb+3I5+zCr#*J5@-Y8Y$B<^+31#{p%Fbamzo zoX&ifmfb3q$~pe=sf;nBNL)Z#$B9VD#peaf`%NVDC{am9E}{qnR>wHhM09imv52TQ2=t`#sZa#x^_0z(nF?b+lPB6HlIJhaJ!ARK;iCbY2wH_2{0AW0_uQjeG4PmP9OA^^bGrN0b^I zgC+eNVkJGAk0nnfy_xK$5#WRFYYnMg(USu2m(|hp@vhyzGYM~4J<=b`o1;vC*=o~_ ziEx*;{nf%C;D-D*PWB_MoZ-56>TuI`_pBYA%r5Xh=j^Y4#xDe)H*~z3U6NPj)@kxd z{ICq%2#hZav@wq(HT7^yzfCkPmt70hi%l!;bLc~bC*QwiKE++y8=iQ#_GHZ_-*btA zfBI^P?zrG!ad{=K23}%`#Tyk?CA=7|7wcywom)&t+H|HqKmQ>3+%+)s6>Q7tlbP5) zHT^30oM`&ZSl=kvHoPdDy7~n2Xf&m>lS?3v=5O}vKL%>U1eO6*AT)fN%f}zb_X`8Sl^L^v WwL{zXu4Xfr%d@pQY{}kFz3^Yz_x$Jp literal 0 HcmV?d00001 diff --git a/mobile-react-native/voip-call/app/assets/images/favicon.png b/mobile-react-native/voip-call/app/assets/images/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..408bd746615785760b09e6f23fa8378d3e614331 GIT binary patch literal 1129 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 b^vnMP06&BEV6zMx00000NkvXXu0mjf84yMR literal 0 HcmV?d00001 diff --git a/mobile-react-native/voip-call/app/assets/images/icon.png b/mobile-react-native/voip-call/app/assets/images/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..31be37b2c6c59b989806f6473b5be99b26dc4bb8 GIT binary patch literal 6483 zcmeHMXH-+!+TJG#giH)kP20|Q@Y>*%xDak#jWMU$Cb`)|6Q3dp2RJQ2Ute5$5EDPyK}#sJ8) zwDKYiY|rfIJ!fF;vWvw2ATG$`KlJ$BPE4~MC0}~1{Zb`=zn9C)^i5*@+M)1Ho4_l( z$ep*Z#phHlFEJ|HpJ$+!7!TTu?xLCTL z#HeOkd?_W^$*7BUSBoLkKD*AA))$kf-(?DzD>?`{ZWdct|93_5n~gJyC_7-2T!R}n zl6)zYu?iojg&t|CLmTy%;uz(jI`;6{K*nMy)go}}Gc_rvId+-x)blrH8>tksy}PQW zO7kyi2^S~fUyC7j6F6tP_tE@H228rfqQ7gfe=k!&^4RYxf8n_JDUx5?YzJ4)sUTjX z?J>~yG)*uburU;M@h<;>vLrDDeMs@!Xw>^(_{N}O2e^VF$wAvq!TbMeSSbTHY~dx= z=1dUtBDrD4Ujy|nFXQqY*zac2b$+TZR%QuV7SEvaM3%hZ{vBBM&2mKg!@DoYfeqYCc zt_$buc(c5sM1{twdR}PHpz)o2ty2bD(q!x-kg+tqNDh%C-lLtrx~1OQBtAdSfSVKp zoi;0*l)o_^VM7>~o`1+c)up}J8oDuiPiDcxcOl%e#cuDX|gQKEeR zLVqzD6^4kFG?7&l3dZp*ZxdPgSeiy1dRuI#!u+|vUrhz4HGNf%{cOR@(fW&4QL7>P zsQk;5x#t@)Nj6#V0^Uf*CuFrJQ8;(xsn4nL>ZwYacB+$vAvk^-N1B~$us?k+%?3&R z8N4YY46&hX5lG7L|CfIe#M(EXvarujmY6GkaCGSx@aR6|zU+Mlp&A3?|GD^L}&UjBswR z>>TpGZ%XAknWS{Z>mWX5K)&Nb8rU$*Gth$E%X^9O7?LD0Ph3?pdWgNF_tGDI1&zg| zTXFiy?-TQF?IuK>5#3)`%s^8{FbUX{J=!vie6N@1pFK6?asoIeRO>VBIT_dGSdU$g(ZQXCZxKp#VHPg z7|9-&PJBA^0~5l{Dql6jshMEW&%)cUnA!~A^l)~7Q$N;=4GC5Cpa$e&g>EXDqGth< zN2&yW>1wh$7;fhIN)HfoU25sBE1(vsk;2`jOQtACz>#Y9AdZWWz5F0so+3*ukQpRU z?`D?`q8&1NP!+Gx15cAA=-)ITiy5d>l!RsZJ02u2rQ385HGej_^W3u2agctZ@!UXW z%Q8mCf`ptySFBm@|59(WFe;?0M?!KwUl!0jd)*_Ht+->mo?*-y?8Cc08RLs=n86vF zhv;E@eW0dL3(`U{2!`vIENlF$qq#(ec~}H#x<9cRbR%vruE3v`7wqYuZXMV3ZEPPF z4v%J<;EP;kUtSD56~jzT4L8=)4Z*hzX@p^A^yqsh)l}!qyS<@mMt)INzvff2M!nE( z?q3gYt>>B3JZN3_f_3#Ieeq_Wg=xiuTH)4}0mZ3{d)Y*c9$ju#F4=!1unRU1DG!*g zr@823v=(=}^|fM~y`hv~b+_?Z2vcnt0+~sTEqdnrmyGF|_R%V8aVdwpZQPP~exCg&sho04fC!WrEV=o=C(xUepaDgi7_qZ4Deyon3m8nWn zIIG|zo9>QpX}B)5Slz8JG`tt@S2uQ|P;Y|}Zk;iVJ0sWu-Oy!rsvRZ+WZ07tPK?KS)`% zFXHcJqhKKx$x_xXQjhzzYRjegjC6zh5SGNfRBF@o67Pn#OX(5rW1@5*c3$)SwDO!E zIMHS)SuNl*ou+NQzpV1*xw8Q)Ff9wl>CuZmZa&MZmsUB#Iz6Lc6=GN}R23eKFQj3| z3=*8O{$OO*lH6W1erxTVg)~E=vtol^OwKXuC70T2M`FGX5GfJEa@p1me9`$0--fLN zoc`6?8s5Mv(&M=85NO|so#e|B(Ts^-D5Lno8tiZgI{DF7M8nDc7A=U=(f`>C|2mtu zJjuUZ8YzD*=WvlXVwxyC00PAuHa7^gh05=1bK)*#7Nq)SxZ`;7u0=kJYlQF;xAFz; z9-0hEJ1!53RI5-dmO$*h=ap2j2CZP=UsEseQ$C|A#(SQ(#}D z-I)Py>SVMuOKaq^VZa&$V-c~C-+5e#DjRqsierk!fL z8>6v<<@%;9=#Bhq%HxY@JNhhCP;V&)hKh{(wc^O#wnoQ6!5iJGza)Y+hof zc_I{FdYSOo=N&+|){tv20-~heq>bc;qDY-SR{DtDZrTSFpyYDdoiA^IdB<+Y;MlJM z>0c_?J-}ZC)^wGiA zxWn15rmWN)=_g6<)xRkjtv(V&)EXznJ$vwDnmQ^-Oy~qrgl;czP1NUdrS}IZPPEcw zH_{W~MjzoD>QLe0o@h&O6R89eai^lqnYbKskq(-mwGAG$uU+hza&%>G+b!^MJS=TT z)+Pi?4=B`MlH9LxGl`Gyrey z3tII!7fZfMQM)^Gy>t`qAtcw<9gRy`&)d!Ad1k$%y1F`*tjf>_OB1e*YtgEtcM@}_UU2G# z{bc&SN|D5=^bV?PRz{{xfQ%CQpKkh)JoOow;TgQJu5GPm)46cYww zK!JL|-DTz|#bKj~9C(9cGYf*vxt;1MahY6%Z~lq%)meGx3xo>Sx3f^WGYDM~%R|9n z2=QqId8`=(_+F7De=FM6SayWe;VU#!PNswfMaq)DWp-49A$5zf$6k_lCaJNk>;7o! z5mHFOE&cmAcn!3X10N{c^tB4J^m{^4JwloLSX#8!W#01x54<6dE&T!0D(vAb&r6KI{4ha5<5=z$y;u{#&;K(4)cIJql-*t81g>NU$LGzLc(U|5^* zjzv9E4A3Fxu5Fi{!_>BmQmT7+c*s%GT}E;R*wz3YJ<=vIw;wfd>eYyGKh4C~;-I%u z^0?zZHz9G5dL%T2hrhKsP1PgRV?YV1ikhr|E-6& zlqhrp==?P^UueEG=3z(TzrRH(#diBA54D8JW+}0D)PhhwQpmz{hq!=UW4E*aVFX#H zO3=L#5Ao$p6We-)6;ZkaD60TI;;biWwXngASI|Q-pHoEN;=fZ>CKD|}O<5^?2b*`Z zW8&2^Zut2=6&`(buo@bX-+ch4;TyqeCXKZ>Hw+^NB4%*xnN6ybv$}QjO7hxIc^ajF%DVP=+#a~6Fl+g98cYN2v5aXnqX_8hBy^i(nW6E@U7l%2?q#$ zcOGl($@VL=d^dzN*{V8Mh4Ygot$M@Gar6kE+oo@(&TBxOabPxVe_`MedW(YU%Chi1 z%)BfqirZd|oLQ5L!AON|&aJjS&!|P;J|2G_(KIm{_2tvnxSxXdhj0ARTXqPO$x$v) zn+1DLEAaUQrfJs)-L=Vv(etm*w)G>Ji{<)n(x-;eb(<~~BC|~yvl8q*tG{}BXhsmq zaJMV@-!zMP4H%jJTD*GYLvt@=ejDFVsW_tneNs!Ki!V(iK3jP?^8VX;Qb4D~d=6iy zC(K6=(J;GDk?8~$$jGRP5RHK7t;O|PcG$6`>XesT`}0q@_Q_KMjkD%1=TxUfJMou& zW}k2Fp?sC6%p9Vedoo(TKD2JKvEUQDFqh;7!X#ma=8=GcQ*JNpH2H3fa+6dbMoIDp zVGi_&J>HaQ7p{?s7JPpWNtCJ?yogb4(t=-9!;g}VKzk|fOAqcvmdNR03ZkeFk~G1Z z(*YvJF89l!Bm&g`GC$7dj%~j2bY5I=9mB7B-j5^Y4P@;=LC&A3s~T_2s!l&s>(KBFpq6*UZoTW#|14-8itnxPYj-3AXHa?FhI9)0ACd{9id@EVr z>pm{ZetS}}aA&ln?P8_-gecq4fd5Hshn?D{MQ|fF6<*)(yJ7a)otMP{2KK2ihtr>C zaeT`+iQnc@J~}4s_tNS6_l8PRTAGTZ#?IJ8NfknaK+ZF=Zsr+O1d4C( zXA7ivO1*_k1fBuZL}e{Bd`UdLcm5yRm-{(fyqjTa``YJ-Hc%ulF*Hlh4dLjf6_7Y; z;t}d3J8yDA-_fMM#-<}u#QCHmdFq&E6bS7$70g9kMWEofle$wB;B!_O%cV(u8wM97 z543a`V5GJ`j1rrVKf_-&QzWn2$9EcFz8g(!HPZxJMcnntN2@~DJo%1BU51C3l^-iN zu0)xI%O*Q+8T8cey05<(@#fE*TT*o!{CR6t#LO1bV+VzYdn%&3NqFFsJf#@)ciEZ? zYg)M=>T_G$ps!Wybcg5Po()e4j*gDkB73bwOG`@$Dh|9R?0@LOKoDknm9KES==&>w RtA8#c%#AILN`Ixq{0oq!5zznu literal 0 HcmV?d00001 diff --git a/mobile-react-native/voip-call/app/assets/images/splash.png b/mobile-react-native/voip-call/app/assets/images/splash.png new file mode 100644 index 0000000000000000000000000000000000000000..f064caf2dc780547489ced022f68643b4145cb3e GIT binary patch literal 6506 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 setFailed(false), [avatarUrl]); + const showImage = Boolean(avatarUrl) && !failed; + return ( + + {/* Initials sit underneath as the fallback while the image loads or if it fails. */} + {initial} + {showImage && ( + setFailed(true)} + accessibilityIgnoresInvertColors + /> + )} + + ); +} + +const styles = StyleSheet.create({ + avatar: { + backgroundColor: BrandColors.darkBlue60, + alignItems: 'center', + justifyContent: 'center', + borderColor: BrandColors.seaBlue80, + overflow: 'hidden', + }, + text: { + color: TextColors.white, + fontWeight: '700', + }, +}); diff --git a/mobile-react-native/voip-call/app/src/components/InCallButton.tsx b/mobile-react-native/voip-call/app/src/components/InCallButton.tsx new file mode 100644 index 0000000..6035a61 --- /dev/null +++ b/mobile-react-native/voip-call/app/src/components/InCallButton.tsx @@ -0,0 +1,70 @@ +import { MaterialCommunityIcons } from '@expo/vector-icons'; +import { + type GestureResponderEvent, + StyleSheet, + TouchableOpacity, +} from 'react-native'; + +import { AdditionalColors, BrandColors } from '../theme/colors'; + +type InCallButtonType = 'primary' | 'disconnect'; + +type InCallButtonProps = { + type?: InCallButtonType; + active?: boolean; + onPress: (event: GestureResponderEvent) => void; + iconName: keyof typeof MaterialCommunityIcons.glyphMap; + accessibilityLabel?: string; + disabled?: boolean; +}; + +export function InCallButton({ + type = 'primary', + active = false, + onPress, + iconName, + accessibilityLabel, + disabled = false, +}: InCallButtonProps) { + const isDisconnect = type === 'disconnect'; + const filled = isDisconnect || active; + + const backgroundColor = isDisconnect + ? AdditionalColors.red80 + : active + ? BrandColors.darkBlue100 + : AdditionalColors.white; + + const iconColor = filled ? AdditionalColors.white : BrandColors.darkBlue100; + + return ( + + + + ); +} + +const styles = StyleSheet.create({ + button: { + width: 52, + height: 52, + borderRadius: 26, + justifyContent: 'center', + alignItems: 'center', + }, + outline: { + borderWidth: 1, + borderColor: BrandColors.darkBlue80, + }, + disabled: { opacity: 0.45 }, +}); diff --git a/mobile-react-native/voip-call/app/src/components/VideoCallView.tsx b/mobile-react-native/voip-call/app/src/components/VideoCallView.tsx new file mode 100644 index 0000000..bb48d77 --- /dev/null +++ b/mobile-react-native/voip-call/app/src/components/VideoCallView.tsx @@ -0,0 +1,99 @@ +import { + RTCView, + type Track, + useCamera, + usePeers, +} from '@fishjam-cloud/react-native-client'; +import { StyleSheet, View } from 'react-native'; +import { useSafeAreaInsets } from 'react-native-safe-area-context'; + +import { BrandColors } from '../theme/colors'; +import { Avatar } from './Avatar'; + +function streamOf(track: Track | null | undefined) { + return track?.stream && !track?.metadata?.paused ? track.stream : null; +} + +type VideoCallViewProps = { + remoteName: string; + remoteAvatarUrl?: string | null; + localName: string; + localAvatarUrl?: string | null; +}; + +export function VideoCallView({ + remoteName, + remoteAvatarUrl, + localName, + localAvatarUrl, +}: VideoCallViewProps) { + const insets = useSafeAreaInsets(); + const { remotePeers } = usePeers(); + const { cameraStream } = useCamera(); + + const primaryRemote = remotePeers[0]; + const remoteStream = streamOf(primaryRemote?.cameraTrack); + const localStream = cameraStream; + + return ( + + {remoteStream ? ( + + ) : ( + + + + )} + + + {localStream ? ( + + ) : ( + + + + )} + + + ); +} + +const styles = StyleSheet.create({ + container: { flex: 1, backgroundColor: BrandColors.darkBlue100 }, + remoteVideo: { flex: 1 }, + remoteNoVideo: { + flex: 1, + alignItems: 'center', + justifyContent: 'center', + backgroundColor: BrandColors.darkBlue60, + }, + pip: { + position: 'absolute', + right: 16, + width: 108, + height: 156, + // Square corners on purpose: RTCView is a SurfaceView on Android and cannot + // be clipped by borderRadius/overflow, so a rounded PiP overshoots there. + backgroundColor: BrandColors.seaBlue60, + borderWidth: 1, + borderColor: 'rgba(255, 255, 255, 0.6)', + shadowColor: '#000', + shadowOpacity: 0.25, + shadowRadius: 6, + shadowOffset: { width: 0, height: 2 }, + elevation: 6, + }, + pipVideo: { flex: 1 }, + pipNoVideo: { flex: 1, alignItems: 'center', justifyContent: 'center' }, +}); diff --git a/mobile-react-native/voip-call/app/src/components/index.ts b/mobile-react-native/voip-call/app/src/components/index.ts new file mode 100644 index 0000000..d7e1cba --- /dev/null +++ b/mobile-react-native/voip-call/app/src/components/index.ts @@ -0,0 +1,3 @@ +export { Avatar } from './Avatar'; +export { InCallButton } from './InCallButton'; +export { VideoCallView } from './VideoCallView'; diff --git a/mobile-react-native/voip-call/app/src/hooks/useCallRoom.ts b/mobile-react-native/voip-call/app/src/hooks/useCallRoom.ts new file mode 100644 index 0000000..7f978b8 --- /dev/null +++ b/mobile-react-native/voip-call/app/src/hooks/useCallRoom.ts @@ -0,0 +1,89 @@ +import { + useCamera, + useConnection, + useMicrophone, + useSandbox, + useVoip, +} from '@fishjam-cloud/react-native-client'; +import { useEffect, useState } from 'react'; + +import { useUser } from '../user/UserContext'; +import { IS_VIDEO_CALL } from './usePlaceCall'; + +const SANDBOX_API_URL = process.env.EXPO_PUBLIC_SANDBOX_API_URL ?? ''; + +// Serializes joins and leaves. React runs an effect's cleanup before the next effect +// body, but `leaveRoom` and the media teardown are async — without this chain an +// "End & Accept" swap when accepting waiting call while we are in an ongoing one +// could start joining the new room while the old one is still being torn down, and +// we would briefly be in two rooms. Module-level so the leave scheduled by an +// unmounting `CallScreen` still runs before the next call's join. +let roomOperations: Promise = Promise.resolve(); + +/** + * Ties room membership to the caller's mount lifetime: joins the current call's room + * (starting media first) on mount, leaves and stops media on unmount, and swaps rooms + * when `currentCall` moves to a different one. + * + * Call from the screen that is visible for exactly the duration of a call. + * Returns the room we have actually joined, or `null` while still connecting. + */ +export function useCallRoom(): string | null { + const { currentCall, reportConnectFailed } = useVoip(); + const { username } = useUser(); + const { joinRoom, leaveRoom } = useConnection(); + const { startCamera, stopCamera } = useCamera(); + const { startMicrophone, stopMicrophone } = useMicrophone(); + const { getSandboxPeerToken } = useSandbox({ + sandboxApiUrl: SANDBOX_API_URL, + }); + + const roomName = currentCall?.roomName ?? null; + const [joinedRoom, setJoinedRoom] = useState(null); + + useEffect(() => { + if (!roomName) return; + let cancelled = false; + + roomOperations = roomOperations.then(async () => { + if (cancelled) return; + try { + const peerToken = await getSandboxPeerToken( + roomName, + username ?? 'unknown', + 'conference', + ); + if (cancelled) return; + + if (IS_VIDEO_CALL) await startCamera(); + await startMicrophone(); + if (cancelled) return; + + await joinRoom({ peerToken }); + if (cancelled) return; + setJoinedRoom(roomName); + } catch (err) { + console.error('[voip] failed to join call room:', err); + if (!cancelled) await reportConnectFailed(); + } + }); + + return () => { + cancelled = true; + setJoinedRoom(null); + roomOperations = roomOperations.then(async () => { + try { + await stopCamera(); + await stopMicrophone(); + await leaveRoom(); + } catch (err) { + console.error('[voip] failed to leave call room:', err); + } + }); + }; + // Only the room decides when to join or leave + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [roomName]); + + return joinedRoom; +} diff --git a/mobile-react-native/voip-call/app/src/hooks/useCallSignaling.ts b/mobile-react-native/voip-call/app/src/hooks/useCallSignaling.ts new file mode 100644 index 0000000..8125ff8 --- /dev/null +++ b/mobile-react-native/voip-call/app/src/hooks/useCallSignaling.ts @@ -0,0 +1,122 @@ +import { useCallback, useEffect, useRef, type MutableRefObject } from 'react'; + +import { + useVoip, + type CurrentCall, + type VoipCallStatus, +} from '@fishjam-cloud/react-native-client'; + +import { useUser } from '../user/UserContext'; + +const SERVER_URL = + process.env.EXPO_PUBLIC_VOIP_SERVER_URL ?? 'http://localhost:4400'; + +export type SendSignal = (msg: Record) => void; + +/** Filled by {@link useCallSignaling} so App can wire `VoipProvider.onWaitingCallDeclined`. */ +export type SendSignalRef = MutableRefObject; + +export function useCallSignaling(sendSignalRef: SendSignalRef): void { + const { endCall, currentCall, status, lastEndedReason } = useVoip(); + const { username } = useUser(); + + const socketRef = useRef(null); + + const handlersRef = useRef({ endCall, currentCall }); + handlersRef.current = { endCall, currentCall }; + + const sendSignal = useCallback((msg: Record) => { + const ws = socketRef.current; + if (ws?.readyState === WebSocket.OPEN) { + ws.send(JSON.stringify(msg)); + } else { + console.warn('[signaling] message not sent — socket not open', msg); + } + }, []); + + useEffect(() => { + sendSignalRef.current = sendSignal; + }, [sendSignal, sendSignalRef]); + + useEffect(() => { + if (!username) return; + + const wsUrl = + SERVER_URL.replace(/^http/, 'ws') + + '/ws?username=' + + encodeURIComponent(username); + + const ws = new WebSocket(wsUrl); + socketRef.current = ws; + + ws.onmessage = (e) => { + let msg: Record; + try { + msg = JSON.parse(e.data); + } catch { + return; + } + + const { endCall, currentCall } = handlersRef.current; + if (!currentCall || currentCall.startedAt !== null) return; + if (currentCall.roomName !== msg.roomName) return; + + // The caller cancelled while we (the callee) are still ringing — from + // our side this incoming call rang and was never answered. + if (msg.type === 'call-cancelled' && !currentCall.isOutgoing) { + void endCall('missed'); + } + // The callee rejected while we (the caller) are still ringing out — the + // other party declined, not just hung up. + else if (msg.type === 'call-rejected' && currentCall.isOutgoing) { + void endCall('rejected'); + } + }; + + return () => { + ws.close(); + socketRef.current = null; + }; + }, [username]); + + // Detect the local user ending a call before it connected, and notify the + // other party so their ringing UI can be dismissed. + + const prevRef = useRef<{ status: VoipCallStatus; call: CurrentCall | null }>({ + status, + call: currentCall, + }); + + useEffect(() => { + const { status: prevStatus, call: prevCall } = prevRef.current; + + const userEndedCall = + lastEndedReason === 'local' || lastEndedReason === 'rejected'; + + if ( + prevCall && + prevCall.startedAt === null && + status === 'available' && + userEndedCall + ) { + // Caller cancelled an outgoing call that was still ringing. + if (prevStatus === 'connecting' && prevCall.isOutgoing) { + sendSignal({ + type: 'call-cancelled', + to: prevCall.handle, + roomName: prevCall.roomName, + }); + } + // Callee rejected an incoming call before answering. + else if (prevStatus === 'incoming' && !prevCall.isOutgoing) { + sendSignal({ + type: 'call-rejected', + to: prevCall.handle, + roomName: prevCall.roomName, + }); + } + } + + prevRef.current = { status, call: currentCall }; + }, [status, currentCall, lastEndedReason, sendSignal]); +} diff --git a/mobile-react-native/voip-call/app/src/hooks/useDeviceRegistration.ts b/mobile-react-native/voip-call/app/src/hooks/useDeviceRegistration.ts new file mode 100644 index 0000000..79bed7c --- /dev/null +++ b/mobile-react-native/voip-call/app/src/hooks/useDeviceRegistration.ts @@ -0,0 +1,27 @@ +import { useVoip } from '@fishjam-cloud/react-native-client'; +import { useEffect } from 'react'; +import { Platform } from 'react-native'; + +import { useUser } from '../user/UserContext'; + +const SERVER_URL = + process.env.EXPO_PUBLIC_VOIP_SERVER_URL ?? 'http://localhost:4400'; + +/** + * Registers this device's VoIP push token with the signaling server so other + * users can ring it. + */ +export function useDeviceRegistration(): void { + const { username } = useUser(); + const { voipToken } = useVoip(); + + useEffect(() => { + if (!username || !voipToken) return; + if (Platform.OS !== 'ios' && Platform.OS !== 'android') return; + fetch(`${SERVER_URL}/register`, { + method: 'POST', + headers: { 'content-type': 'application/json' }, + body: JSON.stringify({ username, voipToken, platform: Platform.OS }), + }).catch(() => {}); + }, [username, voipToken]); +} diff --git a/mobile-react-native/voip-call/app/src/hooks/usePlaceCall.ts b/mobile-react-native/voip-call/app/src/hooks/usePlaceCall.ts new file mode 100644 index 0000000..2536d55 --- /dev/null +++ b/mobile-react-native/voip-call/app/src/hooks/usePlaceCall.ts @@ -0,0 +1,50 @@ +import { useVoip } from '@fishjam-cloud/react-native-client'; +import { useCallback } from 'react'; + +import { useUser } from '../user/UserContext'; + +const SERVER_URL = + process.env.EXPO_PUBLIC_VOIP_SERVER_URL ?? 'http://localhost:4400'; + +/** Must match the `isVideo` prop passed to `VoipProvider` in App.tsx. */ +export const IS_VIDEO_CALL = true; + +/** Random room name for the call. */ +function makeRoomName() { + const bytes = crypto.getRandomValues(new Uint8Array(6)); + const id = Array.from(bytes, (b) => b.toString(16).padStart(2, '0')).join(''); + return `voip-${id}`; +} + +/** + * Places an outgoing call: rings the callee through our own signaling server first, + * then reports the call to CallKit/Telecom via `startCall`. + * + * The order matters and is ours to choose. `startCall` only touches the native call + * UI, so if signaling fails we never show a call that cannot connect. + */ +export function usePlaceCall(): (to: string) => Promise { + const { startCall } = useVoip(); + const { username } = useUser(); + + return useCallback( + async (to: string) => { + const roomName = makeRoomName(); + + const res = await fetch(`${SERVER_URL}/call`, { + method: 'POST', + headers: { 'content-type': 'application/json' }, + body: JSON.stringify({ + from: username, + to, + roomName, + isVideo: IS_VIDEO_CALL, + }), + }); + if (!res.ok) throw new Error('Failed to initiate call'); + + await startCall(to, roomName); + }, + [startCall, username], + ); +} diff --git a/mobile-react-native/voip-call/app/src/hooks/useRecentsRedial.ts b/mobile-react-native/voip-call/app/src/hooks/useRecentsRedial.ts new file mode 100644 index 0000000..2151a4c --- /dev/null +++ b/mobile-react-native/voip-call/app/src/hooks/useRecentsRedial.ts @@ -0,0 +1,25 @@ +import { useVoip } from '@fishjam-cloud/react-native-client'; +import { useEffect } from 'react'; + +import { useUser } from '../user/UserContext'; +import { usePlaceCall } from './usePlaceCall'; + +/** + * Places a call when the user redials from the iOS Recents list. The SDK holds the + * intent until we are ready, so we can simply wait for the session to be restored. + */ +export function useRecentsRedial(): void { + const { pendingCallIntent, clearCallIntent } = useVoip(); + const { username } = useUser(); + const placeCall = usePlaceCall(); + + useEffect(() => { + if (!pendingCallIntent || !username) return; + + const { handle } = pendingCallIntent; + clearCallIntent(); + placeCall(handle).catch((err) => + console.error('[voip] failed to start call from a Recents intent:', err), + ); + }, [pendingCallIntent, username, clearCallIntent, placeCall]); +} diff --git a/mobile-react-native/voip-call/app/src/hooks/useRequestPermissions.ts b/mobile-react-native/voip-call/app/src/hooks/useRequestPermissions.ts new file mode 100644 index 0000000..02b0e77 --- /dev/null +++ b/mobile-react-native/voip-call/app/src/hooks/useRequestPermissions.ts @@ -0,0 +1,30 @@ +import { + useCameraPermissions, + useMicrophonePermissions, +} from '@fishjam-cloud/react-native-client'; +import { useEffect } from 'react'; +import { PermissionsAndroid, Platform } from 'react-native'; + +/** Requests the camera, microphone, and (Android 13+) notification permissions once. */ +export function useRequestPermissions(): void { + const [, requestCamera] = useCameraPermissions(); + const [, requestMicrophone] = useMicrophonePermissions(); + + useEffect(() => { + (async () => { + const microphoneStatus = await requestMicrophone(); + if (microphoneStatus !== 'granted') { + console.warn('Microphone permission not granted — calls will be muted'); + } + const cameraStatus = await requestCamera(); + if (cameraStatus !== 'granted') { + console.warn('Camera permission not granted — video will be disabled'); + } + if (Platform.OS === 'android' && Number(Platform.Version) >= 33) { + await PermissionsAndroid.request( + PermissionsAndroid.PERMISSIONS.POST_NOTIFICATIONS, + ); + } + })().catch((err) => console.error('Failed to request permissions:', err)); + }, [requestCamera, requestMicrophone]); +} diff --git a/mobile-react-native/voip-call/app/src/screens/CallScreen.tsx b/mobile-react-native/voip-call/app/src/screens/CallScreen.tsx new file mode 100644 index 0000000..2c09038 --- /dev/null +++ b/mobile-react-native/voip-call/app/src/screens/CallScreen.tsx @@ -0,0 +1,44 @@ +import { usePeers, useVoip } from '@fishjam-cloud/react-native-client'; +import { useEffect } from 'react'; + +import { useCallRoom } from '../hooks/useCallRoom'; +import { InCallView } from './InCallView'; +import { OutgoingCallView } from './OutgoingCallView'; + +/** + * The screen shown for the whole lifetime of a call (`status` is `connecting` or + * `active`). It owns the Fishjam side of the call: mounting joins the current call's + * room via `useCallRoom`, unmounting leaves it, and the remote peer's presence is + * reported back to the call as connect / hang-up. + */ +export function CallScreen() { + const { status, currentCall, reportConnected, endCall } = useVoip(); + const { remotePeers } = usePeers(); + + const joinedRoom = useCallRoom(); + + // The remote peer showing up is what "connected" means for us, and it going away is + // the remote hanging up. Gated on `joinedRoom` so a stale peer list from the room we + // just left cannot connect (or end) the room we are moving into. + useEffect(() => { + if (!currentCall || joinedRoom !== currentCall.roomName) return; + + if (status === 'connecting' && remotePeers.length > 0) { + void reportConnected(); + } else if (status === 'active' && remotePeers.length === 0) { + void endCall('remote'); + } + }, [ + status, + currentCall, + joinedRoom, + remotePeers.length, + reportConnected, + endCall, + ]); + + if (status === 'active') { + return ; + } + return ; +} diff --git a/mobile-react-native/voip-call/app/src/screens/InCallView.tsx b/mobile-react-native/voip-call/app/src/screens/InCallView.tsx new file mode 100644 index 0000000..4f914fe --- /dev/null +++ b/mobile-react-native/voip-call/app/src/screens/InCallView.tsx @@ -0,0 +1,343 @@ +import { + setCallMuted, + useAudioOutput, + useCamera, + useMicrophone, + usePeers, + useVAD, +} from '@fishjam-cloud/react-native-client'; +import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; +import { StatusBar } from 'expo-status-bar'; +import { Platform, StyleSheet, Text, View } from 'react-native'; +import { SafeAreaView } from 'react-native-safe-area-context'; + +import { Avatar, InCallButton, VideoCallView } from '../components'; +import { AdditionalColors, BrandColors, TextColors } from '../theme/colors'; +import { useUser } from '../user/UserContext'; +import { useVoip } from '@fishjam-cloud/react-native-client'; + +type PeerMeta = { displayName?: string }; + +function formatDuration(totalSeconds: number): string { + const m = Math.floor(totalSeconds / 60) + .toString() + .padStart(2, '0'); + const s = (totalSeconds % 60).toString().padStart(2, '0'); + return `${m}:${s}`; +} + +function useElapsed(startedAt: number | null): number { + const [elapsed, setElapsed] = useState(0); + useEffect(() => { + if (!startedAt) { + setElapsed(0); + return; + } + setElapsed(Math.floor((Date.now() - startedAt) / 1000)); + const id = setInterval(() => { + setElapsed(Math.floor((Date.now() - startedAt) / 1000)); + }, 1000); + return () => clearInterval(id); + }, [startedAt]); + return elapsed; +} + +/** + * Sets aside the live devices when the call goes on hold and restores exactly those + * devices on resume. Runs only while mounted, i.e. only during an active call. + */ +function useHoldMediaSync() { + const { isOnHold } = useVoip(); + const { isCameraOn, toggleCamera } = useCamera(); + const { isMicrophoneOn, toggleMicrophone } = useMicrophone(); + + const heldMediaRef = useRef({ + microphoneEnabled: false, + cameraEnabled: false, + }); + const prevOnHoldRef = useRef(isOnHold); + + useEffect(() => { + if (prevOnHoldRef.current === isOnHold) return; + prevOnHoldRef.current = isOnHold; + + (async () => { + if (isOnHold) { + heldMediaRef.current = { + microphoneEnabled: isMicrophoneOn, + cameraEnabled: isCameraOn, + }; + if (isMicrophoneOn) await toggleMicrophone(); + if (isCameraOn) await toggleCamera(); + } else { + const { microphoneEnabled, cameraEnabled } = heldMediaRef.current; + if (microphoneEnabled) await toggleMicrophone(); + if (cameraEnabled) await toggleCamera(); + } + })().catch((err) => + console.error('[voip] failed to update media for held call:', err), + ); + }, [isOnHold, isCameraOn, isMicrophoneOn, toggleCamera, toggleMicrophone]); +} + +/** + * Mirrors the system mute state (CallKit / Telecom) onto the microphone track, so + * muting from the native call UI actually silences us. + */ +function useMuteSync() { + const { isMuted } = useVoip(); + const { isMicrophoneOn, toggleMicrophone } = useMicrophone(); + + const prevMutedRef = useRef(isMuted); + + useEffect(() => { + if (prevMutedRef.current === isMuted) return; + prevMutedRef.current = isMuted; + + if (isMicrophoneOn !== isMuted) return; + + toggleMicrophone().catch((err) => + console.error('[voip] failed to sync mute state:', err), + ); + }, [isMuted, isMicrophoneOn, toggleMicrophone]); +} + +export function InCallView() { + const { currentCall, endCall, isOnHold, setCallHeld } = useVoip(); + const { username, avatarUrlFor } = useUser(); + + useHoldMediaSync(); + useMuteSync(); + + const { isMicrophoneOn, toggleMicrophone } = useMicrophone(); + // Mute the mic AND drive the system mute indicator (CallKit on iOS). The + // resulting onMuteChanged is idempotent, so this doesn't loop. + const handleToggleMute = useCallback(async () => { + const willBeMuted = isMicrophoneOn; + await toggleMicrophone(); + await setCallMuted(willBeMuted); + }, [isMicrophoneOn, toggleMicrophone]); + const { isCameraOn, toggleCamera } = useCamera(); + const { currentAudioOutput, availableAudioOutputs, ios, android } = + useAudioOutput(); + const { remotePeers } = usePeers(); + + const peerIds = useMemo(() => remotePeers.map((p) => p.id), [remotePeers]); + const speaking = useVAD({ peerIds }); + + const elapsed = useElapsed(currentCall?.startedAt ?? null); + const isSpeaker = currentAudioOutput?.type === 'speaker'; + + if (!currentCall) return null; + + const isVideo = currentCall.isVideo; + const displayName = currentCall.displayName; + + const toggleSpeaker = () => { + if (Platform.OS === 'ios') { + ios.overrideAudioOutput(isSpeaker ? 'none' : 'speaker'); + return; + } + const target = availableAudioOutputs.find( + (device) => device.type === (isSpeaker ? 'earpiece' : 'speaker'), + ); + if (target) { + android + .selectAudioOutput(target.id) + .catch((err) => console.warn('Failed to switch audio output:', err)); + } + }; + + const bluetoothDevice = availableAudioOutputs.find( + (device) => device.type === 'bluetooth', + ); + const isBluetooth = currentAudioOutput?.type === 'bluetooth'; + + const selectBluetooth = () => { + if (Platform.OS === 'ios') { + // iOS has no public API to force a specific Bluetooth route; restoring + // the default route sends audio back to the connected Bluetooth device. + ios + .overrideAudioOutput('none') + .catch((err) => console.warn('Failed to switch audio output:', err)); + return; + } + if (bluetoothDevice) { + android + .selectAudioOutput(bluetoothDevice.id) + .catch((err) => console.warn('Failed to switch audio output:', err)); + } + }; + + const toggleHold = () => { + setCallHeld(!isOnHold).catch((err) => + console.warn('Failed to change held state:', err), + ); + }; + + const controls = ( + + + {isVideo && ( + + )} + + {bluetoothDevice && ( + + )} + + endCall('local')} + accessibilityLabel="End call" + /> + + ); + + if (isVideo) { + return ( + + {/* Dark video background needs light status bar icons, unlike every other (light) screen. */} + + + + + {displayName} + {formatDuration(elapsed)} + + {controls} + + + ); + } + + return ( + + + On call · {formatDuration(elapsed)} + {remotePeers.length === 0 ? ( + + + {displayName} + + ) : ( + + {remotePeers.map((peer) => { + const name = peer.metadata?.peer?.displayName ?? displayName; + const isTalking = speaking[peer.id] ?? false; + return ( + + + {name} + + ); + })} + + )} + + {controls} + + ); +} + +const styles = StyleSheet.create({ + container: { flex: 1, backgroundColor: BrandColors.seaBlue20 }, + + // audio layout + audioContent: { + flex: 1, + alignItems: 'center', + justifyContent: 'center', + gap: 16, + padding: 32, + }, + label: { + fontSize: 13, + color: BrandColors.seaBlue100, + letterSpacing: 1.5, + textTransform: 'uppercase', + fontWeight: '600', + }, + callee: { alignItems: 'center', gap: 16, marginTop: 8 }, + name: { fontSize: 28, fontWeight: '700', color: TextColors.darkText }, + roster: { + flexDirection: 'row', + flexWrap: 'wrap', + justifyContent: 'center', + gap: 24, + marginTop: 8, + }, + rosterItem: { alignItems: 'center', gap: 8 }, + rosterName: { fontSize: 14, color: TextColors.darkText, fontWeight: '500' }, + audioControlsWrap: { paddingBottom: 24, alignItems: 'center' }, + + // video layout (FaceTime style) + videoRoot: { flex: 1, backgroundColor: BrandColors.darkBlue100 }, + overlay: { justifyContent: 'space-between' }, + videoHeader: { paddingTop: 8, alignItems: 'center' }, + videoName: { fontSize: 18, fontWeight: '700', color: AdditionalColors.white }, + videoTimer: { + fontSize: 13, + color: 'rgba(255, 255, 255, 0.85)', + marginTop: 2, + }, + floatingControlsWrap: { alignItems: 'center', paddingBottom: 12 }, + + // shared control bar + controls: { + flexDirection: 'row', + gap: 10, + backgroundColor: 'rgba(255, 255, 255, 0.92)', + paddingHorizontal: 12, + paddingVertical: 14, + borderRadius: 40, + alignItems: 'center', + }, +}); diff --git a/mobile-react-native/voip-call/app/src/screens/LoginScreen.tsx b/mobile-react-native/voip-call/app/src/screens/LoginScreen.tsx new file mode 100644 index 0000000..9cf4f2b --- /dev/null +++ b/mobile-react-native/voip-call/app/src/screens/LoginScreen.tsx @@ -0,0 +1,165 @@ +import { MaterialCommunityIcons } from '@expo/vector-icons'; +import { useState } from 'react'; +import { + ActivityIndicator, + Image, + KeyboardAvoidingView, + Platform, + StyleSheet, + Text, + TextInput, + TouchableOpacity, + View, +} from 'react-native'; +import { SafeAreaView } from 'react-native-safe-area-context'; + +import { AdditionalColors, BrandColors, TextColors } from '../theme/colors'; +import { useUser } from '../user/UserContext'; + +// eslint-disable-next-line @typescript-eslint/no-require-imports +const FishjamLogo = require('../../assets/images/fishjam-logo.png'); + +export function LoginScreen() { + const { register } = useUser(); + const [input, setInput] = useState(''); + const [isLoading, setIsLoading] = useState(false); + const [isFocused, setIsFocused] = useState(false); + + const handleContinue = async () => { + const name = input.trim(); + if (!name) return; + setIsLoading(true); + try { + await register(name); + } finally { + setIsLoading(false); + } + }; + + const disabled = !input.trim() || isLoading; + + return ( + + + + + + + + + + Welcome + + Choose a display name so others can call you. + + + setIsFocused(true)} + onBlur={() => setIsFocused(false)} + editable={!isLoading} + autoFocus + /> + + + {isLoading ? ( + + ) : ( + Continue + )} + + + + + ); +} + +const styles = StyleSheet.create({ + container: { flex: 1, backgroundColor: BrandColors.seaBlue20 }, + flex: { flex: 1 }, + content: { + flex: 1, + justifyContent: 'center', + alignItems: 'center', + padding: 32, + gap: 16, + }, + logo: { + width: 160, + height: 50, + marginBottom: 8, + }, + iconWrap: { + width: 88, + height: 88, + borderRadius: 44, + backgroundColor: BrandColors.darkBlue100, + alignItems: 'center', + justifyContent: 'center', + marginBottom: 8, + }, + title: { + fontSize: 28, + fontWeight: '700', + color: TextColors.darkText, + textAlign: 'center', + }, + subtitle: { + fontSize: 15, + color: AdditionalColors.grey80, + textAlign: 'center', + marginBottom: 8, + }, + input: { + width: '100%', + height: 56, + borderWidth: 2, + borderColor: BrandColors.darkBlue100, + borderRadius: 40, + paddingHorizontal: 20, + fontSize: 16, + color: TextColors.darkText, + backgroundColor: AdditionalColors.white, + }, + inputFocused: { + borderColor: BrandColors.seaBlue80, + }, + button: { + width: '100%', + height: 56, + backgroundColor: BrandColors.darkBlue100, + borderRadius: 100, + alignItems: 'center', + justifyContent: 'center', + }, + buttonDisabled: { + backgroundColor: AdditionalColors.grey60, + }, + buttonText: { + color: AdditionalColors.white, + fontSize: 18, + fontWeight: '600', + }, +}); diff --git a/mobile-react-native/voip-call/app/src/screens/OutgoingCallView.tsx b/mobile-react-native/voip-call/app/src/screens/OutgoingCallView.tsx new file mode 100644 index 0000000..4170f0a --- /dev/null +++ b/mobile-react-native/voip-call/app/src/screens/OutgoingCallView.tsx @@ -0,0 +1,81 @@ +import { useEffect } from 'react'; +import { StyleSheet, Text, View } from 'react-native'; +import Animated, { + useAnimatedStyle, + useSharedValue, + withRepeat, + withSequence, + withTiming, +} from 'react-native-reanimated'; +import { SafeAreaView } from 'react-native-safe-area-context'; + +import { Avatar, InCallButton } from '../components'; +import { BrandColors, TextColors } from '../theme/colors'; +import { useUser } from '../user/UserContext'; +import { useVoip } from '@fishjam-cloud/react-native-client'; + +/** Ringing UI while an outgoing call waits for the other side. Rendered by `CallScreen`. */ +export function OutgoingCallView() { + const { currentCall, endCall } = useVoip(); + const { avatarUrlFor } = useUser(); + const scale = useSharedValue(1); + + useEffect(() => { + scale.value = withRepeat( + withSequence( + withTiming(1.1, { duration: 800 }), + withTiming(1, { duration: 800 }), + ), + -1, + ); + return () => { + scale.value = 1; + }; + }, [scale]); + + const animatedStyle = useAnimatedStyle(() => ({ + transform: [{ scale: scale.value }], + })); + + if (!currentCall) return null; + const displayName = currentCall.displayName; + + return ( + + + Calling + + + + {displayName} + + + endCall('local')} + accessibilityLabel="Cancel call" + /> + + + ); +} + +const styles = StyleSheet.create({ + container: { flex: 1, backgroundColor: BrandColors.seaBlue20 }, + content: { flex: 1, alignItems: 'center', justifyContent: 'center', gap: 16 }, + label: { + fontSize: 13, + color: BrandColors.seaBlue100, + letterSpacing: 1.5, + textTransform: 'uppercase', + fontWeight: '600', + }, + avatarWrap: { marginVertical: 24 }, + name: { fontSize: 28, fontWeight: '700', color: TextColors.darkText }, + controls: { paddingBottom: 32, alignItems: 'center' }, +}); diff --git a/mobile-react-native/voip-call/app/src/screens/UsersScreen.tsx b/mobile-react-native/voip-call/app/src/screens/UsersScreen.tsx new file mode 100644 index 0000000..93e8e1d --- /dev/null +++ b/mobile-react-native/voip-call/app/src/screens/UsersScreen.tsx @@ -0,0 +1,149 @@ +import { MaterialCommunityIcons } from '@expo/vector-icons'; +import { useEffect } from 'react'; +import { + ActivityIndicator, + FlatList, + RefreshControl, + StyleSheet, + Text, + TouchableOpacity, + View, +} from 'react-native'; +import { SafeAreaView } from 'react-native-safe-area-context'; + +import { Avatar } from '../components'; +import { AdditionalColors, BrandColors, TextColors } from '../theme/colors'; +import { useUser } from '../user/UserContext'; +import { useVoip } from '@fishjam-cloud/react-native-client'; +import { usePlaceCall } from '../hooks/usePlaceCall'; + +export function UsersScreen() { + const { username, users, refreshUsers, logout } = useUser(); + const { status } = useVoip(); + const placeCall = usePlaceCall(); + const isCalling = status === 'connecting' || status === 'active'; + + useEffect(() => { + refreshUsers(); + }, [refreshUsers]); + + const handleCall = async (to: string) => { + try { + await placeCall(to); + } catch (err) { + console.error('Failed to start call:', err); + } + }; + + return ( + + + + Users + logout()} + accessibilityLabel="Log out"> + + Log out + + + Signed in as {username} + + + item.username} + contentContainerStyle={styles.list} + refreshControl={ + + } + ListEmptyComponent={ + + + No other users online yet. + + } + renderItem={({ item }) => ( + handleCall(item.username)} + disabled={isCalling} + activeOpacity={0.7}> + + {item.username} + {isCalling ? ( + + ) : ( + + )} + + )} + /> + + ); +} + +const styles = StyleSheet.create({ + container: { flex: 1, backgroundColor: BrandColors.seaBlue20 }, + header: { + padding: 24, + paddingBottom: 12, + }, + headerRow: { + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'space-between', + }, + title: { fontSize: 28, fontWeight: '700', color: TextColors.darkText }, + me: { fontSize: 14, color: AdditionalColors.grey80, marginTop: 2 }, + logoutButton: { + flexDirection: 'row', + alignItems: 'center', + gap: 6, + paddingVertical: 6, + paddingHorizontal: 12, + borderRadius: 100, + backgroundColor: AdditionalColors.white, + }, + logoutText: { + fontSize: 14, + fontWeight: '600', + color: AdditionalColors.red80, + }, + list: { padding: 16, gap: 10, flexGrow: 1 }, + row: { + flexDirection: 'row', + alignItems: 'center', + padding: 12, + borderRadius: 16, + backgroundColor: AdditionalColors.white, + gap: 12, + }, + rowDisabled: { opacity: 0.5 }, + name: { + flex: 1, + fontSize: 16, + fontWeight: '500', + color: TextColors.darkText, + }, + empty: { paddingTop: 64, alignItems: 'center', gap: 10 }, + emptyText: { fontSize: 16, fontWeight: '600', color: BrandColors.darkBlue80 }, + emptyHint: { fontSize: 14, color: AdditionalColors.grey80 }, +}); diff --git a/mobile-react-native/voip-call/app/src/theme/colors.ts b/mobile-react-native/voip-call/app/src/theme/colors.ts new file mode 100644 index 0000000..1fd9206 --- /dev/null +++ b/mobile-react-native/voip-call/app/src/theme/colors.ts @@ -0,0 +1,27 @@ +export const BrandColors = { + seaBlue100: '#1F7193', + seaBlue80: '#46ADD8', + seaBlue60: '#87CCE8', + seaBlue40: '#BFE7F8', + seaBlue20: '#F1FAFE', + + darkBlue100: '#001A72', + darkBlue80: '#3F57A6', + darkBlue60: '#7089DB', + darkBlue40: '#BFCCF8', + darkBlue20: '#F5F7FE', +}; + +export const AdditionalColors = { + red100: '#981B1B', + red80: '#C32222', + grey80: '#70778F', + grey60: '#B2B9CC', + white: '#FFFFFF', +}; + +export const TextColors = { + darkText: '#001A72', + additionalLightText: '#ACB5D2', + white: '#FFFFFF', +}; diff --git a/mobile-react-native/voip-call/app/src/user/UserContext.ts b/mobile-react-native/voip-call/app/src/user/UserContext.ts new file mode 100644 index 0000000..513dfcf --- /dev/null +++ b/mobile-react-native/voip-call/app/src/user/UserContext.ts @@ -0,0 +1,24 @@ +import { createContext, useContext } from 'react'; + +export type UserSummary = { + username: string; + avatarUrl: string | null; +}; + +export type UserContextValue = { + username: string | null; + users: UserSummary[]; + isLoading: boolean; + register: (name: string) => Promise; + refreshUsers: () => Promise; + logout: () => Promise; + avatarUrlFor: (name: string) => string | null; +}; + +export const UserContext = createContext(null); + +export function useUser(): UserContextValue { + const ctx = useContext(UserContext); + if (!ctx) throw new Error('useUser must be used within UserProvider'); + return ctx; +} diff --git a/mobile-react-native/voip-call/app/src/user/UserProvider.tsx b/mobile-react-native/voip-call/app/src/user/UserProvider.tsx new file mode 100644 index 0000000..c2e834d --- /dev/null +++ b/mobile-react-native/voip-call/app/src/user/UserProvider.tsx @@ -0,0 +1,93 @@ +import AsyncStorage from '@react-native-async-storage/async-storage'; +import { + type PropsWithChildren, + useCallback, + useEffect, + useMemo, + useState, +} from 'react'; + +import { UserContext, type UserSummary } from './UserContext'; + +const SERVER_URL = + process.env.EXPO_PUBLIC_VOIP_SERVER_URL ?? 'http://localhost:4400'; +const USERNAME_STORAGE_KEY = 'voip.username'; + +export function UserProvider({ children }: PropsWithChildren) { + const [username, setUsername] = useState(null); + const [allUsers, setAllUsers] = useState([]); + // `true` while we read the persisted session on startup, so the UI can avoid + // flashing the login screen before a saved username is restored. + const [isLoading, setIsLoading] = useState(true); + + const fetchUsers = useCallback(async () => { + try { + const res = await fetch(`${SERVER_URL}/users?exclude=`); + if (!res.ok) return; + const list: UserSummary[] = await res.json(); + setAllUsers(list); + } catch { + // network error — ignore + } + }, []); + + const register = useCallback( + async (name: string) => { + setUsername(name); + await AsyncStorage.setItem(USERNAME_STORAGE_KEY, name); + await fetchUsers(); + }, + [fetchUsers], + ); + + const refreshUsers = useCallback(async () => { + if (username) await fetchUsers(); + }, [username, fetchUsers]); + + const logout = useCallback(async () => { + setUsername(null); + setAllUsers([]); + await AsyncStorage.removeItem(USERNAME_STORAGE_KEY); + }, []); + + // Restore the persisted session on startup so a reload keeps the user logged in. + useEffect(() => { + (async () => { + try { + const saved = await AsyncStorage.getItem(USERNAME_STORAGE_KEY); + if (saved) { + setUsername(saved); + await fetchUsers(); + } + } finally { + setIsLoading(false); + } + })(); + }, [fetchUsers]); + + const users = useMemo( + () => allUsers.filter((u) => u.username !== username), + [allUsers, username], + ); + + const avatarUrlFor = useCallback( + (name: string) => + allUsers.find((u) => u.username === name)?.avatarUrl ?? null, + [allUsers], + ); + + const value = useMemo( + () => ({ + username, + users, + isLoading, + register, + refreshUsers, + logout, + avatarUrlFor, + }), + [username, users, isLoading, register, refreshUsers, logout, avatarUrlFor], + ); + + return {children}; +} diff --git a/mobile-react-native/voip-call/app/tsconfig.json b/mobile-react-native/voip-call/app/tsconfig.json new file mode 100644 index 0000000..6d82505 --- /dev/null +++ b/mobile-react-native/voip-call/app/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "expo/tsconfig.base", + "compilerOptions": { + "strict": true, + "jsx": "react-jsx" + }, + "include": ["**/*.ts", "**/*.tsx"], + "exclude": ["server"] +} diff --git a/mobile-react-native/voip-call/app/yarn.lock b/mobile-react-native/voip-call/app/yarn.lock new file mode 100644 index 0000000..b98e933 --- /dev/null +++ b/mobile-react-native/voip-call/app/yarn.lock @@ -0,0 +1,6825 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@0no-co/graphql.web@^1.0.13", "@0no-co/graphql.web@^1.0.8": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@0no-co/graphql.web/-/graphql.web-1.3.2.tgz#e65f5236fe1bc53506bd6ebf6c9931c7d34cdda7" + integrity sha512-Q1+pRlLhE31GOY/2c9BAEnFTNxO7Awtc6fhhEDlxyCBQ2N0IhD32cPVvPChrK9mwBNSgRdW/sF1kd2e0ojHj1Q== + +"@babel/code-frame@^7.12.13", "@babel/code-frame@^7.20.0", "@babel/code-frame@^7.24.7", "@babel/code-frame@^7.29.0", "@babel/code-frame@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.29.7.tgz#f2fbbfea87c44a21590ec515b778b2c26d8866e7" + integrity sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw== + dependencies: + "@babel/helper-validator-identifier" "^7.29.7" + js-tokens "^4.0.0" + picocolors "^1.1.1" + +"@babel/code-frame@~7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" + integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== + dependencies: + "@babel/highlight" "^7.10.4" + +"@babel/compat-data@^7.28.6", "@babel/compat-data@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.29.7.tgz#6f0237f0f36d2e51c0570a636faed9d2d0efe629" + integrity sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg== + +"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.20.0", "@babel/core@^7.25.2", "@babel/core@^7.28.0": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.29.7.tgz#80c10b17248082968b57a857b91640971f2070f7" + integrity sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA== + dependencies: + "@babel/code-frame" "^7.29.7" + "@babel/generator" "^7.29.7" + "@babel/helper-compilation-targets" "^7.29.7" + "@babel/helper-module-transforms" "^7.29.7" + "@babel/helpers" "^7.29.7" + "@babel/parser" "^7.29.7" + "@babel/template" "^7.29.7" + "@babel/traverse" "^7.29.7" + "@babel/types" "^7.29.7" + "@jridgewell/remapping" "^2.3.5" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + +"@babel/generator@^7.20.5", "@babel/generator@^7.25.0", "@babel/generator@^7.29.1", "@babel/generator@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.29.7.tgz#cca0b8827e6bcf3ba176788e7f3b180ad6db2fa3" + integrity sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ== + dependencies: + "@babel/parser" "^7.29.7" + "@babel/types" "^7.29.7" + "@jridgewell/gen-mapping" "^0.3.12" + "@jridgewell/trace-mapping" "^0.3.28" + jsesc "^3.0.2" + +"@babel/helper-annotate-as-pure@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.29.7.tgz#c70fe3c6ecbdc3fd2dd1b0f498428b88b82ce47f" + integrity sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw== + dependencies: + "@babel/types" "^7.29.7" + +"@babel/helper-compilation-targets@^7.28.6", "@babel/helper-compilation-targets@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz#7a1def704302401c47f64fa85589e974ae217042" + integrity sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g== + dependencies: + "@babel/compat-data" "^7.29.7" + "@babel/helper-validator-option" "^7.29.7" + browserslist "^4.24.0" + lru-cache "^5.1.1" + semver "^6.3.1" + +"@babel/helper-create-class-features-plugin@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.29.7.tgz#6eddf286f2ec418f740c91d60a83347c55838ddd" + integrity sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.29.7" + "@babel/helper-member-expression-to-functions" "^7.29.7" + "@babel/helper-optimise-call-expression" "^7.29.7" + "@babel/helper-replace-supers" "^7.29.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.29.7" + "@babel/traverse" "^7.29.7" + semver "^6.3.1" + +"@babel/helper-create-regexp-features-plugin@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.29.7.tgz#5d4c3f928f315cf6c4184ea2fc3b5b38745b2430" + integrity sha512-907Uymvqgg1dwUA+7IGwFAOSYzQOuzPXKNJ1yxzwPffzkYFg2q2eHi1fIOs6sXkG9NbIUMunnUlkYsfRFNvomg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.29.7" + regexpu-core "^6.3.1" + semver "^6.3.1" + +"@babel/helper-define-polyfill-provider@^0.6.5", "@babel/helper-define-polyfill-provider@^0.6.8": + version "0.6.8" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.8.tgz#cf1e4462b613f2b54c41e6ff758d5dfcaa2c85d1" + integrity sha512-47UwBLPpQi1NoWzLuHNjRoHlYXMwIJoBf7MFou6viC/sIHWYygpvr0B6IAyh5sBdA2nr2LPIRww8lfaUVQINBA== + 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" + +"@babel/helper-globals@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-globals/-/helper-globals-7.29.7.tgz#f04a96fbd8473241b1079243f5b3f03a3010ab7b" + integrity sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA== + +"@babel/helper-member-expression-to-functions@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.29.7.tgz#8dbdb3ce0b5c487e1aec10e13c9a43a500814df8" + integrity sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg== + dependencies: + "@babel/traverse" "^7.29.7" + "@babel/types" "^7.29.7" + +"@babel/helper-module-imports@^7.25.9", "@babel/helper-module-imports@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz#ef25048a518e828d7393fac5882ddd73921d7396" + integrity sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g== + dependencies: + "@babel/traverse" "^7.29.7" + "@babel/types" "^7.29.7" + +"@babel/helper-module-transforms@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz#b062747a5997ba138637201328bbff77960574ae" + integrity sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg== + dependencies: + "@babel/helper-module-imports" "^7.29.7" + "@babel/helper-validator-identifier" "^7.29.7" + "@babel/traverse" "^7.29.7" + +"@babel/helper-optimise-call-expression@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.29.7.tgz#77b0b5b94f1997fa9d6e3125f445227b1faf9d85" + integrity sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong== + dependencies: + "@babel/types" "^7.29.7" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.28.6", "@babel/helper-plugin-utils@^7.29.7", "@babel/helper-plugin-utils@^7.8.0": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz#c0a0766f1a13617d8a17407d7ab8f9d486225ea4" + integrity sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw== + +"@babel/helper-remap-async-to-generator@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.29.7.tgz#34b1f68dd75b86d31df781a29c3ff2df88da82e6" + integrity sha512-16AMiW26DbXWBbr3B8wNozKM0ydMLB892vaOaJW/fPJdnT8vJk5sdkQcU/isqUxyCE0cEoa8wZOcbgDuC4b6Og== + dependencies: + "@babel/helper-annotate-as-pure" "^7.29.7" + "@babel/helper-wrap-function" "^7.29.7" + "@babel/traverse" "^7.29.7" + +"@babel/helper-replace-supers@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.29.7.tgz#bc3c3964329043c79112e513c1b198f16589ac21" + integrity sha512-atfGXWSeCiF4DnKZIfmJfQRkSw9b9gNNXR1kqKjbhG4pGYCOnkp8OcTB8E3NXjBu8NpheSnOeNKz8KT7UNFTmQ== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.29.7" + "@babel/helper-optimise-call-expression" "^7.29.7" + "@babel/traverse" "^7.29.7" + +"@babel/helper-skip-transparent-expression-wrappers@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.29.7.tgz#50c95c7e4c4f54936cfa0116428edc559862d551" + integrity sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ== + dependencies: + "@babel/traverse" "^7.29.7" + "@babel/types" "^7.29.7" + +"@babel/helper-string-parser@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz#7f0871d99824d23137d60f86fcf6130fd5a1b51f" + integrity sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw== + +"@babel/helper-validator-identifier@^7.25.9", "@babel/helper-validator-identifier@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz#bd87084ced0c796ec46bda492de6e83d29e89fc2" + integrity sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg== + +"@babel/helper-validator-option@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz#cf315be940213b354eb4abcc0bd01ebe3f73bc2a" + integrity sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw== + +"@babel/helper-wrap-function@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.29.7.tgz#eec72163044548a0935e9d182bf2d547ec5ff483" + integrity sha512-iES0Skag9ERIF68aXadpO6dbXa03mNWK3sEqJaMnLNs/eC3l0lkImdfoy6Y09/SfkpawdAB4RjQ7PVA7TcVGdw== + dependencies: + "@babel/template" "^7.29.7" + "@babel/traverse" "^7.29.7" + "@babel/types" "^7.29.7" + +"@babel/helpers@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.29.7.tgz#45abfde7548997e34376c3e69feb475cffb4a607" + integrity sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg== + dependencies: + "@babel/template" "^7.29.7" + "@babel/types" "^7.29.7" + +"@babel/highlight@^7.10.4": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.25.9.tgz#8141ce68fc73757946f983b343f1231f4691acc6" + integrity sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw== + dependencies: + "@babel/helper-validator-identifier" "^7.25.9" + chalk "^2.4.2" + js-tokens "^4.0.0" + picocolors "^1.0.0" + +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.25.3", "@babel/parser@^7.29.0", "@babel/parser@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.29.7.tgz#837b87387cbf5ec5530cb634b3c622f68edb9334" + integrity sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg== + dependencies: + "@babel/types" "^7.29.7" + +"@babel/plugin-proposal-decorators@^7.12.9": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.29.7.tgz#ebc57bd4d711df920a553de8a456a3a020ce0d72" + integrity sha512-EtU0Hi3GvrTqD56xKmZvV/uCXK2ZbwVNPNLAquVItcAZpUhkXwWlo3Fmj0c2LxgSf2I8IDULeAepwNP1OefLXg== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/plugin-syntax-decorators" "^7.29.7" + +"@babel/plugin-proposal-export-default-from@^7.24.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.29.7.tgz#73bd63e538a050def0f5341c42439630b4923da9" + integrity sha512-p+G5BNXDcy3bOXplhY4HybQ1GxH3i2Tppmdm/3epyRu2VgJJZuUlZ61MqRTg582Q7ZLBdP7fePYvsumSEkMxcQ== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-bigint@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" + integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-class-static-block@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" + integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-decorators@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.29.7.tgz#9a23ab91fb8e61d142684108bca6f343ceee88f6" + integrity sha512-9MTTLbF39X6sqM92JPEsoI7++26hjZvzkxKZy64aMhWLH2mPkJ/Q3AV4QLmls3R14FpSpkOwQQfUh962JGQxxg== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-syntax-dynamic-import@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-export-default-from@^7.24.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.29.7.tgz#52402c74fbd5d684ca63784bde4bb6d7af1e9e37" + integrity sha512-foag0BB37ROhdeIX9O8G0jX7hw0UekJc04cHMrYLOnrErsnBKqJGHJ8eDRpoCFZBvEPPygmmtw4qyU97qa4oOw== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-syntax-flow@^7.12.1", "@babel/plugin-syntax-flow@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.29.7.tgz#3f3278c11c896c43bf8098250819785fd1231881" + integrity sha512-ajMX6QPcyomotqwpzhkYGxcK2i/us0rs1Qo9QvUpa+Fca0FTmqrzKrctoIYLMxcOhGZldGT/BAVkRGTWBiR8gQ== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-syntax-import-attributes@^7.24.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.29.7.tgz#6115264516e95ead0f35a41710906612e447f605" + integrity sha512-zGYcYfq/WmZ4V+kBIXQon9dSSc8ircGZqw9ZaNhhGj9nZkeBu1jHLBDQqYYi5WA9uawvA2sIMbry2nCFhf5Djg== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-syntax-import-meta@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-jsx@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.29.7.tgz#622c16f9ad63782fe6e83dadc7e40330744b7f1e" + integrity sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" + integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-top-level-await@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-typescript@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.29.7.tgz#7c29388932313ed58413a0343048d75d92fb5b24" + integrity sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-arrow-functions@^7.0.0-0", "@babel/plugin-transform-arrow-functions@^7.24.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.29.7.tgz#d651343f562c03f47951bd1802195d0e10605f27" + integrity sha512-N7zArUXWzAMzm+/N0uPBeVB3Fam5lMxtUwMmDK5f/IBBS7a7p1qeUoxd/6CckXoxUdgsntq1Dh8xNW06maZbDQ== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-async-generator-functions@^7.25.4": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.29.7.tgz#a5365617921d82a1fee33124a1102bb38a1e677d" + integrity sha512-d98gXZkgswvkyohMBABkhm3GeXhYj8psWfwQ2C7gtfrKGTykQa/iOIi+JJhwMjPlZ6Vm2XN+DCf3Es1EoG4ZLA== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-remap-async-to-generator" "^7.29.7" + "@babel/traverse" "^7.29.7" + +"@babel/plugin-transform-async-to-generator@^7.24.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.29.7.tgz#3b5e8f1fb58133cf701bcf0baaf6f01bfd1a8889" + integrity sha512-pcUb2SS+RMo9TWVBwKGI5ShtoG7R+zBsFmCKDa6fe8c+hPr3XJlZgoE5j6i8W7gDjhyvy+85vmYexanvXh3d1w== + dependencies: + "@babel/helper-module-imports" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-remap-async-to-generator" "^7.29.7" + +"@babel/plugin-transform-block-scoping@^7.25.0": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.29.7.tgz#baa376691ae16244cd14335422fca6900f54e17d" + integrity sha512-ONyr4+AZhKh8yKWInVxU9AXA9EbsyeLcL6V0dJy6M2/62vuvpGm29zzuymbTpdc451GEpDIdAyPLP3r+P61yKQ== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-class-properties@^7.0.0-0", "@babel/plugin-transform-class-properties@^7.25.4": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.29.7.tgz#034897b8a21beec163332fac2de235b14409abdf" + integrity sha512-GtcpjFvanPfzNQi3eTitsCqtRRmmqzpy/A+yhTR1HaZo1Ly3EA8ZXxlPyHdR8/IuRMYc3E4wdGBewB2QKQjAaA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-class-static-block@^7.27.1": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.29.7.tgz#fed8efd19f3dd3e1114ee390707c70912778fd7c" + integrity sha512-kibJgmEdX2iMwsHY2tSZNDgj8PwIlCQz7FK9KuGKO8zsuoUwSEhoNnNVp/emKWrbY4HeO6kkXfdMqRKKKXBm2A== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-classes@^7.0.0-0", "@babel/plugin-transform-classes@^7.25.4": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.29.7.tgz#61d3e5aaae0c838acc3204d9db7c8dc05c25815b" + integrity sha512-qV0OGGBVacduzQHE649JyCneOFI/maT+YKsO+K4Yi3xv2wTPNjM/W2o2gdzMwEAZz7fXNTHAe0NcSg30bIN69g== + dependencies: + "@babel/helper-annotate-as-pure" "^7.29.7" + "@babel/helper-compilation-targets" "^7.29.7" + "@babel/helper-globals" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-replace-supers" "^7.29.7" + "@babel/traverse" "^7.29.7" + +"@babel/plugin-transform-computed-properties@^7.24.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.29.7.tgz#95028787ca31901b9a20b5c6d9605c32346f55ad" + integrity sha512-RK7/IyU5phpuCdBAuig5VkzG/EnbDaui5SQGdU9BFrHdV+mV4cUjLMQ9lJDjLNtWHsqtiefpGZUXQP2BiTYMsA== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/template" "^7.29.7" + +"@babel/plugin-transform-destructuring@^7.24.8", "@babel/plugin-transform-destructuring@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.29.7.tgz#5781ec6947852e27b64c1165f0db431f408090e4" + integrity sha512-iPX8aD6H9zV5s7ZsqTdNocPN/MGQ5sSMnElKrktxjJRMnB2jN/1p2+R7GkfD6CAYoVFqy5A4XnSIUeGgJzIWpg== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/traverse" "^7.29.7" + +"@babel/plugin-transform-export-namespace-from@^7.25.9": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.29.7.tgz#d6014f45cec61d7691335c6c9804204bee801d51" + integrity sha512-24B2nOy2TeJSMheqwPD4DDQOV/elLSIlKxjZt4i05H5AgdPdWR3n18HnNrcJ+j76WJd9gbwb9jPjNYUy6RautA== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-flow-strip-types@^7.25.2": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.29.7.tgz#911bcb31608c3576510d7e0c95ccf64f9e1812d0" + integrity sha512-wRHeUjUjCZnMHmiO5bRgjFLcoEh7JyTdByOW11ahhwNa4V0bmeGEaIvt51yq0zQp2yWIpqfxXXPyUP6GFJZHOQ== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/plugin-syntax-flow" "^7.29.7" + +"@babel/plugin-transform-for-of@^7.24.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.29.7.tgz#c65a678592117717aacdb10c1b73a9cb85e830be" + integrity sha512-zeSIHh0+E1Um1WJRXCFlHQYu2ieJNdivLLjlBEp+dIBu3S51n+SZZmIXjxnItw6pz56Cn+KvK68BIBVsxq2JiQ== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.29.7" + +"@babel/plugin-transform-function-name@^7.25.1": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.29.7.tgz#8b87f8a7504dbcd96135167e3fc4f61126a7bd86" + integrity sha512-otRWaHXE6fbAGkePvaj/kvs3HsqXfPhlnzwSOlnFgbqCPMd975dW+4wZ00WFBt+/YlBGcJwNrARQTOJOb4ZrIg== + dependencies: + "@babel/helper-compilation-targets" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/traverse" "^7.29.7" + +"@babel/plugin-transform-literals@^7.25.2": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.29.7.tgz#b90bd47463326c2a9d779e1bd5e1f88b9f421921" + integrity sha512-DZ/oLP21ZuWx1vKqnoNv6/tvEK48AQOBRai40CX9dTjGluvT/YZCyY3rryDtyUqCEoyNroy5KKPwX2iQCiRvyw== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-logical-assignment-operators@^7.24.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.29.7.tgz#9b29425adf5c794967aabe4b046a046a167bac2f" + integrity sha512-A0H91hh6W8MFRkp5TqJmMr39jzGD1A1E1Ysiv2O06Sfbhkapm+XyIzxWCEh5kqwOZ1/8QZ0dY3SeQ7XBqfJd5Q== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-modules-commonjs@^7.24.8", "@babel/plugin-transform-modules-commonjs@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.29.7.tgz#70e6835abf2663dafbe94b8ef1f51de7351ef135" + integrity sha512-j0vCldybPC5b5dwCQOJ21uKtHzt7hxLygJTg9eF1ScfaikEDNfzn94XoW5Fi+seBR0nCyL23xaBFFkq7dTM8XQ== + dependencies: + "@babel/helper-module-transforms" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.24.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.29.7.tgz#21e75d847b31189842fa7a77703722ed4b43d27d" + integrity sha512-vuFoLwr4qnv2xbZ16SQd6uPcH5FNrLHhk/Jzo++0XJFcaDsr4gjJVg6j398oMHiC+83k/GiBzviwF5KBJkPUtQ== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-nullish-coalescing-operator@^7.0.0-0", "@babel/plugin-transform-nullish-coalescing-operator@^7.24.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.29.7.tgz#8a54cdf88c3f50433a6173117a286195b67714cc" + integrity sha512-idmp1dFaekP9GbcMvG24Kvw2BfhFZjHnNJCkV4WuIY4PskJzwI3f1N5OdgYke38T7rftO6ERulFRn2cFeZwRkg== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-numeric-separator@^7.24.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.29.7.tgz#0266d5cd42ab87ec40fee45a4e36483cfdcbc66a" + integrity sha512-zR7fv/z14OjgHl4AgRtkDBvBMhIzCxqV/qN/2BCRC7LjFwvuzjYe7gDWxC4Wl/SNsLM6SE1IWvRPYMgSJaUvNw== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-object-rest-spread@^7.24.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.29.7.tgz#e0d5060241803922c545676613cc8acbbda0d266" + integrity sha512-Ld98jn4c0smUywL57m7SgsHq3OpThOa6LqZJif3G6jYOovPleoFhVrBJ1WegRApSFB2wu4+RelAj9AC9G08Z4A== + dependencies: + "@babel/helper-compilation-targets" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/plugin-transform-destructuring" "^7.29.7" + "@babel/plugin-transform-parameters" "^7.29.7" + "@babel/traverse" "^7.29.7" + +"@babel/plugin-transform-optional-catch-binding@^7.24.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.29.7.tgz#729664f79985be504eba112c51de9f71d009030b" + integrity sha512-sLsyndxK2VwX6yNUOakMb7Sh553ZTe/vVM1XJ+9Z5aW1ytsc8xOIwmyk05NNjN60vkc5/KqoTH6hB4V41LJhng== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-optional-chaining@^7.0.0-0", "@babel/plugin-transform-optional-chaining@^7.24.8": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.29.7.tgz#b84a1b574b3c73001023092567e16c492b720e51" + integrity sha512-6GM1dhvK3gNODkXcEcMCOLEDCLSoZ/sBbro2Ax8HURyasQ4NshagQixkRFdh5niI6E4gmA/jYI/4aT7rRos3ZQ== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.29.7" + +"@babel/plugin-transform-parameters@^7.24.7", "@babel/plugin-transform-parameters@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.29.7.tgz#a5ddc3b9bfb534814cb8334cbeba47d9cf9db090" + integrity sha512-ZDOBqV/qLYJI0YElr8DcENEyARsFQeESqWXH6gZlghYXuPPjvweuDhP4VyEi4BlUBlLRFZVjxoZDMjxhLW766g== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-private-methods@^7.24.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.29.7.tgz#cea8bd3ab99533892897a02999d5b752584ad145" + integrity sha512-/6Rz4DK1ETDEM/bWHsPHcaEe7ZaT1EqSXjtSP/L0DijOYuaUhiRiOKcwpZ8P7zR4xXEHc2ITdiCgBm9Tpyv9ug== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-private-property-in-object@^7.24.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.29.7.tgz#4a2f6be5aba47be7afbdb4cd7903c46edf3a7661" + integrity sha512-+BNo06dnrzdNNqCm1X6YUaVv0DKk8Q+JYcoZfOkLhYWNCXzlwTSRq8zGWayT1csjcpNXV9CQTBRRbmTLZac5cA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.29.7" + "@babel/helper-create-class-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-react-display-name@^7.24.7", "@babel/plugin-transform-react-display-name@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.29.7.tgz#bf161a6d750267b79db7ff6f8fb89c3369b02df3" + integrity sha512-+1wdDMGNb4UPeY3Q4L5yLiYe6TXPXubs4NjrgRFw13hPRLJfEMw2Q5OXkee6/IfdqePIeW4Jjwe3aBh7SdKz4Q== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-react-jsx-development@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.29.7.tgz#64e6aacb5cb43b9e80d3d5f19ddefc158a624f09" + integrity sha512-Xfy3UVMF04+ypnFbkhvfqtmvwfe92qwQdbGZVonhE+6v35GzlofmOnA1szaZqzb9xYWr0nl1e5EMmzi0DNON1g== + dependencies: + "@babel/plugin-transform-react-jsx" "^7.29.7" + +"@babel/plugin-transform-react-jsx-self@^7.24.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.29.7.tgz#c24424527858220624fd59a5b1eab4fa413c803a" + integrity sha512-TL0hMc9xzy86VD31nUiwzd5otRAcyEPcsegCxolO0PvcXuH1v0kECe/UIznYFihpkvU5wg/jk4v0TTEFfm53fw== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-react-jsx-source@^7.24.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.29.7.tgz#5cf25a3689906b58e2f0a2f2b374789e6627b15f" + integrity sha512-06IyK09H3wi4cGbhDBwp5gUGo0IKtnYa8tyTiephirPCK6fbobVGiXMMI5zLQ4aKEYP3wZ3ArU44o+8KMrSG/Q== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-react-jsx@^7.25.2", "@babel/plugin-transform-react-jsx@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.29.7.tgz#3d16a0e5773f079400a8c82a190709cdf92ee204" + integrity sha512-WsZulLVBUHXVj2cUcPVx6UE21TpalB6bHbSFErKT0Ib++ax24jjXe73FqlWvdylFOjiuPHYi6VCcgRad1ItN+A== + dependencies: + "@babel/helper-annotate-as-pure" "^7.29.7" + "@babel/helper-module-imports" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/plugin-syntax-jsx" "^7.29.7" + "@babel/types" "^7.29.7" + +"@babel/plugin-transform-react-pure-annotations@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.29.7.tgz#76445c90112dd0a7371b63264563bfa9a4fcd6e3" + integrity sha512-H5E+HBgDpr6Q5t+Aj11tL7XkIui1jhbIoArVQnqjgXo5/3YxkN7ZEBcWF4RQlB0T4rrxJQbXS6kiFV6B7XTqUA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-regenerator@^7.24.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.29.7.tgz#0f42626a7dbb0e7a7f52e036d3e43deebdc3ea4e" + integrity sha512-rNNFV0DBAJp988xW2DOntfDoYn1eR8GGF5AT5vYc+rjyfaQkM242c9tZUHHPe7KYaiJizXPWhQTzzdbXySyhBw== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-runtime@^7.24.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.29.7.tgz#7c7fb6e2a46dce67e278b6cc84421c1d16da5695" + integrity sha512-xmAscdE/AsqRW7vutbPNoUmu/nF5SrLKPs7aoJgEjo35lLKA/Bc0i2rMv/hr1+Y0o1bQCiVtith3u2vdgRL39Q== + dependencies: + "@babel/helper-module-imports" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + babel-plugin-polyfill-corejs2 "^0.4.14" + babel-plugin-polyfill-corejs3 "^0.13.0" + babel-plugin-polyfill-regenerator "^0.6.5" + semver "^6.3.1" + +"@babel/plugin-transform-shorthand-properties@^7.0.0-0", "@babel/plugin-transform-shorthand-properties@^7.24.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.29.7.tgz#25c0436b98f4bd9ca4b98e1fbd662743bbaab9bf" + integrity sha512-I+WYbGBAiCn7nA6xBrlgPH+MB7HWb4u8pv5S0Pv7OtwNvIFvCCb24YlttKEeUFVurfBCEaOTnuhlqsb7f0Z5Dg== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-spread@^7.24.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.29.7.tgz#a128bcdd6b5e5e47054907b2e50bc19c3f856edd" + integrity sha512-/u5K1QWada7tbYNqTjMh96718g9NTwh9tfPJMsSmVsQwGT447FskV+KcfeXkXq2GWki4EM/MuTdmBec+hOuVTQ== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.29.7" + +"@babel/plugin-transform-sticky-regex@^7.24.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.29.7.tgz#a42c0fd1fa42f7e98e1e0c7757f72a1bbca3a015" + integrity sha512-BCHzNYJGe9l7EpwwDBN/ztlL2NYFFq8hp9ddjtUEM9f2O7S7kKV/lL6Fwo7IF7NSkYhPK2vO+86nIGltA90MsA== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-template-literals@^7.0.0-0": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.29.7.tgz#ada97d8e0832bca8edb315888aa654b1570f3835" + integrity sha512-NCSEJ4sLFU2gqAub45HYh4fus2yQ36rr6ei6vpU7NdoJqCpxvEG8E6eJpscGyXP3VHD2Ny+fSXr04k1hoUrFqA== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-typescript@^7.25.2", "@babel/plugin-transform-typescript@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.29.7.tgz#f0449c3df7037bbe232043476851c38f5e4a7615" + integrity sha512-jK52h8LaLc7JarhQV2ofeFMts4H7vnOXnqZNA6fYglBTZewRBE51KWt3BUltW1P+KoPsYkHoJeXePuz4zo2LMw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.29.7" + "@babel/helper-create-class-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.29.7" + "@babel/plugin-syntax-typescript" "^7.29.7" + +"@babel/plugin-transform-unicode-regex@^7.0.0-0", "@babel/plugin-transform-unicode-regex@^7.24.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.29.7.tgz#c3064b293ff7f1794b71f7650eec8db9896d3e59" + integrity sha512-7D/x/23/d/3VqZ0QA+LGbZMlGwZjztBygSWWWsfTPoQ1oQ6Q1P6Mr3d0kk42XabyUVw+fha3LqdRsFqeKqvCyA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/preset-react@^7.22.15": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.29.7.tgz#2ed18366e38c2081bbf1760dc01e88fa5674eb17" + integrity sha512-C+PV1TFUPTmBQGoPBL8j2QmLpZ117YTCwxIZeJOM96GbYMFSc7/pOXU5lVykwnZxyTqQxRsvoRk6f2FktZgGHA== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-validator-option" "^7.29.7" + "@babel/plugin-transform-react-display-name" "^7.29.7" + "@babel/plugin-transform-react-jsx" "^7.29.7" + "@babel/plugin-transform-react-jsx-development" "^7.29.7" + "@babel/plugin-transform-react-pure-annotations" "^7.29.7" + +"@babel/preset-typescript@^7.16.7", "@babel/preset-typescript@^7.23.0": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.29.7.tgz#de9be1f47b785c979ec7b3a71f4cd8bae5267b62" + integrity sha512-/Foi8vKY2EVbed/1eZx0gJEEwHAIxogrySI7rULcRIvhZzbvoE/b5qG5Ghc0WKAFKOHA9SD1x7RsFlOYdutIiQ== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-validator-option" "^7.29.7" + "@babel/plugin-syntax-jsx" "^7.29.7" + "@babel/plugin-transform-modules-commonjs" "^7.29.7" + "@babel/plugin-transform-typescript" "^7.29.7" + +"@babel/runtime@^7.20.0", "@babel/runtime@^7.25.0": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.29.7.tgz#12022450c45a4da6d8d8287b18a4ff2ddb23f768" + integrity sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw== + +"@babel/template@^7.25.0", "@babel/template@^7.28.6", "@babel/template@^7.29.7", "@babel/template@^7.3.3": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.29.7.tgz#4d9d4004f645cdd304de958c725162784ecac700" + integrity sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg== + dependencies: + "@babel/code-frame" "^7.29.7" + "@babel/parser" "^7.29.7" + "@babel/types" "^7.29.7" + +"@babel/traverse--for-generate-function-map@npm:@babel/traverse@^7.25.3": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.29.7.tgz#c47b07a41b95da0907d026b5dd894d98de7d2f2d" + integrity sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw== + dependencies: + "@babel/code-frame" "^7.29.7" + "@babel/generator" "^7.29.7" + "@babel/helper-globals" "^7.29.7" + "@babel/parser" "^7.29.7" + "@babel/template" "^7.29.7" + "@babel/types" "^7.29.7" + debug "^4.3.1" + +"@babel/traverse@^7.25.3", "@babel/traverse@^7.29.0", "@babel/traverse@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.29.7.tgz#c47b07a41b95da0907d026b5dd894d98de7d2f2d" + integrity sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw== + dependencies: + "@babel/code-frame" "^7.29.7" + "@babel/generator" "^7.29.7" + "@babel/helper-globals" "^7.29.7" + "@babel/parser" "^7.29.7" + "@babel/template" "^7.29.7" + "@babel/types" "^7.29.7" + debug "^4.3.1" + +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.25.2", "@babel/types@^7.26.0", "@babel/types@^7.28.2", "@babel/types@^7.29.0", "@babel/types@^7.29.7", "@babel/types@^7.3.3": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.29.7.tgz#8005e31d82712ee7adaef6e23c63b71a62770a92" + integrity sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA== + dependencies: + "@babel/helper-string-parser" "^7.29.7" + "@babel/helper-validator-identifier" "^7.29.7" + +"@binbat/whip-whep@^1.1.1-sdp-trickle-throw": + version "1.1.1-sdp-trickle-throw" + resolved "https://registry.yarnpkg.com/@binbat/whip-whep/-/whip-whep-1.1.1-sdp-trickle-throw.tgz#202e1033039ac2cc5b215c5b60387b561a622a15" + integrity sha512-JFoNBEms4ECrbDd7LG2k5XP2DpGTUMGzaiCK7tjWyHYrrn58eb5BAJAX1GNQhrwkmBCRoIlhGTXULxKo6tsFug== + +"@bufbuild/protobuf@^2.2.3": + version "2.13.0" + resolved "https://registry.yarnpkg.com/@bufbuild/protobuf/-/protobuf-2.13.0.tgz#92ae09d6412c658a56b3c2cd867386850064c901" + integrity sha512-acq7c49vxfm1ggJ95P70TX7ABDM0vxr1SYD3BB0o0jnBLB4OAqeHyKuN+cD3w80gXEDQ2zxHpR6CUeA+O/aU9g== + +"@emnapi/core@1.10.0": + version "1.10.0" + resolved "https://registry.yarnpkg.com/@emnapi/core/-/core-1.10.0.tgz#380ccc8f2412ea22d1d972df7f8ee23a3b9c7467" + integrity sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw== + dependencies: + "@emnapi/wasi-threads" "1.2.1" + tslib "^2.4.0" + +"@emnapi/runtime@1.10.0": + version "1.10.0" + resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.10.0.tgz#4b260c0d3534204e98c6110b8db1a987d26ec87c" + integrity sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA== + dependencies: + tslib "^2.4.0" + +"@emnapi/wasi-threads@1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz#28fed21a1ba1ce797c44a070abc94d42f3ae8548" + integrity sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w== + dependencies: + tslib "^2.4.0" + +"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.8.0", "@eslint-community/eslint-utils@^4.9.1": + version "4.10.1" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz#8911bd72b2c3640a543609e0400b8c4d2e7e7cb6" + integrity sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg== + dependencies: + eslint-visitor-keys "^3.4.3" + +"@eslint-community/regexpp@^4.12.1", "@eslint-community/regexpp@^4.12.2", "@eslint-community/regexpp@^4.6.1": + version "4.12.2" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.2.tgz#bccdf615bcf7b6e8db830ec0b8d21c9a25de597b" + integrity sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew== + +"@eslint/config-array@^0.21.2": + version "0.21.2" + resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.21.2.tgz#f29e22057ad5316cf23836cee9a34c81fffcb7e6" + integrity sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw== + dependencies: + "@eslint/object-schema" "^2.1.7" + debug "^4.3.1" + minimatch "^3.1.5" + +"@eslint/config-helpers@^0.4.2": + version "0.4.2" + resolved "https://registry.yarnpkg.com/@eslint/config-helpers/-/config-helpers-0.4.2.tgz#1bd006ceeb7e2e55b2b773ab318d300e1a66aeda" + integrity sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw== + dependencies: + "@eslint/core" "^0.17.0" + +"@eslint/core@^0.17.0": + version "0.17.0" + resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.17.0.tgz#77225820413d9617509da9342190a2019e78761c" + integrity sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ== + dependencies: + "@types/json-schema" "^7.0.15" + +"@eslint/eslintrc@^2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" + integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.6.0" + globals "^13.19.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@eslint/eslintrc@^3.3.6": + version "3.3.6" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.3.6.tgz#d22bfd6b3a7d8e1f2c0b2f2e6de111b53ec6e13e" + integrity sha512-l2Ul9PrHsPCKcEY/ac7VgFj9D80C7S68sOKc618SyHDPK36s1XcFebXY0iTzUVn4Yq+YbwvSnDmCz9yxjX+QrA== + dependencies: + ajv "^6.14.0" + debug "^4.3.2" + espree "^10.0.1" + globals "^14.0.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.3.0" + minimatch "^3.1.5" + strip-json-comments "^3.1.1" + +"@eslint/js@8.57.1": + version "8.57.1" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.1.tgz#de633db3ec2ef6a3c89e2f19038063e8a122e2c2" + integrity sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q== + +"@eslint/js@9.39.5": + version "9.39.5" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.39.5.tgz#6f2fbcff75500d229d535e0a949ae13472c84787" + integrity sha512-QywQuszQh77pIXCsq998c8hbhSTI/azTty1Z6N53dmAudKHhy573j3yvRLsX2BSp8YpLtoCEG8E9DJe+8zUh4A== + +"@eslint/object-schema@^2.1.7": + version "2.1.7" + resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.7.tgz#6e2126a1347e86a4dedf8706ec67ff8e107ebbad" + integrity sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA== + +"@eslint/plugin-kit@^0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz#9779e3fd9b7ee33571a57435cf4335a1794a6cb2" + integrity sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA== + dependencies: + "@eslint/core" "^0.17.0" + levn "^0.4.1" + +"@expo/cli@54.0.26": + version "54.0.26" + resolved "https://registry.yarnpkg.com/@expo/cli/-/cli-54.0.26.tgz#605ebbce853cf0d1ba453fcab3d448d7b06d89c1" + integrity sha512-BjsAoKINLEo3LRE+sDC6FCgjxuOWsyfOFOKz0txrbEcxSatzIjJDVuX8XaTdmeicZdcoN524yl1sfwCWfxhYMw== + dependencies: + "@0no-co/graphql.web" "^1.0.8" + "@expo/code-signing-certificates" "^0.0.6" + "@expo/config" "~12.0.14" + "@expo/config-plugins" "~54.0.5" + "@expo/devcert" "^1.2.1" + "@expo/env" "~2.0.12" + "@expo/image-utils" "^0.8.8" + "@expo/json-file" "^10.0.16" + "@expo/metro" "~54.2.0" + "@expo/metro-config" "~54.0.17" + "@expo/osascript" "^2.3.8" + "@expo/package-manager" "^1.9.10" + "@expo/plist" "^0.4.9" + "@expo/prebuild-config" "^54.0.9" + "@expo/schema-utils" "^0.1.9" + "@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.7" + freeport-async "^2.0.0" + getenv "^2.0.0" + glob "^13.0.0" + lan-network "^0.2.1" + minimatch "^9.0.0" + node-forge "^1.3.3" + npm-package-arg "^11.0.0" + ora "^3.4.0" + picomatch "^4.0.3" + 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" + +"@expo/code-signing-certificates@^0.0.6": + version "0.0.6" + resolved "https://registry.yarnpkg.com/@expo/code-signing-certificates/-/code-signing-certificates-0.0.6.tgz#6b7b22830cb69c77a45e357c2f3aa7ab436ac772" + integrity sha512-iNe0puxwBNEcuua9gmTGzq+SuMDa0iATai1FlFTMHJ/vUmKvN/V//drXoLJkVb5i5H3iE/n/qIJxyoBnXouD0w== + dependencies: + node-forge "^1.3.3" + +"@expo/config-plugins@~54.0.5": + version "54.0.5" + resolved "https://registry.yarnpkg.com/@expo/config-plugins/-/config-plugins-54.0.5.tgz#e8b2b127c2a8e85d82b6f36cdf7cc9cde9bfd085" + integrity sha512-aWQ3sViNRoQWw6So4A2qhWCt24CuGBK6MrRHI1AG+V6/NQAjIZCHaSvcXK2gXKpmisRhTSUWaKPIgLJQFB+AeQ== + dependencies: + "@expo/config-types" "^54.0.10" + "@expo/json-file" "~10.0.16" + "@expo/plist" "^0.4.9" + "@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" + +"@expo/config-types@^54.0.10": + version "54.0.10" + resolved "https://registry.yarnpkg.com/@expo/config-types/-/config-types-54.0.10.tgz#688f4338255d2fdea970f44e2dfd8e8d37dec292" + integrity sha512-/J16SC2an1LdtCZ67xhSkGXpALYUVUNyZws7v+PVsFZxClYehDSoKLqyRaGkpHlYrCc08bS0RF5E0JV6g50psA== + +"@expo/config@~12.0.13", "@expo/config@~12.0.14": + version "12.0.14" + resolved "https://registry.yarnpkg.com/@expo/config/-/config-12.0.14.tgz#cf23ec3886dc4f2b0fa7bfd6e6f2d3303138f926" + integrity sha512-3dfbBd9LnPDgyylhCgkOsaG8Adg52uOVOTQYH5lf23a/t8M5eQpXKCvzUarrf62B78057n2NnkiofK9TfPgvzw== + dependencies: + "@babel/code-frame" "~7.10.4" + "@expo/config-plugins" "~54.0.5" + "@expo/config-types" "^54.0.10" + "@expo/json-file" "^10.0.16" + 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" + +"@expo/devcert@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@expo/devcert/-/devcert-1.2.1.tgz#1a687985bea1670866e54d5ba7c0ced963c354f4" + integrity sha512-qC4eaxmKMTmJC2ahwyui6ud8f3W60Ss7pMkpBq40Hu3zyiAaugPXnZ24145U7K36qO9UHdZUVxsCvIpz2RYYCA== + dependencies: + "@expo/sudo-prompt" "^9.3.1" + debug "^3.1.0" + +"@expo/devtools@0.1.8": + version "0.1.8" + resolved "https://registry.yarnpkg.com/@expo/devtools/-/devtools-0.1.8.tgz#bc5b297698f78b3b67037f04593a31e688330a7a" + integrity sha512-SVLxbuanDjJPgc0sy3EfXUMLb/tXzp6XIHkhtPVmTWJAp+FOr6+5SeiCfJrCzZFet0Ifyke2vX3sFcKwEvCXwQ== + dependencies: + chalk "^4.1.2" + +"@expo/env@~2.0.12", "@expo/env@~2.0.8": + version "2.0.12" + resolved "https://registry.yarnpkg.com/@expo/env/-/env-2.0.12.tgz#7738baa640459c261d3d2219f4e1598d1cccb919" + integrity sha512-wVfzeBGlUohZG5kS8QCqXurpuWZFJEkBB1wXCifai3EZ/Llcg/VMTiUCpAgHImD3lI7GIU3V1uI64c04XIo98Q== + dependencies: + chalk "^4.0.0" + debug "^4.3.4" + dotenv "~16.4.5" + dotenv-expand "~11.0.6" + getenv "^2.0.0" + +"@expo/fingerprint@0.15.5": + version "0.15.5" + resolved "https://registry.yarnpkg.com/@expo/fingerprint/-/fingerprint-0.15.5.tgz#76968191026346657d22cea10d957aa8be97777e" + integrity sha512-mdVoAMcux1WlM6kd1RoWiHRNqKqS+J6mKmWQ/BKgeh937S/fcW58EE68O6nc4KDXtWi3PBeNHskOFcgyIuD4hw== + 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 "^10.2.2" + p-limit "^3.1.0" + resolve-from "^5.0.0" + semver "^7.6.0" + +"@expo/image-utils@^0.8.8": + version "0.8.15" + resolved "https://registry.yarnpkg.com/@expo/image-utils/-/image-utils-0.8.15.tgz#65a7985c7aa6d2a2a76ac691772af923997d6872" + integrity sha512-3f5CgKJnJ8m4mp8VTcAFQqLrxof99RDr77Aa+7hgzDPg3ZotjLnofl77hf+COQRYi/kuqRYdYFgPIqOIOIdWJA== + dependencies: + "@expo/require-utils" "^55.0.6" + "@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" + +"@expo/json-file@^10.0.16": + version "10.2.0" + resolved "https://registry.yarnpkg.com/@expo/json-file/-/json-file-10.2.0.tgz#a63fca4445f2457a60407a3d76da8bfd0221e9a4" + integrity sha512-S6XzKe3R9GQeHiUPXc3xJjOv2VJhOEwFYf7xdC2z2cUqt3kZJ9mSO877sNQloVdnW/SUCtPY3bexlM7nwq+CAQ== + dependencies: + "@babel/code-frame" "^7.20.0" + json5 "^2.2.3" + +"@expo/json-file@^11.0.1": + version "11.0.1" + resolved "https://registry.yarnpkg.com/@expo/json-file/-/json-file-11.0.1.tgz#dab8f6e5ff78e7c33a8e49a48722ce972306036c" + integrity sha512-zxHWj4MKKMAL29ZQSY/Fssx4Thluk40JmuGNaeS078wy/NhlFhnVi+rHHunulE3xJAJ0CM73m8VK2+GkF9eRwQ== + dependencies: + "@babel/code-frame" "^7.20.0" + json5 "^2.2.3" + +"@expo/json-file@~10.0.16": + version "10.0.16" + resolved "https://registry.yarnpkg.com/@expo/json-file/-/json-file-10.0.16.tgz#5c715dd360178f64ed3a23a0d7ea2d95ac9c09cd" + integrity sha512-fcVkWEj+hLuP2yt5W0aw6LmDRqSPWDLUSxOMcmFeV+algmIF59sQVKCwB9btjQLd4V6x9N0pISkQEkBubUHrCw== + dependencies: + "@babel/code-frame" "~7.10.4" + json5 "^2.2.3" + +"@expo/metro-config@54.0.17", "@expo/metro-config@~54.0.17": + version "54.0.17" + resolved "https://registry.yarnpkg.com/@expo/metro-config/-/metro-config-54.0.17.tgz#a0d7eb8dba21e60694f37ed56c624fd172ef2bcd" + integrity sha512-PQFgQCZGY0DffZUvBzJttDPreZfHrQakaBlKjnvOUMNXbDna+TYmg1IFZuIDUYJezLcdp+TvVFTLjNi1+mqaVw== + dependencies: + "@babel/code-frame" "^7.20.0" + "@babel/core" "^7.20.0" + "@babel/generator" "^7.20.5" + "@expo/config" "~12.0.14" + "@expo/env" "~2.0.12" + "@expo/json-file" "~10.0.16" + "@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" + picomatch "^4.0.3" + postcss "~8.4.32" + resolve-from "^5.0.0" + +"@expo/metro@~54.2.0": + version "54.2.0" + resolved "https://registry.yarnpkg.com/@expo/metro/-/metro-54.2.0.tgz#6ecf4a77ae7553b73daca4206854728de76c854d" + integrity sha512-h68TNZPGsk6swMmLm9nRSnE2UXm48rWwgcbtAHVMikXvbxdS41NDHHeqg1rcQ9AbznDRp6SQVC2MVpDnsRKU1w== + 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" + +"@expo/osascript@^2.3.8": + version "2.7.1" + resolved "https://registry.yarnpkg.com/@expo/osascript/-/osascript-2.7.1.tgz#1880dcbaf79cde9631e0e68f461f05c8f0542b88" + integrity sha512-Zn03EX6In7ts2lPUW2ESUSkEhEWQN1qqsiXjadtZMJOuZRkMiAg1ZQHuvz9DjByDWNJ2pBwAGyrts9lj9k389g== + dependencies: + "@expo/spawn-async" "^1.8.0" + +"@expo/package-manager@^1.9.10": + version "1.13.1" + resolved "https://registry.yarnpkg.com/@expo/package-manager/-/package-manager-1.13.1.tgz#a6ce56c602a70e33ed376525dd100945e19006f9" + integrity sha512-y/K+CaYYpZpNGZhSX4HyLT/vyIunFjNfyoxNysPBCefeLKI/VCx6f9LNPzrxayr3rCYO5bl9O8H+HRQK265Nkg== + dependencies: + "@expo/json-file" "^11.0.1" + "@expo/spawn-async" "^1.8.0" + chalk "^4.0.0" + npm-package-arg "^11.0.0" + ora "^3.4.0" + resolve-workspace-root "^2.0.0" + +"@expo/plist@^0.4.9": + version "0.4.9" + resolved "https://registry.yarnpkg.com/@expo/plist/-/plist-0.4.9.tgz#acf90bac48827e6467897bb8e6c45587ede7d715" + integrity sha512-MPVpmKGfnQEnrCzgxuXcmPP/y/t6AVm+DcSb2Myp21LKWv1N3l8uFxMggesfF4ixAxkRlGmMMx9GyDC9M+XklQ== + dependencies: + "@xmldom/xmldom" "^0.8.8" + base64-js "^1.2.3" + xmlbuilder "^15.1.1" + +"@expo/prebuild-config@^54.0.8", "@expo/prebuild-config@^54.0.9": + version "54.0.9" + resolved "https://registry.yarnpkg.com/@expo/prebuild-config/-/prebuild-config-54.0.9.tgz#1021686511749fed2f5be3ff489793d7434367ec" + integrity sha512-3/Rmyzt8vduPjnSVHbnc0wYFrlhwLWn2g596rDyKcLGeqN2WTLJbzVeznsrUwyzhBNXgnTomZWO5HDzbZ/4E7g== + dependencies: + "@expo/config" "~12.0.14" + "@expo/config-plugins" "~54.0.5" + "@expo/config-types" "^54.0.10" + "@expo/image-utils" "^0.8.8" + "@expo/json-file" "^10.0.16" + "@react-native/normalize-colors" "0.81.5" + debug "^4.3.1" + resolve-from "^5.0.0" + semver "^7.6.0" + xml2js "0.6.0" + +"@expo/require-utils@^55.0.6": + version "55.0.6" + resolved "https://registry.yarnpkg.com/@expo/require-utils/-/require-utils-55.0.6.tgz#37e21d7616809ee00eae24b52c6bb09ffbcc660d" + integrity sha512-IqsRGPdGbF0lAIrg3XQ+GzcITYcsskvIRmFAjw2kBnr8RgSrRhFAJY1bKksukEUsuZy0knhTCVIIUce7hocqeA== + dependencies: + "@babel/code-frame" "^7.20.0" + "@babel/core" "^7.25.2" + "@babel/plugin-transform-modules-commonjs" "^7.24.8" + +"@expo/schema-utils@^0.1.9": + version "0.1.9" + resolved "https://registry.yarnpkg.com/@expo/schema-utils/-/schema-utils-0.1.9.tgz#48fa4971f760de7a6427a56f02aaf89889929316" + integrity sha512-t9bYwG4Z0yCVzHYJoDMci1OFq2FkBkhStlfUGSkspKYTwB/84+x6sY+CXCgdhkQNQtvWaugW5KUs9YZfAXq9Sg== + +"@expo/sdk-runtime-versions@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@expo/sdk-runtime-versions/-/sdk-runtime-versions-1.0.0.tgz#d7ebd21b19f1c6b0395e50d78da4416941c57f7c" + integrity sha512-Doz2bfiPndXYFPMRwPyGa1k5QaKDVpY806UJj570epIiMzWaYyCtobasyfC++qfIXVb5Ocy7r3tP9d62hAQ7IQ== + +"@expo/spawn-async@^1.7.2", "@expo/spawn-async@^1.8.0": + version "1.8.0" + resolved "https://registry.yarnpkg.com/@expo/spawn-async/-/spawn-async-1.8.0.tgz#915e2ab38554fca7d788e16032078554dee633cf" + integrity sha512-eb9xxd/LbuEGSdua4NumCu/McVB9EM+F/JxB9pWgnERw4HQ9XyTNH1KapG6oqLWR8TuRK2LQfzJlmNi94CVobw== + dependencies: + cross-spawn "^7.0.6" + +"@expo/sudo-prompt@^9.3.1": + version "9.3.2" + resolved "https://registry.yarnpkg.com/@expo/sudo-prompt/-/sudo-prompt-9.3.2.tgz#0fd2813402a42988e49145cab220e25bea74b308" + integrity sha512-HHQigo3rQWKMDzYDLkubN5WQOYXJJE2eNqIQC2axC2iO3mHdwnIR7FgZVvHWtBwAdzBgAP0ECp8KqS8TiMKvgw== + +"@expo/vector-icons@^15.0.3": + version "15.1.1" + resolved "https://registry.yarnpkg.com/@expo/vector-icons/-/vector-icons-15.1.1.tgz#4b1d2c60493c0b0536972f0a5babd5f5c85b48f4" + integrity sha512-Iu2VkcoI5vygbtYngm7jb4ifxElNVXQYdDrYkT7UCEIiKLeWnQY0wf2ZhHZ+Wro6Sc5TaumpKUOqDRpLi5rkvw== + +"@expo/ws-tunnel@^1.0.1": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@expo/ws-tunnel/-/ws-tunnel-1.0.6.tgz#92b70e7264ad42ea07f28a20f2f540b91d07bdd9" + integrity sha512-nDRbLmSrJar7abvUjp3smDwH8HcbZcoOEa5jVPUv9/9CajgmWw20JNRwTuBRzWIWIkEJDkz20GoNA+tSwUqk0Q== + +"@expo/xcpretty@^4.3.0": + version "4.4.4" + resolved "https://registry.yarnpkg.com/@expo/xcpretty/-/xcpretty-4.4.4.tgz#7ca8c3bfb9bbcf9d69c0f9fe6756e6db239baf89" + integrity sha512-4aQzz9vgxcNXFfo/iyNgDDYfsU5XGKKxWxZopw0cVotHiW+U8IJbIxMaxsINs6bHhtkG3StKNPcOrn3eBuxKPw== + dependencies: + "@babel/code-frame" "^7.20.0" + chalk "^4.1.0" + js-yaml "^4.1.0" + +"@fishjam-cloud/ios-expo-voip@link:../../../../web-client-sdk/packages/ios-expo-voip": + version "0.0.0" + uid "" + +"@fishjam-cloud/react-client@0.29.0", "@fishjam-cloud/react-client@workspace:*": + version "0.29.0" + resolved "https://registry.yarnpkg.com/@fishjam-cloud/react-client/-/react-client-0.29.0.tgz#9dd00e3a37f40dec404eb2fbeb9eab467923eea1" + integrity sha512-LE8nXnaBTXfqupSddeDaEa4xZaoe5la4WS2Qef8Mi6V/gkdn8/ARUWg5EWiZp4FCIhtBcB2jU5GhS+qXCApFuw== + dependencies: + "@fishjam-cloud/ts-client" "0.29.0" + events "3.3.0" + lodash.isequal "4.5.0" + +"@fishjam-cloud/react-native-client@link:../../../../web-client-sdk/packages/mobile-client": + version "0.0.0" + uid "" + +"@fishjam-cloud/react-native-webrtc@0.29.0", "@fishjam-cloud/react-native-webrtc@workspace:*": + version "0.29.0" + resolved "https://registry.yarnpkg.com/@fishjam-cloud/react-native-webrtc/-/react-native-webrtc-0.29.0.tgz#21a3a13644a0f5e11ef4bf661d5229185774c286" + integrity sha512-YwOO2VAONDr+1m1yczkOgiCPkrkxUhpqraVSJ4pJa4eHhLySR1lpRp/VHs3SqjWOk345DA3BT6hqJbDzBFfKKw== + dependencies: + base64-js "1.5.1" + debug "4.3.4" + +"@fishjam-cloud/react-native-webrtc@link:../../../../web-client-sdk/packages/react-native-webrtc": + version "0.0.0" + uid "" + +"@fishjam-cloud/ts-client@0.29.0": + version "0.29.0" + resolved "https://registry.yarnpkg.com/@fishjam-cloud/ts-client/-/ts-client-0.29.0.tgz#34fd8d25a534f81cae9f5cb721fc7202168e091f" + integrity sha512-w6KUhEiOJTPtNyYgyJLvO0lNOiIZVofCjqqkgPSEMX1wna/B1XGh6yjjI5eiY0C5Og0OZTM4FQAQ7B/vZV8aWA== + dependencies: + "@binbat/whip-whep" "^1.1.1-sdp-trickle-throw" + "@bufbuild/protobuf" "^2.2.3" + events "^3.3.0" + typed-emitter "^2.1.0" + uuid "^11.1.0" + +"@humanfs/core@^0.19.2": + version "0.19.2" + resolved "https://registry.yarnpkg.com/@humanfs/core/-/core-0.19.2.tgz#a8272ca03b2acf492670222b2320b6c421bfde60" + integrity sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA== + dependencies: + "@humanfs/types" "^0.15.0" + +"@humanfs/node@^0.16.6": + version "0.16.8" + resolved "https://registry.yarnpkg.com/@humanfs/node/-/node-0.16.8.tgz#8f800cccc13f4f8cd3116e2d9c0a94939da3e3ed" + integrity sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ== + dependencies: + "@humanfs/core" "^0.19.2" + "@humanfs/types" "^0.15.0" + "@humanwhocodes/retry" "^0.4.0" + +"@humanfs/types@^0.15.0": + version "0.15.0" + resolved "https://registry.yarnpkg.com/@humanfs/types/-/types-0.15.0.tgz#f2a09f62012390b2bff3fc6fb248ddec8c09a090" + integrity sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q== + +"@humanwhocodes/config-array@^0.13.0": + version "0.13.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.13.0.tgz#fb907624df3256d04b9aa2df50d7aa97ec648748" + integrity sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw== + dependencies: + "@humanwhocodes/object-schema" "^2.0.3" + debug "^4.3.1" + minimatch "^3.0.5" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^2.0.3": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" + integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== + +"@humanwhocodes/retry@^0.4.0", "@humanwhocodes/retry@^0.4.2": + version "0.4.3" + resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.4.3.tgz#c2b9d2e374ee62c586d3adbea87199b1d7a7a6ba" + integrity sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ== + +"@isaacs/fs-minipass@^4.0.0": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz#2d59ae3ab4b38fb4270bfa23d30f8e2e86c7fe32" + integrity sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w== + dependencies: + minipass "^7.0.4" + +"@isaacs/ttlcache@^1.4.1": + version "1.4.1" + resolved "https://registry.yarnpkg.com/@isaacs/ttlcache/-/ttlcache-1.4.1.tgz#21fb23db34e9b6220c6ba023a0118a2dd3461ea2" + integrity sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA== + +"@istanbuljs/load-nyc-config@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" + integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== + 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" + +"@istanbuljs/schema@^0.1.2": + version "0.1.6" + resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.6.tgz#8dc9afa2ac1506cb1a58f89940f1c124446c8df3" + integrity sha512-+Sg6GCR/wy1oSmQDFq4LQDAhm3ETKnorxN+y5nbLULOR3P0c14f2Wurzj3/xqPXtasLFfHd5iRFQ7AJt4KH2cw== + +"@jest/create-cache-key-function@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/create-cache-key-function/-/create-cache-key-function-29.7.0.tgz#793be38148fab78e65f40ae30c36785f4ad859f0" + integrity sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA== + dependencies: + "@jest/types" "^29.6.3" + +"@jest/environment@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.7.0.tgz#24d61f54ff1f786f3cd4073b4b94416383baf2a7" + integrity sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw== + dependencies: + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-mock "^29.7.0" + +"@jest/fake-timers@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.7.0.tgz#fd91bf1fffb16d7d0d24a426ab1a47a49881a565" + integrity sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ== + 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" + +"@jest/schemas@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" + integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== + dependencies: + "@sinclair/typebox" "^0.27.8" + +"@jest/transform@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.7.0.tgz#df2dd9c346c7d7768b8a06639994640c642e284c" + integrity sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw== + 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" + +"@jest/types@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" + integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== + 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" + +"@jridgewell/gen-mapping@^0.3.12", "@jridgewell/gen-mapping@^0.3.2", "@jridgewell/gen-mapping@^0.3.5": + version "0.3.13" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz#6342a19f44347518c93e43b1ac69deb3c4656a1f" + integrity sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA== + dependencies: + "@jridgewell/sourcemap-codec" "^1.5.0" + "@jridgewell/trace-mapping" "^0.3.24" + +"@jridgewell/remapping@^2.3.5": + version "2.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/remapping/-/remapping-2.3.5.tgz#375c476d1972947851ba1e15ae8f123047445aa1" + integrity sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ== + dependencies: + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" + +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + +"@jridgewell/source-map@^0.3.3": + version "0.3.11" + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.11.tgz#b21835cbd36db656b857c2ad02ebd413cc13a9ba" + integrity sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA== + dependencies: + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + +"@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0": + version "1.5.5" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz#6912b00d2c631c0d15ce1a7ab57cd657f2a8f8ba" + integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og== + +"@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25", "@jridgewell/trace-mapping@^0.3.28": + version "0.3.31" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz#db15d6781c931f3a251a3dac39501c98a6082fd0" + integrity sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@napi-rs/wasm-runtime@^1.1.4": + version "1.1.6" + resolved "https://registry.yarnpkg.com/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.6.tgz#ed33806d0f9be98dc76d0c3d4fd872fda701b5d5" + integrity sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg== + dependencies: + "@tybys/wasm-util" "^0.10.3" + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.8": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@nolyfill/is-core-module@1.0.39": + version "1.0.39" + resolved "https://registry.yarnpkg.com/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz#3dc35ba0f1e66b403c00b39344f870298ebb1c8e" + integrity sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA== + +"@react-native-async-storage/async-storage@^3.1.1": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@react-native-async-storage/async-storage/-/async-storage-3.1.1.tgz#051caeb93919260041e53165f1b6c8a975b15105" + integrity sha512-z+PnLz1n6ECKhgoHZHkfc+dijXZEyZnNFSajbtE0NEbsJhmX8x9GlOeiMQIKX2E4DUqPSgfIh4FYBv1M49KgPQ== + dependencies: + idb "8.0.3" + +"@react-native/assets-registry@0.81.5": + version "0.81.5" + resolved "https://registry.yarnpkg.com/@react-native/assets-registry/-/assets-registry-0.81.5.tgz#d22c924fa6f6d4a463c5af34ce91f38756c0fa7d" + integrity sha512-705B6x/5Kxm1RKRvSv0ADYWm5JOnoiQ1ufW7h8uu2E6G9Of/eE6hP/Ivw3U5jI16ERqZxiKQwk34VJbB0niX9w== + +"@react-native/babel-plugin-codegen@0.81.5": + version "0.81.5" + resolved "https://registry.yarnpkg.com/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.81.5.tgz#328d03f42c32b5a8cc2dee1aa84a7c48dddc5f18" + integrity sha512-oF71cIH6je3fSLi6VPjjC3Sgyyn57JLHXs+mHWc9MoCiJJcM4nqsS5J38zv1XQ8d3zOW2JtHro+LF0tagj2bfQ== + dependencies: + "@babel/traverse" "^7.25.3" + "@react-native/codegen" "0.81.5" + +"@react-native/babel-preset@0.81.5": + version "0.81.5" + resolved "https://registry.yarnpkg.com/@react-native/babel-preset/-/babel-preset-0.81.5.tgz#e8b7969d21f87ef4e41e603248e8a70c44b4a5bb" + integrity sha512-UoI/x/5tCmi+pZ3c1+Ypr1DaRMDLI3y+Q70pVLLVgrnC3DHsHRIbHcCHIeG/IJvoeFqFM2sTdhSOLJrf8lOPrA== + 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" + +"@react-native/codegen@0.81.5": + version "0.81.5" + resolved "https://registry.yarnpkg.com/@react-native/codegen/-/codegen-0.81.5.tgz#d4dec668c94b9d58a5c2dbdbf026db331e1b6b27" + integrity sha512-a2TDA03Up8lpSa9sh5VRGCQDXgCTOyDOFH+aqyinxp1HChG8uk89/G+nkJ9FPd0rqgi25eCTR16TWdS3b+fA6g== + 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" + +"@react-native/community-cli-plugin@0.81.5": + version "0.81.5" + resolved "https://registry.yarnpkg.com/@react-native/community-cli-plugin/-/community-cli-plugin-0.81.5.tgz#617789cda4da419d03dda00e2a78c36188b4391e" + integrity sha512-yWRlmEOtcyvSZ4+OvqPabt+NS36vg0K/WADTQLhrYrm9qdZSuXmq8PmdJWz/68wAqKQ+4KTILiq2kjRQwnyhQw== + 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" + +"@react-native/debugger-frontend@0.81.5": + version "0.81.5" + resolved "https://registry.yarnpkg.com/@react-native/debugger-frontend/-/debugger-frontend-0.81.5.tgz#82ece0181e9a7a3dcbdfa86cf9decd654e13f81f" + integrity sha512-bnd9FSdWKx2ncklOetCgrlwqSGhMHP2zOxObJbOWXoj7GHEmih4MKarBo5/a8gX8EfA1EwRATdfNBQ81DY+h+w== + +"@react-native/dev-middleware@0.81.5": + version "0.81.5" + resolved "https://registry.yarnpkg.com/@react-native/dev-middleware/-/dev-middleware-0.81.5.tgz#81e8ac545d7736ef6ebb2e59fdbaebc5cf9aedec" + integrity sha512-WfPfZzboYgo/TUtysuD5xyANzzfka8Ebni6RIb2wDxhb56ERi7qDrE4xGhtPsjCL4pQBXSVxyIlCy0d8I6EgGA== + 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" + +"@react-native/gradle-plugin@0.81.5": + version "0.81.5" + resolved "https://registry.yarnpkg.com/@react-native/gradle-plugin/-/gradle-plugin-0.81.5.tgz#a58830f38789f6254b64449a17fe57455b589d00" + integrity sha512-hORRlNBj+ReNMLo9jme3yQ6JQf4GZpVEBLxmTXGGlIL78MAezDZr5/uq9dwElSbcGmLEgeiax6e174Fie6qPLg== + +"@react-native/js-polyfills@0.81.5": + version "0.81.5" + resolved "https://registry.yarnpkg.com/@react-native/js-polyfills/-/js-polyfills-0.81.5.tgz#2ca68188c8fff9b951f507b1dec7efe928848274" + integrity sha512-fB7M1CMOCIUudTRuj7kzxIBTVw2KXnsgbQ6+4cbqSxo8NmRRhA0Ul4ZUzZj3rFd3VznTL4Brmocv1oiN0bWZ8w== + +"@react-native/normalize-colors@0.81.5": + version "0.81.5" + resolved "https://registry.yarnpkg.com/@react-native/normalize-colors/-/normalize-colors-0.81.5.tgz#1ca6cb6772bb7324df2b11aab35227eacd6bdfe7" + integrity sha512-0HuJ8YtqlTVRXGZuGeBejLE04wSQsibpTI+RGOyVqxZvgtlLLC/Ssw0UmbHhT4lYMp2fhdtvKZSs5emWB1zR/g== + +"@react-native/virtualized-lists@0.81.5": + version "0.81.5" + resolved "https://registry.yarnpkg.com/@react-native/virtualized-lists/-/virtualized-lists-0.81.5.tgz#24123fded16992d7e46ecc4ccd473be939ea8c1b" + integrity sha512-UVXgV/db25OPIvwZySeToXD/9sKKhOdkcWmmf4Jh8iBZuyfML+/5CasaZ1E7Lqg6g3uqVQq75NqIwkYmORJMPw== + dependencies: + invariant "^2.2.4" + nullthrows "^1.1.1" + +"@rtsao/scc@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@rtsao/scc/-/scc-1.1.0.tgz#927dd2fae9bc3361403ac2c7a00c32ddce9ad7e8" + integrity sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g== + +"@sinclair/typebox@^0.27.8": + version "0.27.12" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.12.tgz#0cacd3cff047a32936b1ace47ea7c86eaab60a7f" + integrity sha512-hhyNJ+nbR6ZR7pToHvllEFun9TL0sbL+tk/ON75lo+Xas054uez98qRbsuNt7MBCyZKK4+8Yli/OAGZhmfBZ/g== + +"@sinonjs/commons@^3.0.0": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.1.tgz#1029357e44ca901a615585f6d27738dbc89084cd" + integrity sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ== + dependencies: + type-detect "4.0.8" + +"@sinonjs/fake-timers@^10.0.2": + version "10.3.0" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz#55fdff1ecab9f354019129daf4df0dd4d923ea66" + integrity sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA== + dependencies: + "@sinonjs/commons" "^3.0.0" + +"@tybys/wasm-util@^0.10.3": + version "0.10.3" + resolved "https://registry.yarnpkg.com/@tybys/wasm-util/-/wasm-util-0.10.3.tgz#015cba9e9dd47ce14d03d2a8c5d547bfb169665d" + integrity sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg== + dependencies: + tslib "^2.4.0" + +"@types/babel__core@^7.1.14": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" + integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== + dependencies: + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.27.0" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.27.0.tgz#b5819294c51179957afaec341442f9341e4108a9" + integrity sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f" + integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": + version "7.28.0" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.28.0.tgz#07d713d6cce0d265c9849db0cbe62d3f61f36f74" + integrity sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q== + dependencies: + "@babel/types" "^7.28.2" + +"@types/estree@^1.0.6": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.9.tgz#cf3f0e876d7bee15a93ab925b82bf570a3904a24" + integrity sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg== + +"@types/graceful-fs@^4.1.3": + version "4.1.9" + resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.9.tgz#2a06bc0f68a20ab37b3e36aa238be6abdf49e8b4" + integrity sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ== + dependencies: + "@types/node" "*" + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": + version "2.0.6" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" + integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== + +"@types/istanbul-lib-report@*": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz#53047614ae72e19fc0401d872de3ae2b4ce350bf" + integrity sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^3.0.0": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz#0f03e3d2f670fbdac586e34b433783070cc16f54" + integrity sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ== + dependencies: + "@types/istanbul-lib-report" "*" + +"@types/json-schema@^7.0.15": + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== + +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== + +"@types/node@*": + version "26.1.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-26.1.1.tgz#bad758d601e97d6cf457d204ee76a35fce7bd119" + integrity sha512-nxAkRSVkN1Y0JC1W8ky/fTfkGsMmcrRsbx+3XoZE+rMOX71kLYTV7fLXpqud1GpbpP5TuffXFqfX7fH2GgZREw== + dependencies: + undici-types "~8.3.0" + +"@types/react@~19.1.0": + version "19.1.17" + resolved "https://registry.yarnpkg.com/@types/react/-/react-19.1.17.tgz#8be0b9c546cede389b930a98eb3fad1897f209c3" + integrity sha512-Qec1E3mhALmaspIrhWt9jkQMNdw6bReVu64mjvhbhq2NFPftLPVr+l1SZgmw/66WwBNpDh7ao5AT6gF5v41PFA== + dependencies: + csstype "^3.0.2" + +"@types/stack-utils@^2.0.0": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8" + integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== + +"@types/yargs-parser@*": + version "21.0.3" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" + integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== + +"@types/yargs@^17.0.8": + version "17.0.35" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.35.tgz#07013e46aa4d7d7d50a49e15604c1c5340d4eb24" + integrity sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg== + dependencies: + "@types/yargs-parser" "*" + +"@typescript-eslint/eslint-plugin@^8.9.0": + version "8.65.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.65.0.tgz#0a58df6fea8c0bf6b396f518077099bc8b762bb5" + integrity sha512-IEgob78X12rHpUmtcwFsXhZdVGJtwTVP8FiCLZkR6GlYVrl2PcuB+KhCE5BlVC/eQpQnu8WXRtkHZuPar+gCRA== + dependencies: + "@eslint-community/regexpp" "^4.12.2" + "@typescript-eslint/scope-manager" "8.65.0" + "@typescript-eslint/type-utils" "8.65.0" + "@typescript-eslint/utils" "8.65.0" + "@typescript-eslint/visitor-keys" "8.65.0" + ignore "^7.0.5" + natural-compare "^1.4.0" + ts-api-utils "^2.5.0" + +"@typescript-eslint/parser@^8.9.0": + version "8.65.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.65.0.tgz#5295c1058c0a1dd746ef28baaf9c0341dbdf03dc" + integrity sha512-CZ4nMxWwgu1HEEFNkeaCptra9QCtkmKdgf3sWh1rl1trIhmxLilgTV4cwcbQ4wemnT4sWQN8CaKOmdYx+g2gMA== + dependencies: + "@typescript-eslint/scope-manager" "8.65.0" + "@typescript-eslint/types" "8.65.0" + "@typescript-eslint/typescript-estree" "8.65.0" + "@typescript-eslint/visitor-keys" "8.65.0" + debug "^4.4.3" + +"@typescript-eslint/project-service@8.65.0": + version "8.65.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.65.0.tgz#65fbbc9a1591abffaeab5513200f848271cb0aa5" + integrity sha512-SxnPhbTsGahizDgbu7oqFH/xVtzIqMd/s+WtnSxNxJZJpLbdT5IPdzg8EZxO3+PoKahXmwJLeNQOpKJb3/bi7Q== + dependencies: + "@typescript-eslint/tsconfig-utils" "^8.65.0" + "@typescript-eslint/types" "^8.65.0" + debug "^4.4.3" + +"@typescript-eslint/scope-manager@8.65.0": + version "8.65.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.65.0.tgz#9547202ce7e608e7b6283df585703b980a0ea70d" + integrity sha512-Esbl8OSYiVxBokYgWPf7VVWg/BE798wXhimnn9ML9Pt5qoDf8bfQlgjlKXR/k98+AcNzlLKYrpCcrcuZ9DZLgg== + dependencies: + "@typescript-eslint/types" "8.65.0" + "@typescript-eslint/visitor-keys" "8.65.0" + +"@typescript-eslint/tsconfig-utils@8.65.0", "@typescript-eslint/tsconfig-utils@^8.65.0": + version "8.65.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.65.0.tgz#36f168fcdbb1295f7446ff0379667f98c3cf1bf3" + integrity sha512-j6GzGqCiRdA7Qhur2VVmKZAkBLfnHFQfx4TaJGL9RMveZqCo48jSHHO0DTgizEnGhtWnqmbtCUSrqSkdiY/0Hg== + +"@typescript-eslint/type-utils@8.65.0": + version "8.65.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.65.0.tgz#d316d7522d93cff4cd14f305e02f3df2d804f9c1" + integrity sha512-YjaZ7PRI5qY7ax2L3PbvX0rRyGtipAReCWs0mhhDBHjH/vl0g0BonaGXrKdKpMbIIsMIwDgbk/xzkBTyAltS5g== + dependencies: + "@typescript-eslint/types" "8.65.0" + "@typescript-eslint/typescript-estree" "8.65.0" + "@typescript-eslint/utils" "8.65.0" + debug "^4.4.3" + ts-api-utils "^2.5.0" + +"@typescript-eslint/types@8.65.0", "@typescript-eslint/types@^8.29.1", "@typescript-eslint/types@^8.65.0": + version "8.65.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.65.0.tgz#3e86738416a777c8b8925ab46745f48ecf904c9f" + integrity sha512-JSSwWNy+H0E/01jJEM+hrX6N0OFDzFzeIhHFSAS01tlVaevpG8cFyYRPhS5yjGOvBUx3sqQHVMjCL1CAZZMxBg== + +"@typescript-eslint/typescript-estree@8.65.0": + version "8.65.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.65.0.tgz#f1f514808f6aa713e2d678ae8ff592a65e1632af" + integrity sha512-JboAE2swaYt4tb1fHhHTABE2K+OLy09XfcTbhnk4Pw96f9dd2e9iYsJ28gBggHlo5z5x1rkyWvcPoTuNTd4oGg== + dependencies: + "@typescript-eslint/project-service" "8.65.0" + "@typescript-eslint/tsconfig-utils" "8.65.0" + "@typescript-eslint/types" "8.65.0" + "@typescript-eslint/visitor-keys" "8.65.0" + debug "^4.4.3" + minimatch "^10.2.2" + semver "^7.7.3" + tinyglobby "^0.2.15" + ts-api-utils "^2.5.0" + +"@typescript-eslint/utils@8.65.0", "@typescript-eslint/utils@^8.29.1": + version "8.65.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.65.0.tgz#afedd974a0c8deeef553b509df5800bafd615a72" + integrity sha512-gXiwIHsYreboxeJucHKPvgwl7dXt50mF8s1/c00cP/WoVTyWKFdtfhRWwZiXYFU5H2O8vVoSLNrexFZjYS/SGA== + dependencies: + "@eslint-community/eslint-utils" "^4.9.1" + "@typescript-eslint/scope-manager" "8.65.0" + "@typescript-eslint/types" "8.65.0" + "@typescript-eslint/typescript-estree" "8.65.0" + +"@typescript-eslint/visitor-keys@8.65.0": + version "8.65.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.65.0.tgz#e3704c13cb4a1c22454c1abf28ff4737e15018c6" + integrity sha512-8C71BQkGjiMmXtop7pHVJu1l2NNShFdkCyD6a2ezzs5vU/L3LRtb69EtcteFwz0mYMPzIgOw0n6OV4VBUWZd7A== + dependencies: + "@typescript-eslint/types" "8.65.0" + eslint-visitor-keys "^5.0.0" + +"@ungap/structured-clone@^1.2.0", "@ungap/structured-clone@^1.3.0": + version "1.3.3" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.3.3.tgz#094041e1a4cb1987f038335421281ac8be390bcc" + integrity sha512-60YRaenCQcVjYEKOcG824+DRGGIQ3VKErcBoAEDJZz5bKIs2ZG+X/H9Nk+Q6EVkwJk5QNApxbrc5QtBSwtrXAg== + +"@unrs/resolver-binding-android-arm-eabi@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.12.2.tgz#98a9fee62c01f209747a4ab5855f1ced38a6d03a" + integrity sha512-g5T90pqg1bo/7mytQx6F4iBNC0Wsh9cu+z9veDbFjc7HjpesJFWD7QMS0NGStXM075+7dJPPVvBbpZlnrdpi/w== + +"@unrs/resolver-binding-android-arm64@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.12.2.tgz#46b7e8a1393f907462324f1576e8883529acf066" + integrity sha512-YGCRZv/9GLhwmz6mYDeTsm/92BAyR28l6c2ReweVW5pWgfsitWLY8upvfRlGdoyD8HjeTHSYJWyZGD4KJA/nFQ== + +"@unrs/resolver-binding-darwin-arm64@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.12.2.tgz#0ea07b00e2583ab004b853d4c02ec5f0745d490c" + integrity sha512-u9DiNT1auQMO20A9SyTuG3wUgQWB9Z7KjAg0uFuCDR1FsAY8A0CG2S6JpHS1xwm/w1G08bjXZDcyOCjv1WAm2w== + +"@unrs/resolver-binding-darwin-x64@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.12.2.tgz#a2a6901ed58449b91b4438e582f6890cba956049" + integrity sha512-f7rPLi/T1HVKZu/u6t87lroib16n8vrSzcyxI7lg4BGO9UF26KhQL44sd9eOUgrTYhvRXtWOIZT5PejdPyJfUA== + +"@unrs/resolver-binding-freebsd-x64@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.12.2.tgz#ebe6fe7f6706b7378ea4a48a024602e9c2f48f89" + integrity sha512-BpcOjWCJub6nRZUS2zA20pmLvjtqAtGejETaIyRLiZiQf++cbrjltLA5NN/xaXfqeOBOSlMFbemIl5/S5tljmg== + +"@unrs/resolver-binding-linux-arm-gnueabihf@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.12.2.tgz#e6040fedaa240124419d35b25b69c5fa15ddb499" + integrity sha512-vZTDvdSISZjJx66OzJqtsOhzifbqRjbmI1Mnu49fQDwog5GtDI4QidRiEAYbZCRj9C8YZEW+3ZjqsyS9GR4k2A== + +"@unrs/resolver-binding-linux-arm-musleabihf@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.12.2.tgz#d217a8fb59f659c131539326c140e7b62e3e3c6a" + integrity sha512-BiPI+IrIlwcW4nLLMM21+B1dFPzd55yAVgVGrdgDjNef+ch03GdxrcyaIz8X9SsQirh/kCQ7mviyWlMxdh2D7g== + +"@unrs/resolver-binding-linux-arm64-gnu@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.12.2.tgz#edab13c46a45783a7e01351e113825c04f352e24" + integrity sha512-zJc0H99FEPoFfSrNpa91HYfxzfAJCr502oxNK1cfdC9hlaFI43RT+JFCann9JUgZmLzzntChHyn13Sgn9ljHNg== + +"@unrs/resolver-binding-linux-arm64-musl@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.12.2.tgz#e5e195db1130f7d3b6aa2fd67b3c9fe1ea4859a0" + integrity sha512-KQ3Lki6l+Pz1k/eBipN41ES+YUK30beLGb9YqcB1O542cyLCNE6GaxrfcY3T6EezmGGk84wb5XyO9loTM9tkcA== + +"@unrs/resolver-binding-linux-loong64-gnu@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-loong64-gnu/-/resolver-binding-linux-loong64-gnu-1.12.2.tgz#f01d22e091bae13016f4636698d9dcbbda775c3e" + integrity sha512-3SJGEh1DborhG6pyxvhPzCT4bbSIVihsvgJc13P1bHG7KLdNDaF9T3gsTwFc7Jw/5Y5/iWOjkEx7Zy0NvCGX3Q== + +"@unrs/resolver-binding-linux-loong64-musl@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-loong64-musl/-/resolver-binding-linux-loong64-musl-1.12.2.tgz#7d23efcb98adf076bfbcecc27b4212c36aa6697d" + integrity sha512-jiuG/Obbel7uw1PwHNFfrkiKhLAF6mnyZ6aWlOAVN9WqKm8v0OFGnciJIHu8+CMvXLQ8AD51LPzAoUfT21D5Ew== + +"@unrs/resolver-binding-linux-ppc64-gnu@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.12.2.tgz#1f35f1eaa322f33cf2d96dac27f0626a93ffe2f6" + integrity sha512-q7xRvVpmcfeL+LlZg8Pbbo6QaTZwDU5BaGZbwfhkEsXJn3Was8xYfE0RBH266xZt0rM6B7i8xAYIvjthuUIWHg== + +"@unrs/resolver-binding-linux-riscv64-gnu@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.12.2.tgz#674faa696f5ce96f214873946a1e2d6ca96723dd" + integrity sha512-0CVdx6lcnT3Q9inOH8tsMIOJ6ImndllMjqJHg8RLVdB7Vq4SfkEXl9mCSsVNuNA4MCYycRicCUxPCabVHJRr6A== + +"@unrs/resolver-binding-linux-riscv64-musl@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.12.2.tgz#37835fdd0b472ecdcffccd4288f19018454b138c" + integrity sha512-iOwlRo9vnp6R6ohHQS11n0NnfdXx/omhkocmIfaPRpQhKZ+3BDMkkdRVh53qjkFkpPddf+FETA28NwGN7l5l+w== + +"@unrs/resolver-binding-linux-s390x-gnu@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.12.2.tgz#b6edf13db4bb0accdcd1ad482a4eea0301de9224" + integrity sha512-HYJtLfXq94q8iZNFT1lknx258wlkkWhZeUXJRqzKBBUJ00CvZ+N33zgbCqimLjsyw5Va6uUxhVa12mI+kaveEw== + +"@unrs/resolver-binding-linux-x64-gnu@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.12.2.tgz#daddad00bf65a405202284da1eb1db8eb83b218f" + integrity sha512-mPsUhunKKDih5O96Y6enDQyHc1SqBPlY1E/SfMWDM3EdJ95Z9CArPeCVwCCqbP45ljvivdEk8Fxn+SIb1rDAJQ== + +"@unrs/resolver-binding-linux-x64-musl@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.12.2.tgz#dfdff1e0c2bad25420b41c76a746011c3983b9bb" + integrity sha512-azrt6+5ydLd8Vt210AAFis/lZevSfPw93EJRIJG+xPu4WCJ8K0kppCTpMyLPcKT7H15M4Jnt2tMp5bOvCkRC6A== + +"@unrs/resolver-binding-openharmony-arm64@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-openharmony-arm64/-/resolver-binding-openharmony-arm64-1.12.2.tgz#ce07c4f5e7b42f7bfce45e7629b8659063aefefe" + integrity sha512-YZ9hP4O0X9PQb8eO980qmLNGH4zT3I9+SZTdt0Pr0YyuGQhYKoOZkV02VzrzyOZJ5xIJ3UFIenKkUkGg8GjgWQ== + +"@unrs/resolver-binding-wasm32-wasi@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.12.2.tgz#82514f0506cfaf65f17fe16095f92d450e487183" + integrity sha512-tYFDIkMxSflfEc/h92ZWNsZlHSwgimbNHSO3PL2JWQHfCuC2q316jMyYU9TIWZsFK2bQwyK5VAdYgn8ygPj69A== + dependencies: + "@emnapi/core" "1.10.0" + "@emnapi/runtime" "1.10.0" + "@napi-rs/wasm-runtime" "^1.1.4" + +"@unrs/resolver-binding-win32-arm64-msvc@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.12.2.tgz#521427dd59a8f4740ddd1dc7c3bc6af1aa1d260d" + integrity sha512-qzNyg3xL0VPQmCaUh+N5jSitce6k+uCBfMDesWRnlULOZaqUkaJ0ybdT+UqlAWJoQjuqfIU/0Ptx9bteN4D82g== + +"@unrs/resolver-binding-win32-ia32-msvc@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.12.2.tgz#05b63286ff2da37e0ce3083b8390884385efff62" + integrity sha512-WD9sY00OfpHVGfsnHZoA8jVT+esS/Bg8z8jzxp5BnDCjjwsuKsPQrzswwpFy4J1AUJbXPRfkpcX0mXrzeXW79g== + +"@unrs/resolver-binding-win32-x64-msvc@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.12.2.tgz#72da0da48d72b1e87831b9c0308931d3f4669027" + integrity sha512-nAB74NfSNKknqQ1RrYj6uz8FcXEomu/MATJZxh/x+BArzN2U3JbOYC0APYzUIGhVY3m5hRxA8VPNdPBoG8txlA== + +"@urql/core@^5.0.6", "@urql/core@^5.1.2": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@urql/core/-/core-5.2.0.tgz#77ee41e192e261fea30c2ca6c2f340410b45d214" + integrity sha512-/n0ieD0mvvDnVAXEQgX/7qJiVcvYvNkOHeBvkwtylfjydar123caCXcl58PXFY11oU1oquJocVXHxLAbtv4x1A== + dependencies: + "@0no-co/graphql.web" "^1.0.13" + wonka "^6.3.2" + +"@urql/exchange-retry@^1.3.0": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@urql/exchange-retry/-/exchange-retry-1.3.2.tgz#042ff5f3512a062651ec7257f1b07f9db2f6fefd" + integrity sha512-TQMCz2pFJMfpNxmSfX1VSfTjwUIFx/mL+p1bnfM1xjjdla7Z+KnGMW/EhFbpckp3LyWAH4PgOsMwOMnIN+MBFg== + dependencies: + "@urql/core" "^5.1.2" + wonka "^6.3.2" + +"@xmldom/xmldom@^0.8.8": + version "0.8.13" + resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.13.tgz#00d1dd940b218dff2e49309d410d8bb212159225" + integrity sha512-KRYzxepc14G/CEpEGc3Yn+JKaAeT63smlDr+vjB8jRfgTBBI9wRj/nkQEO+ucV8p8I9bfKLWp37uHgFrbntPvw== + +"@xmldom/xmldom@^0.9.10": + version "0.9.10" + resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.9.10.tgz#a0ad5a26fe8aa996310870726e1704977f769dee" + integrity sha512-A9gOqLdi6cV4ibazAjcQufGj0B1y/vDqYrcuP6d/6x8P27gRS8643Dj9o1dEKtB6O7fwxb2FgBmJS2mX7gpvdw== + +abort-controller@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" + integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== + dependencies: + event-target-shim "^5.0.0" + +accepts@^1.3.7, accepts@^1.3.8: + version "1.3.8" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + +accepts@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-2.0.0.tgz#bbcf4ba5075467f3f2131eab3cffc73c2f5d7895" + integrity sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng== + dependencies: + mime-types "^3.0.0" + negotiator "^1.0.0" + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn@^8.15.0, acorn@^8.9.0: + version "8.17.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.17.0.tgz#1785adb84faf8d8add10369b93826fc2bd08f1fe" + integrity sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg== + +agent-base@^7.1.2: + version "7.1.4" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.4.tgz#e3cd76d4c548ee895d3c3fd8dc1f6c5b9032e7a8" + integrity sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ== + +ajv@^6.12.4, ajv@^6.14.0: + version "6.15.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.15.0.tgz#07e982c74626167aa7a2495c53817892d7139492" + integrity sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +anser@^1.4.9: + version "1.4.10" + resolved "https://registry.yarnpkg.com/anser/-/anser-1.4.10.tgz#befa3eddf282684bd03b63dcda3927aef8c2e35b" + integrity sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww== + +ansi-escapes@^4.2.1: + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-regex@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.1.tgz#164daac87ab2d6f6db3a29875e2d1766582dabed" + integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g== + +ansi-regex@^5.0.0, ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== + +any-promise@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== + +anymatch@^3.0.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +arg@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" + integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +array-buffer-byte-length@^1.0.1, array-buffer-byte-length@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz#384d12a37295aec3769ab022ad323a18a51ccf8b" + integrity sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw== + dependencies: + call-bound "^1.0.3" + is-array-buffer "^3.0.5" + +array-includes@^3.1.6, array-includes@^3.1.8, array-includes@^3.1.9: + version "3.1.9" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.9.tgz#1f0ccaa08e90cdbc3eb433210f903ad0f17c3f3a" + integrity sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.4" + define-properties "^1.2.1" + es-abstract "^1.24.0" + es-object-atoms "^1.1.1" + get-intrinsic "^1.3.0" + is-string "^1.1.1" + math-intrinsics "^1.1.0" + +array.prototype.findlast@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz#3e4fbcb30a15a7f5bf64cf2faae22d139c2e4904" + integrity sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-shim-unscopables "^1.0.2" + +array.prototype.findlastindex@^1.2.6: + version "1.2.6" + resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz#cfa1065c81dcb64e34557c9b81d012f6a421c564" + integrity sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.4" + define-properties "^1.2.1" + es-abstract "^1.23.9" + es-errors "^1.3.0" + es-object-atoms "^1.1.1" + es-shim-unscopables "^1.1.0" + +array.prototype.flat@^1.3.1, array.prototype.flat@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz#534aaf9e6e8dd79fb6b9a9917f839ef1ec63afe5" + integrity sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg== + dependencies: + call-bind "^1.0.8" + define-properties "^1.2.1" + es-abstract "^1.23.5" + es-shim-unscopables "^1.0.2" + +array.prototype.flatmap@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz#712cc792ae70370ae40586264629e33aab5dd38b" + integrity sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg== + dependencies: + call-bind "^1.0.8" + define-properties "^1.2.1" + es-abstract "^1.23.5" + es-shim-unscopables "^1.0.2" + +array.prototype.tosorted@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz#fe954678ff53034e717ea3352a03f0b0b86f7ffc" + integrity sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.3" + es-errors "^1.3.0" + es-shim-unscopables "^1.0.2" + +arraybuffer.prototype.slice@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz#9d760d84dbdd06d0cbf92c8849615a1a7ab3183c" + integrity sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ== + dependencies: + array-buffer-byte-length "^1.0.1" + call-bind "^1.0.8" + define-properties "^1.2.1" + es-abstract "^1.23.5" + es-errors "^1.3.0" + get-intrinsic "^1.2.6" + is-array-buffer "^3.0.4" + +asap@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== + +async-function@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/async-function/-/async-function-1.0.0.tgz#509c9fca60eaf85034c6829838188e4e4c8ffb2b" + integrity sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA== + +async-limiter@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" + integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== + +available-typed-arrays@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" + integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== + dependencies: + possible-typed-array-names "^1.0.0" + +babel-jest@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.7.0.tgz#f4369919225b684c56085998ac63dbd05be020d5" + integrity sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg== + 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" + +babel-plugin-istanbul@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" + integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== + 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" + +babel-plugin-jest-hoist@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz#aadbe943464182a8922c3c927c3067ff40d24626" + integrity sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg== + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__core" "^7.1.14" + "@types/babel__traverse" "^7.0.6" + +babel-plugin-polyfill-corejs2@^0.4.14: + version "0.4.17" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.17.tgz#198f970f1c99a856b466d1187e88ce30bd199d91" + integrity sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w== + dependencies: + "@babel/compat-data" "^7.28.6" + "@babel/helper-define-polyfill-provider" "^0.6.8" + semver "^6.3.1" + +babel-plugin-polyfill-corejs3@^0.13.0: + version "0.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz#bb7f6aeef7addff17f7602a08a6d19a128c30164" + integrity sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.6.5" + core-js-compat "^3.43.0" + +babel-plugin-polyfill-regenerator@^0.6.5: + version "0.6.8" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.8.tgz#8a6bfd5dd54239362b3d06ce47ac52b2d95d7721" + integrity sha512-M762rNHfSF1EV3SLtnCJXFoQbbIIz0OyRwnCmV0KPC7qosSfCO0QLTSuJX3ayAebubhE6oYBAYPrBA5ljowaZg== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.6.8" + +babel-plugin-react-compiler@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/babel-plugin-react-compiler/-/babel-plugin-react-compiler-1.0.0.tgz#bdf7360a23a4d5ebfca090255da3893efd07425f" + integrity sha512-Ixm8tFfoKKIPYdCCKYTsqv+Fd4IJ0DQqMyEimo+pxUOMUR9cVPlwTrFt9Avu+3cb6Zp3mAzl+t1MrG2fxxKsxw== + dependencies: + "@babel/types" "^7.26.0" + +babel-plugin-react-native-web@~0.21.0: + version "0.21.2" + resolved "https://registry.yarnpkg.com/babel-plugin-react-native-web/-/babel-plugin-react-native-web-0.21.2.tgz#d2f7fd673278da82577aa583457edb55d9cccbe0" + integrity sha512-SPD0J6qjJn8231i0HZhlAGH6NORe+QvRSQM2mwQEzJ2Fb3E4ruWTiiicPlHjmeWShDXLcvoorOCXjeR7k/lyWA== + +babel-plugin-syntax-hermes-parser@0.29.1, babel-plugin-syntax-hermes-parser@^0.29.1: + version "0.29.1" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.29.1.tgz#09ca9ecb0330eba1ef939b6d3f1f55bb06a9dc33" + integrity sha512-2WFYnoWGdmih1I1J5eIqxATOeycOqRwYxAQBu3cUu/rhwInwHUg7k60AFNbuGjSDL8tje5GDrAnxzRLcu2pYcA== + dependencies: + hermes-parser "0.29.1" + +babel-plugin-transform-flow-enums@^0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-enums/-/babel-plugin-transform-flow-enums-0.0.2.tgz#d1d0cc9bdc799c850ca110d0ddc9f21b9ec3ef25" + integrity sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ== + dependencies: + "@babel/plugin-syntax-flow" "^7.12.1" + +babel-preset-current-node-syntax@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz#20730d6cdc7dda5d89401cab10ac6a32067acde6" + integrity sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg== + 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" + +babel-preset-expo@~54.0.12: + version "54.0.12" + resolved "https://registry.yarnpkg.com/babel-preset-expo/-/babel-preset-expo-54.0.12.tgz#02d0333b80e6d9567166d1bdbf0819e46dc3458c" + integrity sha512-6xeSkdaixmQhWSYL7tfLu0pOS0BY+8ftwmdNSHtpEFSizrXYZkCjk/B6Dxr+6nwNRihixMcS0aBlWS1wlDl3pw== + 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" + +babel-preset-jest@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz#fa05fa510e7d493896d7b0dd2033601c840f171c" + integrity sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA== + dependencies: + babel-plugin-jest-hoist "^29.6.3" + babel-preset-current-node-syntax "^1.0.0" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +balanced-match@^4.0.2: + version "4.0.4" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-4.0.4.tgz#bfb10662feed8196a2c62e7c68e17720c274179a" + integrity sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA== + +base64-js@1.5.1, base64-js@^1.2.3, base64-js@^1.3.1, base64-js@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +baseline-browser-mapping@^2.10.44: + version "2.11.4" + resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.11.4.tgz#3da1a877a8be2ec06495123ce994b43af58cc55e" + integrity sha512-s4+sLr9mZ/CyqeRritFeYV/Zx73OAtmaHn6kkBS1XRoJn1hrg3xIDUcpicAEX68tkcIN0iBCgti31C8zxtkhsQ== + +better-opn@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/better-opn/-/better-opn-3.0.2.tgz#f96f35deaaf8f34144a4102651babcf00d1d8817" + integrity sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ== + dependencies: + open "^8.0.4" + +big-integer@1.6.x: + version "1.6.52" + resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.52.tgz#60a887f3047614a8e1bffe5d7173490a97dc8c85" + integrity sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg== + +bplist-creator@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/bplist-creator/-/bplist-creator-0.1.0.tgz#018a2d1b587f769e379ef5519103730f8963ba1e" + integrity sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg== + dependencies: + stream-buffers "2.2.x" + +bplist-parser@0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/bplist-parser/-/bplist-parser-0.3.1.tgz#e1c90b2ca2a9f9474cc72f6862bbf3fee8341fd1" + integrity sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA== + dependencies: + big-integer "1.6.x" + +bplist-parser@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/bplist-parser/-/bplist-parser-0.3.2.tgz#3ac79d67ec52c4c107893e0237eb787cbacbced7" + integrity sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ== + dependencies: + big-integer "1.6.x" + +brace-expansion@^1.1.7: + version "1.1.16" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.16.tgz#723d3a30c0558c225abc9fc479a73e14e26c3c2f" + integrity sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.1.2.tgz#0bba2271feb7d458b0d31ad13625aaa4754431e2" + integrity sha512-w5JZcKgdhDOgOwm8H+KgbosopHMuGcl6qbulwjtz3SM7I7P3yW1eAjzMPLrIE+NQ9vjgANKHWeMHnrT0OXW1oA== + dependencies: + balanced-match "^1.0.0" + +brace-expansion@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-5.0.8.tgz#135ad0d8d808eb18eb5e0ec9a21f3a0b92ef18cf" + integrity sha512-JZyDyq3D4AUifKTPOB7DELf6XsB3WdPuNxCtob1vFXPsSXhdAiHBWJ/tJ8HAc9aH84BK+5JFZLNkJKx3G9kzQg== + dependencies: + balanced-match "^4.0.2" + +braces@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== + dependencies: + fill-range "^7.1.1" + +browserslist@^4.24.0, browserslist@^4.25.0, browserslist@^4.28.1: + version "4.28.7" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.28.7.tgz#409046517fccd2e51cdc20f077454b7141184028" + integrity sha512-JxV13hNrFxqjOc8alRbq9dK1MM79NEXYpma2B2J4wAtpWS5zIEIKqWPGCl7N4o7Uc7B7itylh7SuDujATRyyTw== + dependencies: + baseline-browser-mapping "^2.10.44" + caniuse-lite "^1.0.30001806" + electron-to-chromium "^1.5.393" + node-releases "^2.0.51" + update-browserslist-db "^1.2.3" + +bser@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== + dependencies: + node-int64 "^0.4.0" + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +buffer@^5.4.3: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" + integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + +call-bind@^1.0.7, call-bind@^1.0.8, call-bind@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.9.tgz#39a644700c80bc7d0ca9102fc6d1d43b2fd7eee7" + integrity sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ== + 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" + +call-bound@^1.0.2, call-bound@^1.0.3, call-bound@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.4.tgz#238de935d2a2a692928c538c7ccfa91067fd062a" + integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== + dependencies: + call-bind-apply-helpers "^1.0.2" + get-intrinsic "^1.3.0" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +camelcase@^6.2.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +caniuse-lite@^1.0.30001806: + version "1.0.30001806" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001806.tgz#1bc8e502b723fa393455dfbedd5ccec0c29bb74e" + integrity sha512-72Cuvd95zbSYPKq6Fhg8eDJRlzgWDf7/mtoZv6Qe/DYNCEBdNxoA3+rZAU2ZhGCpZlns3EssFavaZomckT5Uuw== + +chalk@^2.0.1, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chownr@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-3.0.0.tgz#9855e64ecd240a9cc4267ce8a4aa5d24a1da15e4" + integrity sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g== + +chrome-launcher@^0.15.2: + version "0.15.2" + resolved "https://registry.yarnpkg.com/chrome-launcher/-/chrome-launcher-0.15.2.tgz#4e6404e32200095fdce7f6a1e1004f9bd36fa5da" + integrity sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ== + dependencies: + "@types/node" "*" + escape-string-regexp "^4.0.0" + is-wsl "^2.2.0" + lighthouse-logger "^1.0.0" + +chromium-edge-launcher@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/chromium-edge-launcher/-/chromium-edge-launcher-0.2.0.tgz#0c378f28c99aefc360705fa155de0113997f62fc" + integrity sha512-JfJjUnq25y9yg4FABRRVPmBGWPZZi+AQXT4mxupb67766/0UlhG8PAZCz6xzEMXTbW3CsSoE8PcCWA49n35mKg== + 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" + +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + +ci-info@^3.2.0, ci-info@^3.3.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" + integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== + +cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + integrity sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw== + dependencies: + restore-cursor "^2.0.0" + +cli-spinners@^2.0.0: + version "2.9.2" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.2.tgz#1773a8f4b9c4d6ac31563df53b3fc1d79462fe41" + integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== + +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +commander@^12.0.0: + version "12.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-12.1.0.tgz#01423b36f501259fdaac4d0e4d60c96c991585d3" + integrity sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA== + +commander@^2.20.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" + integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== + +commander@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + +compressible@~2.0.18: + version "2.0.18" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== + dependencies: + mime-db ">= 1.43.0 < 2" + +compression@^1.7.4: + version "1.8.1" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.8.1.tgz#4a45d909ac16509195a9a28bd91094889c180d79" + integrity sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w== + 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" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +connect@^3.6.5, connect@^3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/connect/-/connect-3.7.0.tgz#5d49348910caa5e07a01800b030d0c35f20484f8" + integrity sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ== + dependencies: + debug "2.6.9" + finalhandler "1.1.2" + parseurl "~1.3.3" + utils-merge "1.0.1" + +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + +core-js-compat@^3.43.0: + version "3.49.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.49.0.tgz#06145447d92f4aaf258a0c44f24b47afaeaffef6" + integrity sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA== + dependencies: + browserslist "^4.28.1" + +cross-spawn@^7.0.2, cross-spawn@^7.0.6: + version "7.0.6" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" + integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +csstype@^3.0.2: + version "3.2.3" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.2.3.tgz#ec48c0f3e993e50648c86da559e2610995cf989a" + integrity sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ== + +data-view-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.2.tgz#211a03ba95ecaf7798a8c7198d79536211f88570" + integrity sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ== + dependencies: + call-bound "^1.0.3" + es-errors "^1.3.0" + is-data-view "^1.0.2" + +data-view-byte-length@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz#9e80f7ca52453ce3e93d25a35318767ea7704735" + integrity sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ== + dependencies: + call-bound "^1.0.3" + es-errors "^1.3.0" + is-data-view "^1.0.2" + +data-view-byte-offset@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz#068307f9b71ab76dbbe10291389e020856606191" + integrity sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +debug@2.6.9, debug@^2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@4, debug@^4.1.0, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.5, debug@^4.4.0, debug@^4.4.3: + version "4.4.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a" + integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== + dependencies: + ms "^2.1.3" + +debug@4.3.4: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +debug@^3.1.0, debug@^3.2.7: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +deepmerge@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== + +defaults@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a" + integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== + dependencies: + clone "^1.0.2" + +define-data-property@^1.0.1, define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + gopd "^1.0.1" + +define-lazy-prop@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" + integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== + +define-properties@^1.1.3, define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +depd@2.0.0, depd@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + +detect-libc@^2.0.3: + version "2.1.2" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.1.2.tgz#689c5dcdc1900ef5583a4cb9f6d7b473742074ad" + integrity sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ== + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +dotenv-expand@~11.0.6: + version "11.0.7" + resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-11.0.7.tgz#af695aea007d6fdc84c86cd8d0ad7beb40a0bd08" + integrity sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA== + dependencies: + dotenv "^16.4.5" + +dotenv@^16.4.5: + version "16.6.1" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.6.1.tgz#773f0e69527a8315c7285d5ee73c4459d20a8020" + integrity sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow== + +dotenv@~16.4.5: + version "16.4.7" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.7.tgz#0e20c5b82950140aa99be360a8a5f52335f53c26" + integrity sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ== + +dunder-proto@^1.0.0, dunder-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" + integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== + dependencies: + call-bind-apply-helpers "^1.0.1" + es-errors "^1.3.0" + gopd "^1.2.0" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + +electron-to-chromium@^1.5.393: + version "1.5.396" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.396.tgz#4aa96428486c8d1c9c8aeb205b2d6e04928ca046" + integrity sha512-yHiw2Y3C3H9U6TMbOfoWK/BPreiOPXRfTWPBwQBoZG6/8TB6eOPnsy5oaRYuatR7Fw2SJ4kKforgufeo7fq0EQ== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + +encodeurl@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" + integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== + +env-editor@^0.4.1: + version "0.4.2" + resolved "https://registry.yarnpkg.com/env-editor/-/env-editor-0.4.2.tgz#4e76568d0bd8f5c2b6d314a9412c8fe9aa3ae861" + integrity sha512-ObFo8v4rQJAE59M69QzwloxPZtd33TpYEIjtKD1rrFDcM1Gd7IkDxEBU+HriziN6HSHQnBJi8Dmy+JWkav5HKA== + +error-stack-parser@^2.0.6: + version "2.1.4" + resolved "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-2.1.4.tgz#229cb01cdbfa84440bfa91876285b94680188286" + integrity sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ== + dependencies: + stackframe "^1.3.4" + +es-abstract-get@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-abstract-get/-/es-abstract-get-1.0.0.tgz#1eae87101f42bedeb6a740e8c5051271aef89088" + integrity sha512-6PMWXpdhshVvFp+FoWYs1EvG1Nj0tvk0dZM+XcK0xMEM1czRVcP6ohqPWHy6qPagSpC8j4+p89WXlT+xXJs/fg== + dependencies: + es-errors "^1.3.0" + es-object-atoms "^1.1.2" + is-callable "^1.2.7" + object-inspect "^1.13.4" + +es-abstract@^1.17.5, es-abstract@^1.23.2, es-abstract@^1.23.3, es-abstract@^1.23.5, es-abstract@^1.23.6, es-abstract@^1.23.9, es-abstract@^1.24.0, es-abstract@^1.24.2: + version "1.24.2" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.24.2.tgz#2dbd38c180735ee983f77585140a2706a963ed9a" + integrity sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg== + dependencies: + array-buffer-byte-length "^1.0.2" + arraybuffer.prototype.slice "^1.0.4" + available-typed-arrays "^1.0.7" + call-bind "^1.0.8" + call-bound "^1.0.4" + data-view-buffer "^1.0.2" + data-view-byte-length "^1.0.2" + data-view-byte-offset "^1.0.1" + es-define-property "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.1.1" + es-set-tostringtag "^2.1.0" + es-to-primitive "^1.3.0" + function.prototype.name "^1.1.8" + get-intrinsic "^1.3.0" + get-proto "^1.0.1" + get-symbol-description "^1.1.0" + globalthis "^1.0.4" + gopd "^1.2.0" + has-property-descriptors "^1.0.2" + has-proto "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" + internal-slot "^1.1.0" + is-array-buffer "^3.0.5" + is-callable "^1.2.7" + is-data-view "^1.0.2" + is-negative-zero "^2.0.3" + is-regex "^1.2.1" + is-set "^2.0.3" + is-shared-array-buffer "^1.0.4" + is-string "^1.1.1" + is-typed-array "^1.1.15" + is-weakref "^1.1.1" + math-intrinsics "^1.1.0" + object-inspect "^1.13.4" + object-keys "^1.1.1" + object.assign "^4.1.7" + own-keys "^1.0.1" + regexp.prototype.flags "^1.5.4" + safe-array-concat "^1.1.3" + safe-push-apply "^1.0.0" + safe-regex-test "^1.1.0" + set-proto "^1.0.0" + stop-iteration-iterator "^1.1.0" + string.prototype.trim "^1.2.10" + string.prototype.trimend "^1.0.9" + string.prototype.trimstart "^1.0.8" + typed-array-buffer "^1.0.3" + typed-array-byte-length "^1.0.3" + typed-array-byte-offset "^1.0.4" + typed-array-length "^1.0.7" + unbox-primitive "^1.1.0" + which-typed-array "^1.1.19" + +es-define-property@^1.0.0, es-define-property@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" + integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== + +es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es-iterator-helpers@^1.2.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.4.0.tgz#2b4635ee3e8db2285378a47a1ea8f8dd34adb653" + integrity sha512-c/A0P0oxkACDc+cKWw8evLXK83oBKgn0qPOqCYT4x9uolpCIJAcYvJC9QYKNDRPsTeGyCrQ326jrvgZWdCdK5Q== + dependencies: + call-bind "^1.0.9" + call-bound "^1.0.4" + define-properties "^1.2.1" + es-abstract "^1.24.2" + es-errors "^1.3.0" + es-set-tostringtag "^2.1.0" + function-bind "^1.1.2" + get-intrinsic "^1.3.0" + globalthis "^1.0.4" + gopd "^1.2.0" + has-property-descriptors "^1.0.2" + has-proto "^1.2.0" + has-symbols "^1.1.0" + internal-slot "^1.1.0" + iterator.prototype "^1.1.5" + math-intrinsics "^1.1.0" + +es-object-atoms@^1.0.0, es-object-atoms@^1.1.1, es-object-atoms@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.2.tgz#a2d0b373205724dfa525d23b0c3e1b1ca582c99b" + integrity sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw== + dependencies: + es-errors "^1.3.0" + +es-set-tostringtag@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz#f31dbbe0c183b00a6d26eb6325c810c0fd18bd4d" + integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA== + dependencies: + es-errors "^1.3.0" + get-intrinsic "^1.2.6" + has-tostringtag "^1.0.2" + hasown "^2.0.2" + +es-shim-unscopables@^1.0.2, es-shim-unscopables@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz#438df35520dac5d105f3943d927549ea3b00f4b5" + integrity sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw== + dependencies: + hasown "^2.0.2" + +es-to-primitive@^1.3.0: + version "1.3.4" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.3.4.tgz#0c854291cf0d7b439d6b9e5771ea837ffaf1f991" + integrity sha512-yPDz7wqpg1/mmHLmS3tcfTfbw5f1eryXvyghYBffGdERwe+mV7ZcWzTR8LR17Kvqt3qfPurjlonmnq3MKXIOXw== + dependencies: + es-abstract-get "^1.0.0" + es-define-property "^1.0.1" + es-errors "^1.3.0" + is-callable "^1.2.7" + is-date-object "^1.1.0" + is-symbol "^1.1.1" + +escalade@^3.1.1, escalade@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-config-expo@~8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/eslint-config-expo/-/eslint-config-expo-8.0.1.tgz#a68488f47fc38e7aa0e352f08afe5da6068addf6" + integrity sha512-r9PSgkuZk5Q5ALbk1yowYwEIj0oqO/ikRO9TNhpx2DzSOdK65y3urgFI04WYvQzMr9q1fnA62wr9iGfrsmF5pQ== + dependencies: + "@typescript-eslint/eslint-plugin" "^8.9.0" + "@typescript-eslint/parser" "^8.9.0" + eslint-import-resolver-typescript "^3.6.3" + eslint-plugin-expo "^0.1.0" + eslint-plugin-import "^2.30.0" + eslint-plugin-react "^7.36.1" + eslint-plugin-react-hooks "^4.6.2" + +eslint-import-resolver-node@^0.3.9: + version "0.3.10" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.10.tgz#84ce3005abfc300588cf23bbac1aabec1fc6e8c1" + integrity sha512-tRrKqFyCaKict5hOd244sL6EQFNycnMQnBe+j8uqGNXYzsImGbGUU4ibtoaBmv5FLwJwcFJNeg1GeVjQfbMrDQ== + dependencies: + debug "^3.2.7" + is-core-module "^2.16.1" + resolve "^2.0.0-next.6" + +eslint-import-resolver-typescript@^3.6.3: + version "3.10.1" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.10.1.tgz#23dac32efa86a88e2b8232eb244ac499ad636db2" + integrity sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ== + dependencies: + "@nolyfill/is-core-module" "1.0.39" + debug "^4.4.0" + get-tsconfig "^4.10.0" + is-bun-module "^2.0.0" + stable-hash "^0.0.5" + tinyglobby "^0.2.13" + unrs-resolver "^1.6.2" + +eslint-module-utils@^2.12.1: + version "2.14.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.14.0.tgz#611f8e1c6ceb29a93eb949e1cc670b8287764819" + integrity sha512-W2WCRZ9Dqntd+2u8jJcVMV2PKulc6RdLgUUoh/yQr3uB6lo/ZOeGx11sv60/8S4QFFKNslAlWhr9u0Ef7ZW6Ig== + dependencies: + debug "^3.2.7" + +eslint-plugin-expo@^0.1.0: + version "0.1.4" + resolved "https://registry.yarnpkg.com/eslint-plugin-expo/-/eslint-plugin-expo-0.1.4.tgz#fbeb5f126028b5fad6d977ac5128d774bd8a8144" + integrity sha512-YA7yiMacQbLJySuyJA0Eb5V65obqp6fVOWtw1JdYDRWC5MeToPrnNvhGDpk01Bv3Vm4ownuzUfvi89MXi1d6cg== + dependencies: + "@typescript-eslint/types" "^8.29.1" + "@typescript-eslint/utils" "^8.29.1" + eslint "^9.24.0" + +eslint-plugin-import@^2.30.0: + version "2.32.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz#602b55faa6e4caeaa5e970c198b5c00a37708980" + integrity sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA== + dependencies: + "@rtsao/scc" "^1.1.0" + array-includes "^3.1.9" + array.prototype.findlastindex "^1.2.6" + array.prototype.flat "^1.3.3" + array.prototype.flatmap "^1.3.3" + debug "^3.2.7" + doctrine "^2.1.0" + eslint-import-resolver-node "^0.3.9" + eslint-module-utils "^2.12.1" + hasown "^2.0.2" + is-core-module "^2.16.1" + is-glob "^4.0.3" + minimatch "^3.1.2" + object.fromentries "^2.0.8" + object.groupby "^1.0.3" + object.values "^1.2.1" + semver "^6.3.1" + string.prototype.trimend "^1.0.9" + tsconfig-paths "^3.15.0" + +eslint-plugin-react-hooks@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz#c829eb06c0e6f484b3fbb85a97e57784f328c596" + integrity sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ== + +eslint-plugin-react@^7.36.1: + version "7.37.5" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz#2975511472bdda1b272b34d779335c9b0e877065" + integrity sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA== + dependencies: + array-includes "^3.1.8" + array.prototype.findlast "^1.2.5" + array.prototype.flatmap "^1.3.3" + array.prototype.tosorted "^1.1.4" + doctrine "^2.1.0" + es-iterator-helpers "^1.2.1" + estraverse "^5.3.0" + hasown "^2.0.2" + jsx-ast-utils "^2.4.1 || ^3.0.0" + minimatch "^3.1.2" + object.entries "^1.1.9" + object.fromentries "^2.0.8" + object.values "^1.2.1" + prop-types "^15.8.1" + resolve "^2.0.0-next.5" + semver "^6.3.1" + string.prototype.matchall "^4.0.12" + string.prototype.repeat "^1.0.0" + +eslint-scope@^7.2.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" + integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-scope@^8.4.0: + version "8.4.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.4.0.tgz#88e646a207fad61436ffa39eb505147200655c82" + integrity sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + +eslint-visitor-keys@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz#4cfea60fe7dd0ad8e816e1ed026c1d5251b512c1" + integrity sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ== + +eslint-visitor-keys@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz#9e3c9489697824d2d4ce3a8ad12628f91e9f59be" + integrity sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA== + +eslint@^8.57.1: + version "8.57.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.1.tgz#7df109654aba7e3bbe5c8eae533c5e461d3c6ca9" + integrity sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.6.1" + "@eslint/eslintrc" "^2.1.4" + "@eslint/js" "8.57.1" + "@humanwhocodes/config-array" "^0.13.0" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" + "@ungap/structured-clone" "^1.2.0" + ajv "^6.12.4" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.2.2" + eslint-visitor-keys "^3.4.3" + espree "^9.6.1" + esquery "^1.4.2" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + glob-parent "^6.0.2" + globals "^13.19.0" + graphemer "^1.4.0" + ignore "^5.2.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + is-path-inside "^3.0.3" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.3" + strip-ansi "^6.0.1" + text-table "^0.2.0" + +eslint@^9.24.0: + version "9.39.5" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.39.5.tgz#2a4e3c8b0f753196efae943c8ffaa8730fc6a3fa" + integrity sha512-DgZS62aPLXKlnxILS/AYCoRvHaZeXceIzlXPkkGGzJWSow1aEk0lbTlxUSlyjC8jcaKxAdOnTDz+o1JFSBsyjw== + dependencies: + "@eslint-community/eslint-utils" "^4.8.0" + "@eslint-community/regexpp" "^4.12.1" + "@eslint/config-array" "^0.21.2" + "@eslint/config-helpers" "^0.4.2" + "@eslint/core" "^0.17.0" + "@eslint/eslintrc" "^3.3.6" + "@eslint/js" "9.39.5" + "@eslint/plugin-kit" "^0.4.1" + "@humanfs/node" "^0.16.6" + "@humanwhocodes/module-importer" "^1.0.1" + "@humanwhocodes/retry" "^0.4.2" + "@types/estree" "^1.0.6" + ajv "^6.14.0" + chalk "^4.0.0" + cross-spawn "^7.0.6" + debug "^4.3.2" + escape-string-regexp "^4.0.0" + eslint-scope "^8.4.0" + eslint-visitor-keys "^4.2.1" + espree "^10.4.0" + esquery "^1.5.0" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^8.0.0" + find-up "^5.0.0" + glob-parent "^6.0.2" + ignore "^5.2.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + json-stable-stringify-without-jsonify "^1.0.1" + lodash.merge "^4.6.2" + minimatch "^3.1.5" + natural-compare "^1.4.0" + optionator "^0.9.3" + +espree@^10.0.1, espree@^10.4.0: + version "10.4.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-10.4.0.tgz#d54f4949d4629005a1fa168d937c3ff1f7e2a837" + integrity sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ== + dependencies: + acorn "^8.15.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^4.2.1" + +espree@^9.6.0, espree@^9.6.1: + version "9.6.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" + integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== + dependencies: + acorn "^8.9.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.4.1" + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.4.2, esquery@^1.5.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.7.0.tgz#08d048f261f0ddedb5bae95f46809463d9c9496d" + integrity sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + +event-target-shim@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" + integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== + +events@3.3.0, events@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +expo-asset@~12.0.13: + version "12.0.13" + resolved "https://registry.yarnpkg.com/expo-asset/-/expo-asset-12.0.13.tgz#1974ed7abee2ad987a519dbdcbf7f0c647dddf5b" + integrity sha512-x/p7WvQUnkn6K43b9eL6SPeq5Vnf1E8BDe9bDrWrvMqzyUvJnUFvl+ctg3034s/+UHe7Ne2pAmc0+yzbl8CrDQ== + dependencies: + "@expo/image-utils" "^0.8.8" + expo-constants "~18.0.13" + +expo-constants@~18.0.13: + version "18.0.13" + resolved "https://registry.yarnpkg.com/expo-constants/-/expo-constants-18.0.13.tgz#0117f1f3d43be7b645192c0f4f431fb4efc4803d" + integrity sha512-FnZn12E1dRYKDHlAdIyNFhBurKTS3F9CrfrBDJI5m3D7U17KBHMQ6JEfYlSj7LG7t+Ulr+IKaj58L1k5gBwTcQ== + dependencies: + "@expo/config" "~12.0.13" + "@expo/env" "~2.0.8" + +expo-file-system@~19.0.23: + version "19.0.23" + resolved "https://registry.yarnpkg.com/expo-file-system/-/expo-file-system-19.0.23.tgz#ad2c88ed039ba0fd5a739338818f42304171eddd" + integrity sha512-MeGkid9OeNILfT/qonaXHp4f2c15xaB28U/bcN7pqZej0Kx0+6+V7e9ZIXpPHm07zVatxA+QkMTPQEGfmvVOxA== + +expo-font@~14.0.12: + version "14.0.12" + resolved "https://registry.yarnpkg.com/expo-font/-/expo-font-14.0.12.tgz#ff8b176b3fee241e2ae5d3e2eabf3c783460b956" + integrity sha512-QQzunE2Mxk45AsCWm3tK7OpVljbtVnKD58q4/qliev+cbye1IOduUnRIdD+P7DyButw17G9MTX795kgaQiz5hQ== + dependencies: + fontfaceobserver "^2.1.0" + +expo-keep-awake@~15.0.8: + version "15.0.8" + resolved "https://registry.yarnpkg.com/expo-keep-awake/-/expo-keep-awake-15.0.8.tgz#911c5effeba9baff2ccde79ef0ff5bf856215f8d" + integrity sha512-YK9M1VrnoH1vLJiQzChZgzDvVimVoriibiDIFLbQMpjYBnvyfUeHJcin/Gx1a+XgupNXy92EQJLgI/9ZuXajYQ== + +expo-modules-autolinking@3.0.26: + version "3.0.26" + resolved "https://registry.yarnpkg.com/expo-modules-autolinking/-/expo-modules-autolinking-3.0.26.tgz#bfbb0d0422e32d3fe8d201c9a287cc82279ada71" + integrity sha512-WOaud6UKg16ciCOj8raKcMOoKFMHLXKI29U29yhgu1lf+Y7VxJyCktUcYo6AM+ccZ7zLD1uWZdMtgnpf+95OXA== + 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" + +expo-modules-core@3.0.30: + version "3.0.30" + resolved "https://registry.yarnpkg.com/expo-modules-core/-/expo-modules-core-3.0.30.tgz#ec4e216a33083afb0ddf314615d6d31a741984d6" + integrity sha512-a6IrpAn/Jbmwxi9L+hMmXKpNqnkUpoF7WHOpn02rVLyax2J0gB1vvCVE5rNydplEnt41Q6WxQwvcOjZaIkcSUg== + dependencies: + invariant "^2.2.4" + +expo-server@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/expo-server/-/expo-server-1.0.7.tgz#fe700518f73651cb0736e79e3a4f2f8b2e2671b7" + integrity sha512-mcmyML3oXcqFUXUxtdtCL1O00ztNI2v76d+MdniXRUgHNxIcHZ05zo+DqBaOOT6LQnPk4vA4YHqQl7iGUfRb3g== + +expo-splash-screen@~31.0.13: + version "31.0.13" + resolved "https://registry.yarnpkg.com/expo-splash-screen/-/expo-splash-screen-31.0.13.tgz#f41f1a4c8bb1ae7fcc52b760e7dd485d7ddec642" + integrity sha512-1epJLC1cDlwwj089R2h8cxaU5uk4ONVAC+vzGiTZH4YARQhL4Stlz1MbR6yAS173GMosvkE6CAeihR7oIbCkDA== + dependencies: + "@expo/prebuild-config" "^54.0.8" + +expo-status-bar@~3.0.9: + version "3.0.9" + resolved "https://registry.yarnpkg.com/expo-status-bar/-/expo-status-bar-3.0.9.tgz#87cfc803fa614f09a985b8e75e3dd7abd51ce2cb" + integrity sha512-xyYyVg6V1/SSOZWh4Ni3U129XHCnFHBTcUo0dhWtFDrZbNp/duw5AGsQfb2sVeU0gxWHXSY1+5F0jnKYC7WuOw== + dependencies: + react-native-is-edge-to-edge "^1.2.1" + +expo@~54.0.30: + version "54.0.36" + resolved "https://registry.yarnpkg.com/expo/-/expo-54.0.36.tgz#a749612b8ef4621f8f25daa8a116ef1a8f92c4db" + integrity sha512-HMHp1H+actmnX85NJE6lILKzSJV6pTDNkwghq9EMOP3zTynjvBYVqJGSLlm6sEVzJCC5Z2ZiKgLvtsHrqlY0dg== + dependencies: + "@babel/runtime" "^7.20.0" + "@expo/cli" "54.0.26" + "@expo/config" "~12.0.14" + "@expo/config-plugins" "~54.0.5" + "@expo/devtools" "0.1.8" + "@expo/fingerprint" "0.15.5" + "@expo/metro" "~54.2.0" + "@expo/metro-config" "54.0.17" + "@expo/vector-icons" "^15.0.3" + "@ungap/structured-clone" "^1.3.0" + babel-preset-expo "~54.0.12" + expo-asset "~12.0.13" + expo-constants "~18.0.13" + expo-file-system "~19.0.23" + expo-font "~14.0.12" + expo-keep-awake "~15.0.8" + expo-modules-autolinking "3.0.26" + expo-modules-core "3.0.30" + pretty-format "^29.7.0" + react-refresh "^0.14.2" + whatwg-url-without-unicode "8.0.0-3" + +exponential-backoff@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/exponential-backoff/-/exponential-backoff-3.1.3.tgz#51cf92c1c0493c766053f9d3abee4434c244d2f6" + integrity sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA== + +fast-base64-decode@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fast-base64-decode/-/fast-base64-decode-1.0.0.tgz#b434a0dd7d92b12b43f26819300d2dafb83ee418" + integrity sha512-qwaScUgUGBYeDNRnbc/KyllVU88Jk1pRHPStuF/lO7B0/RTRLj7U0lkdTAutlBblY08rwZDff6tNU9cjv6j//Q== + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fast-text-encoding@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/fast-text-encoding/-/fast-text-encoding-1.0.6.tgz#0aa25f7f638222e3396d72bf936afcf1d42d6867" + integrity sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w== + +fastq@^1.6.0: + version "1.20.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.20.1.tgz#ca750a10dc925bc8b18839fd203e3ef4b3ced675" + integrity sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw== + dependencies: + reusify "^1.0.4" + +fb-watchman@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" + integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== + dependencies: + bser "2.1.1" + +fdir@^6.5.0: + version "6.5.0" + resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.5.0.tgz#ed2ab967a331ade62f18d077dae192684d50d350" + integrity sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg== + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +file-entry-cache@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f" + integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== + dependencies: + flat-cache "^4.0.0" + +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" + integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== + 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" + +find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat-cache@^3.0.4: + version "3.2.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" + integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== + dependencies: + flatted "^3.2.9" + keyv "^4.5.3" + rimraf "^3.0.2" + +flat-cache@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-4.0.1.tgz#0ece39fcb14ee012f4b0410bd33dd9c1f011127c" + integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== + dependencies: + flatted "^3.2.9" + keyv "^4.5.4" + +flatted@^3.2.9: + version "3.4.3" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.4.3.tgz#be5c21e943b2d7a328bb23795ae28c98f0103a9e" + integrity sha512-/zipXxyO6rGvuNGDiULY9MvEGSkb2gaG4GGH4ygMi0ZZzyMHdUZBmntJmx5x1G2VuPytCwGN4xsJP6cw+sK+vQ== + +flow-enums-runtime@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/flow-enums-runtime/-/flow-enums-runtime-0.0.6.tgz#5bb0cd1b0a3e471330f4d109039b7eba5cb3e787" + integrity sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw== + +fontfaceobserver@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/fontfaceobserver/-/fontfaceobserver-2.3.0.tgz#5fb392116e75d5024b7ec8e4f2ce92106d1488c8" + integrity sha512-6FPvD/IVyT4ZlNe7Wcn5Fb/4ChigpucKYSvD6a+0iMoLn2inpo711eyIcKjmDtE5XNcgAkSH9uN/nfAeZzHEfg== + +for-each@^0.3.3, for-each@^0.3.5: + version "0.3.5" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.5.tgz#d650688027826920feeb0af747ee7b9421a41d47" + integrity sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg== + dependencies: + is-callable "^1.2.7" + +freeport-async@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/freeport-async/-/freeport-async-2.0.0.tgz#6adf2ec0c629d11abff92836acd04b399135bab4" + integrity sha512-K7od3Uw45AJg00XUmy15+Hae2hOcgKcmN3/EF6Y7i01O0gaqiRx8sUSpsb9+BRNL8RPBrhzPsVfy8q9ADlJuWQ== + +fresh@~0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@^2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +function.prototype.name@^1.1.6, function.prototype.name@^1.1.8: + version "1.2.0" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.2.0.tgz#758f3e84fa542672454bd5e14cb081a5ce07f70c" + integrity sha512-jObKIik1P2QjPHP5nz5BaOtUlfgS0fWo8IUByNXkM+o+02sJOi94em77GwJKQSJ3gfPHdgzLNrHc1uokV4P/ew== + dependencies: + call-bind "^1.0.9" + call-bound "^1.0.4" + es-define-property "^1.0.1" + es-errors "^1.3.0" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.2" + hasown "^2.0.4" + is-callable "^1.2.7" + is-document.all "^1.0.0" + +functions-have-names@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + +generator-function@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/generator-function/-/generator-function-2.0.1.tgz#0e75dd410d1243687a0ba2e951b94eedb8f737a2" + integrity sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g== + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.2.6, get-intrinsic@^1.2.7, get-intrinsic@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" + integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== + 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" + +get-package-type@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== + +get-proto@^1.0.0, get-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" + integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== + dependencies: + dunder-proto "^1.0.1" + es-object-atoms "^1.0.0" + +get-symbol-description@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.1.0.tgz#7bdd54e0befe8ffc9f3b4e203220d9f1e881b6ee" + integrity sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg== + dependencies: + call-bound "^1.0.3" + es-errors "^1.3.0" + get-intrinsic "^1.2.6" + +get-tsconfig@^4.10.0: + version "4.14.0" + resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.14.0.tgz#985d85c52a9903864280ccc2448d413fbf1efed8" + integrity sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA== + dependencies: + resolve-pkg-maps "^1.0.0" + +getenv@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/getenv/-/getenv-2.0.0.tgz#b1698c7b0f29588f4577d06c42c73a5b475c69e0" + integrity sha512-VilgtJj/ALgGY77fiLam5iD336eSWi96Q15JSAG1zi8NRBysm3LXKdGnHb4m5cuyxvOLQQKWpBZAT6ni4FI2iQ== + +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob@^13.0.0: + version "13.0.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-13.0.6.tgz#078666566a425147ccacfbd2e332deb66a2be71d" + integrity sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw== + dependencies: + minimatch "^10.2.2" + minipass "^7.1.3" + path-scurry "^2.0.2" + +glob@^7.1.1, glob@^7.1.3, glob@^7.1.4: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + 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" + +globals@^13.19.0: + version "13.24.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" + integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== + dependencies: + type-fest "^0.20.2" + +globals@^14.0.0: + version "14.0.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e" + integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== + +globalthis@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" + integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== + dependencies: + define-properties "^1.2.1" + gopd "^1.0.1" + +gopd@^1.0.1, gopd@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" + integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== + +graceful-fs@^4.2.4, graceful-fs@^4.2.9: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + +has-bigints@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.1.0.tgz#28607e965ac967e03cd2a2c70a2636a1edad49fe" + integrity sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== + dependencies: + es-define-property "^1.0.0" + +has-proto@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.2.0.tgz#5de5a6eabd95fdffd9818b43055e8065e39fe9d5" + integrity sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ== + dependencies: + dunder-proto "^1.0.0" + +has-symbols@^1.0.3, has-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" + integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== + +has-tostringtag@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== + dependencies: + has-symbols "^1.0.3" + +hasown@^2.0.2, hasown@^2.0.3, hasown@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.4.tgz#8c62d8cb90beb2aad5d0a5b67581ad9854c3f003" + integrity sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A== + dependencies: + function-bind "^1.1.2" + +hermes-estree@0.29.1: + version "0.29.1" + resolved "https://registry.yarnpkg.com/hermes-estree/-/hermes-estree-0.29.1.tgz#043c7db076e0e8ef8c5f6ed23828d1ba463ebcc5" + integrity sha512-jl+x31n4/w+wEqm0I2r4CMimukLbLQEYpisys5oCre611CI5fc9TxhqkBBCJ1edDG4Kza0f7CgNz8xVMLZQOmQ== + +hermes-estree@0.32.0: + version "0.32.0" + resolved "https://registry.yarnpkg.com/hermes-estree/-/hermes-estree-0.32.0.tgz#bb7da6613ab8e67e334a1854ea1e209f487d307b" + integrity sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ== + +hermes-estree@0.35.0: + version "0.35.0" + resolved "https://registry.yarnpkg.com/hermes-estree/-/hermes-estree-0.35.0.tgz#767cce0b14a68b4bc06cd5db7efe889f6188c565" + integrity sha512-xVx5Opwy8Oo1I5yGpVRhCvWL/iV3M+ylksSKVNlxxD90cpDpR/AR1jLYqK8HWihm065a6UI3HeyAmYzwS8NOOg== + +hermes-parser@0.29.1, hermes-parser@^0.29.1: + version "0.29.1" + resolved "https://registry.yarnpkg.com/hermes-parser/-/hermes-parser-0.29.1.tgz#436b24bcd7bb1e71f92a04c396ccc0716c288d56" + integrity sha512-xBHWmUtRC5e/UL0tI7Ivt2riA/YBq9+SiYFU7C1oBa/j2jYGlIF9043oak1F47ihuDIxQ5nbsKueYJDRY02UgA== + dependencies: + hermes-estree "0.29.1" + +hermes-parser@0.32.0: + version "0.32.0" + resolved "https://registry.yarnpkg.com/hermes-parser/-/hermes-parser-0.32.0.tgz#7916984ef6fdce62e7415d354cf35392061cd303" + integrity sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw== + dependencies: + hermes-estree "0.32.0" + +hermes-parser@0.35.0: + version "0.35.0" + resolved "https://registry.yarnpkg.com/hermes-parser/-/hermes-parser-0.35.0.tgz#7625ec2f34ab897c2a17a7bea9788d136d5fd8c9" + integrity sha512-9JLjeHxBx8T4CAsydZR49PNZUaix+WpQJwu9p2010lu+7Kwl6D/7wYFFJxoz+aXkaaClp9Zfg6W6/zVlSJORaA== + dependencies: + hermes-estree "0.35.0" + +hosted-git-info@^7.0.0: + version "7.0.2" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-7.0.2.tgz#9b751acac097757667f30114607ef7b661ff4f17" + integrity sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w== + dependencies: + lru-cache "^10.0.1" + +http-errors@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.1.tgz#36d2f65bc909c8790018dd36fb4d93da6caae06b" + integrity sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ== + dependencies: + depd "~2.0.0" + inherits "~2.0.4" + setprototypeof "~1.2.0" + statuses "~2.0.2" + toidentifier "~1.0.1" + +https-proxy-agent@^7.0.5: + version "7.0.6" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz#da8dfeac7da130b05c2ba4b59c9b6cd66611a6b9" + integrity sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw== + dependencies: + agent-base "^7.1.2" + debug "4" + +idb@8.0.3: + version "8.0.3" + resolved "https://registry.yarnpkg.com/idb/-/idb-8.0.3.tgz#c91e558f15a8d53f1d7f53a094d226fc3ad71fd9" + integrity sha512-LtwtVyVYO5BqRvcsKuB2iUMnHwPVByPCXFXOpuU96IZPPoPN6xjOGxZQ74pgSVVLQWtUOYgyeL4GE98BY5D3wg== + +ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +ignore@^5.2.0, ignore@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" + integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== + +ignore@^7.0.5: + version "7.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-7.0.6.tgz#6a57aaef4c90df27ac3590875d29e8f11988c88e" + integrity sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw== + +image-size@^1.0.2: + version "1.2.1" + resolved "https://registry.yarnpkg.com/image-size/-/image-size-1.2.1.tgz#ee118aedfe666db1a6ee12bed5821cde3740276d" + integrity sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw== + dependencies: + queue "6.0.2" + +import-fresh@^3.2.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.1.tgz#9cecb56503c0ada1f2741dbbd6546e4b13b57ccf" + integrity sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@~2.0.3, inherits@~2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ini@~1.3.0: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +internal-slot@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.1.0.tgz#1eac91762947d2f7056bc838d93e13b2e9604961" + integrity sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw== + dependencies: + es-errors "^1.3.0" + hasown "^2.0.2" + side-channel "^1.1.0" + +invariant@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +is-array-buffer@^3.0.4, is-array-buffer@^3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.5.tgz#65742e1e687bd2cc666253068fd8707fe4d44280" + integrity sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + get-intrinsic "^1.2.6" + +is-async-function@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.1.1.tgz#3e69018c8e04e73b738793d020bfe884b9fd3523" + integrity sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ== + dependencies: + async-function "^1.0.0" + call-bound "^1.0.3" + get-proto "^1.0.1" + has-tostringtag "^1.0.2" + safe-regex-test "^1.1.0" + +is-bigint@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.1.0.tgz#dda7a3445df57a42583db4228682eba7c4170672" + integrity sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ== + dependencies: + has-bigints "^1.0.2" + +is-boolean-object@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.2.2.tgz#7067f47709809a393c71ff5bb3e135d8a9215d9e" + integrity sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A== + dependencies: + call-bound "^1.0.3" + has-tostringtag "^1.0.2" + +is-bun-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-bun-module/-/is-bun-module-2.0.0.tgz#4d7859a87c0fcac950c95e666730e745eae8bddd" + integrity sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ== + dependencies: + semver "^7.7.1" + +is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-core-module@^2.16.1, is-core-module@^2.16.2: + version "2.16.2" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.2.tgz#3e07450a8080ebce3fbf0cac494f4d2ab324e082" + integrity sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA== + dependencies: + hasown "^2.0.3" + +is-data-view@^1.0.1, is-data-view@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.2.tgz#bae0a41b9688986c2188dda6657e56b8f9e63b8e" + integrity sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw== + dependencies: + call-bound "^1.0.2" + get-intrinsic "^1.2.6" + is-typed-array "^1.1.13" + +is-date-object@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.1.0.tgz#ad85541996fc7aa8b2729701d27b7319f95d82f7" + integrity sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg== + dependencies: + call-bound "^1.0.2" + has-tostringtag "^1.0.2" + +is-docker@^2.0.0, is-docker@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + +is-document.all@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-document.all/-/is-document.all-1.0.0.tgz#163a4bfb362c6ed7b118ce46cdecc4e37dee3195" + integrity sha512-+XSoyS05OdBbhFuELhgTCpFNHkpBOJqtsZfUFFpe5QTw+9Sjbh8zitxhQkYAo6wV7e1Vb8cAPvpCk9jGam/82g== + dependencies: + call-bound "^1.0.4" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-finalizationregistry@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz#eefdcdc6c94ddd0674d9c85887bf93f944a97c90" + integrity sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg== + dependencies: + call-bound "^1.0.3" + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-generator-function@^1.0.10: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.1.2.tgz#ae3b61e3d5ea4e4839b90bad22b02335051a17d5" + integrity sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA== + 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" + +is-glob@^4.0.0, is-glob@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-map@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" + integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== + +is-negative-zero@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" + integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== + +is-number-object@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.1.1.tgz#144b21e95a1bc148205dcc2814a9134ec41b2541" + integrity sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw== + dependencies: + call-bound "^1.0.3" + has-tostringtag "^1.0.2" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-regex@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.2.1.tgz#76d70a3ed10ef9be48eb577887d74205bf0cad22" + integrity sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g== + dependencies: + call-bound "^1.0.2" + gopd "^1.2.0" + has-tostringtag "^1.0.2" + hasown "^2.0.2" + +is-set@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d" + integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== + +is-shared-array-buffer@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz#9b67844bd9b7f246ba0708c3a93e34269c774f6f" + integrity sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A== + dependencies: + call-bound "^1.0.3" + +is-string@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.1.1.tgz#92ea3f3d5c5b6e039ca8677e5ac8d07ea773cbb9" + integrity sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA== + dependencies: + call-bound "^1.0.3" + has-tostringtag "^1.0.2" + +is-symbol@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.1.1.tgz#f47761279f532e2b05a7024a7506dbbedacd0634" + integrity sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w== + dependencies: + call-bound "^1.0.2" + has-symbols "^1.1.0" + safe-regex-test "^1.1.0" + +is-typed-array@^1.1.13, is-typed-array@^1.1.14, is-typed-array@^1.1.15: + version "1.1.15" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.15.tgz#4bfb4a45b61cee83a5a46fba778e4e8d59c0ce0b" + integrity sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ== + dependencies: + which-typed-array "^1.1.16" + +is-weakmap@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd" + integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== + +is-weakref@^1.0.2, is-weakref@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.1.1.tgz#eea430182be8d64174bd96bffbc46f21bf3f9293" + integrity sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew== + dependencies: + call-bound "^1.0.3" + +is-weakset@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.4.tgz#c9f5deb0bc1906c6d6f1027f284ddf459249daca" + integrity sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ== + dependencies: + call-bound "^1.0.3" + get-intrinsic "^1.2.6" + +is-wsl@^2.1.1, is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +istanbul-lib-coverage@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" + integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== + +istanbul-lib-instrument@^5.0.4: + version "5.2.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" + integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== + 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" + +iterator.prototype@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.5.tgz#12c959a29de32de0aa3bbbb801f4d777066dae39" + integrity sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g== + dependencies: + define-data-property "^1.1.4" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.6" + get-proto "^1.0.0" + has-symbols "^1.1.0" + set-function-name "^2.0.2" + +jest-environment-node@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.7.0.tgz#0b93e111dda8ec120bc8300e6d1fb9576e164376" + integrity sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw== + 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" + +jest-get-type@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" + integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== + +jest-haste-map@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.7.0.tgz#3c2396524482f5a0506376e6c858c3bbcc17b104" + integrity sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA== + 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" + optionalDependencies: + fsevents "^2.3.2" + +jest-message-util@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.7.0.tgz#8bc392e204e95dfe7564abbe72a404e28e51f7f3" + integrity sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w== + 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" + +jest-mock@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.7.0.tgz#4e836cf60e99c6fcfabe9f99d017f3fdd50a6347" + integrity sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-util "^29.7.0" + +jest-regex-util@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.6.3.tgz#4a556d9c776af68e1c5f48194f4d0327d24e8a52" + integrity sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg== + +jest-util@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" + integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== + 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" + +jest-validate@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.7.0.tgz#7bf705511c64da591d46b15fce41400d52147d9c" + integrity sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw== + 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" + +jest-worker@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" + integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== + dependencies: + "@types/node" "*" + jest-util "^29.7.0" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jimp-compact@0.16.1: + version "0.16.1" + resolved "https://registry.yarnpkg.com/jimp-compact/-/jimp-compact-0.16.1.tgz#9582aea06548a2c1e04dd148d7c3ab92075aefa3" + integrity sha512-dZ6Ra7u1G8c4Letq/B5EzAxj4tLFHL+cGtdpR+PVm4yzPDj+lCk+AbivWt1eOM+ikzkowtyV7qSqX6qr3t71Ww== + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.13.1: + version "3.15.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.15.0.tgz#586e5214eafe3e893756a41e979b50d89d3e4a67" + integrity sha512-ttBQIIQPDeLjpPOohtUdXuXUVoA2uIB6fEH9HyJ7234s5mBJ5wTx20njxplLZQgLaOfpmPQA7X2t5AX6tIPbog== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@^4.1.0, js-yaml@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.3.0.tgz#d1900572a7f7cf0b5f540c83673e60bad3436592" + integrity sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q== + dependencies: + argparse "^2.0.1" + +jsc-safe-url@^0.2.2, jsc-safe-url@^0.2.4: + version "0.2.4" + resolved "https://registry.yarnpkg.com/jsc-safe-url/-/jsc-safe-url-0.2.4.tgz#141c14fbb43791e88d5dc64e85a374575a83477a" + integrity sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q== + +jsesc@^3.0.2, jsesc@~3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d" + integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== + +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +json5@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" + integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== + dependencies: + minimist "^1.2.0" + +json5@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +"jsx-ast-utils@^2.4.1 || ^3.0.0": + version "3.3.5" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a" + integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ== + dependencies: + array-includes "^3.1.6" + array.prototype.flat "^1.3.1" + object.assign "^4.1.4" + object.values "^1.1.6" + +keyv@^4.5.3, keyv@^4.5.4: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + +lan-network@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/lan-network/-/lan-network-0.2.1.tgz#e4764a0d17f6bd1f2794c838fa219526a1b756f8" + integrity sha512-ONPnazC96VKDntab9j9JKwIWhZ4ZUceB4A9Epu4Ssg0hYFmtHZSeQ+n15nIwTFmcBUKtExOer8WTJ4GF9MO64A== + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +lighthouse-logger@^1.0.0: + version "1.4.2" + resolved "https://registry.yarnpkg.com/lighthouse-logger/-/lighthouse-logger-1.4.2.tgz#aef90f9e97cd81db367c7634292ee22079280aaa" + integrity sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g== + dependencies: + debug "^2.6.9" + marky "^1.2.2" + +lightningcss-android-arm64@1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz#9a6841f88ae50fc83502903892b41af41bc2b907" + integrity sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg== + +lightningcss-darwin-arm64@1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz#c0f2c31c0bfd19fa4dd3f18e957a1f1a152097d6" + integrity sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg== + +lightningcss-darwin-x64@1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz#cb0705965acb538c6683949ce6925fb3cdf7c361" + integrity sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ== + +lightningcss-freebsd-x64@1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz#763538828b26bab2680dadafcc84ee78b0eb502b" + integrity sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg== + +lightningcss-linux-arm-gnueabihf@1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz#6862e3176a331aedbdec1ed352b4d7d0dd0784de" + integrity sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ== + +lightningcss-linux-arm64-gnu@1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz#c6a3a2ed15141daf6bdc2628930f8e39bdf473aa" + integrity sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg== + +lightningcss-linux-arm64-musl@1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz#7fa1334971fc82845f9827df6ef8a0b20914bac6" + integrity sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ== + +lightningcss-linux-x64-gnu@1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz#8b927862ea8c2bbc6831a46509244b50d9936e55" + integrity sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg== + +lightningcss-linux-x64-musl@1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz#0c525bb077dfd94404c059cfe42dad797e96aeaf" + integrity sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw== + +lightningcss-win32-arm64-msvc@1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz#850ee1103dac989cfab50e3ac22d1a69e394e63d" + integrity sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA== + +lightningcss-win32-x64-msvc@1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz#e343ae152eed3609dc6e11949d1a3bf39a1c946f" + integrity sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA== + +lightningcss@^1.30.1: + version "1.33.0" + resolved "https://registry.yarnpkg.com/lightningcss/-/lightningcss-1.33.0.tgz#c08867d71a79385c6e190214fd72fef3e5f95f0b" + integrity sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA== + dependencies: + detect-libc "^2.0.3" + optionalDependencies: + lightningcss-android-arm64 "1.33.0" + lightningcss-darwin-arm64 "1.33.0" + lightningcss-darwin-x64 "1.33.0" + lightningcss-freebsd-x64 "1.33.0" + lightningcss-linux-arm-gnueabihf "1.33.0" + lightningcss-linux-arm64-gnu "1.33.0" + lightningcss-linux-arm64-musl "1.33.0" + lightningcss-linux-x64-gnu "1.33.0" + lightningcss-linux-x64-musl "1.33.0" + lightningcss-win32-arm64-msvc "1.33.0" + lightningcss-win32-x64-msvc "1.33.0" + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== + +lodash.isequal@4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" + integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash.throttle@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4" + integrity sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ== + +log-symbols@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" + integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== + dependencies: + chalk "^2.0.1" + +loose-envify@^1.0.0, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lru-cache@^10.0.1: + version "10.4.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" + integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== + +lru-cache@^11.0.0: + version "11.5.2" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-11.5.2.tgz#00e16665c90c620fba14a3c368732a976493f760" + integrity sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g== + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +makeerror@1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" + integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== + dependencies: + tmpl "1.0.5" + +marky@^1.2.2: + version "1.3.0" + resolved "https://registry.yarnpkg.com/marky/-/marky-1.3.0.tgz#422b63b0baf65022f02eda61a238eccdbbc14997" + integrity sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ== + +math-intrinsics@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" + integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== + +memoize-one@^5.0.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.2.1.tgz#8337aa3c4335581839ec01c3d594090cebe8f00e" + integrity sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q== + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +metro-babel-transformer@0.83.3: + version "0.83.3" + resolved "https://registry.yarnpkg.com/metro-babel-transformer/-/metro-babel-transformer-0.83.3.tgz#d8c134615530c9ee61364526d44ca4bb0c5343ea" + integrity sha512-1vxlvj2yY24ES1O5RsSIvg4a4WeL7PFXgKOHvXTXiW0deLvQr28ExXj6LjwCCDZ4YZLhq6HddLpZnX4dEdSq5g== + dependencies: + "@babel/core" "^7.25.2" + flow-enums-runtime "^0.0.6" + hermes-parser "0.32.0" + nullthrows "^1.1.1" + +metro-babel-transformer@0.83.7: + version "0.83.7" + resolved "https://registry.yarnpkg.com/metro-babel-transformer/-/metro-babel-transformer-0.83.7.tgz#8448c7a550571de87d00e97c1a7139c6b6900e4a" + integrity sha512-sBqBkt6kNut/88bv+Ucvm4yqdPetbvAEsHzi3MAgJEifOSYYzX5Z5Kgw3TFOrwf/mHJTOBG2ONlaMHoyfP15TA== + dependencies: + "@babel/core" "^7.25.2" + flow-enums-runtime "^0.0.6" + hermes-parser "0.35.0" + metro-cache-key "0.83.7" + nullthrows "^1.1.1" + +metro-cache-key@0.83.3: + version "0.83.3" + resolved "https://registry.yarnpkg.com/metro-cache-key/-/metro-cache-key-0.83.3.tgz#ae6c5d4eb1ad8d06a92bf7294ca730a8d880b573" + integrity sha512-59ZO049jKzSmvBmG/B5bZ6/dztP0ilp0o988nc6dpaDsU05Cl1c/lRf+yx8m9WW/JVgbmfO5MziBU559XjI5Zw== + dependencies: + flow-enums-runtime "^0.0.6" + +metro-cache-key@0.83.7: + version "0.83.7" + resolved "https://registry.yarnpkg.com/metro-cache-key/-/metro-cache-key-0.83.7.tgz#59e647cf6dd6297e43d0bd7ab927db48c6ba80b5" + integrity sha512-W1c2Nmx8MiJTJt+eWhMO08z9VKi3kZOaz99IYGdqeqDgY9j+yZjXl62rUav4Di0heZfh4/n2s722PqRL1OODeg== + dependencies: + flow-enums-runtime "^0.0.6" + +metro-cache@0.83.3: + version "0.83.3" + resolved "https://registry.yarnpkg.com/metro-cache/-/metro-cache-0.83.3.tgz#f1245cc48570c47d8944495e61d67f0228f10172" + integrity sha512-3jo65X515mQJvKqK3vWRblxDEcgY55Sk3w4xa6LlfEXgQ9g1WgMh9m4qVZVwgcHoLy0a2HENTPCCX4Pk6s8c8Q== + dependencies: + exponential-backoff "^3.1.1" + flow-enums-runtime "^0.0.6" + https-proxy-agent "^7.0.5" + metro-core "0.83.3" + +metro-cache@0.83.7: + version "0.83.7" + resolved "https://registry.yarnpkg.com/metro-cache/-/metro-cache-0.83.7.tgz#73ab7857ba6267b78f6374396829d660a67deccf" + integrity sha512-E9SRePXQ1Zvlj79VcOk57q7VC7rMHMFQ+jhmPHBiq+dJ0bJB5BL87lWZF6oh5X76Cci5tpDuQNaDwwuSCToEeg== + dependencies: + exponential-backoff "^3.1.1" + flow-enums-runtime "^0.0.6" + https-proxy-agent "^7.0.5" + metro-core "0.83.7" + +metro-config@0.83.3: + version "0.83.3" + resolved "https://registry.yarnpkg.com/metro-config/-/metro-config-0.83.3.tgz#a30e7a69b5cf8c4ac4c4b68b1b4c33649ae129a2" + integrity sha512-mTel7ipT0yNjKILIan04bkJkuCzUUkm2SeEaTads8VfEecCh+ltXchdq6DovXJqzQAXuR2P9cxZB47Lg4klriA== + 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" + +metro-config@0.83.7, metro-config@^0.83.1: + version "0.83.7" + resolved "https://registry.yarnpkg.com/metro-config/-/metro-config-0.83.7.tgz#fc88f4f75992744d6d64bf27c6a2f11b10e9fcfb" + integrity sha512-83mjWFbFOt2GeJ6pFIum5mSnc1uTsZJAtD8o4ej0s4NVsYsA7fB+pHvTfHhFrpeMONaobu2riKavkPei05Er/Q== + dependencies: + connect "^3.6.5" + flow-enums-runtime "^0.0.6" + jest-validate "^29.7.0" + metro "0.83.7" + metro-cache "0.83.7" + metro-core "0.83.7" + metro-runtime "0.83.7" + yaml "^2.6.1" + +metro-core@0.83.3: + version "0.83.3" + resolved "https://registry.yarnpkg.com/metro-core/-/metro-core-0.83.3.tgz#007e93f7d1983777da8988dfb103ad897c9835b8" + integrity sha512-M+X59lm7oBmJZamc96usuF1kusd5YimqG/q97g4Ac7slnJ3YiGglW5CsOlicTR5EWf8MQFxxjDoB6ytTqRe8Hw== + dependencies: + flow-enums-runtime "^0.0.6" + lodash.throttle "^4.1.1" + metro-resolver "0.83.3" + +metro-core@0.83.7, metro-core@^0.83.1: + version "0.83.7" + resolved "https://registry.yarnpkg.com/metro-core/-/metro-core-0.83.7.tgz#45cc9eebd979c75021015f190dbd023e833bdd16" + integrity sha512-6yn3w1wnltT6RQl7p7YES2l95ArC+mWrOssEiH8p5/DDrJS65/szf9LsC9JrBv8c5DdvSY3V3f0GRYg0Ox7hCg== + dependencies: + flow-enums-runtime "^0.0.6" + lodash.throttle "^4.1.1" + metro-resolver "0.83.7" + +metro-file-map@0.83.3: + version "0.83.3" + resolved "https://registry.yarnpkg.com/metro-file-map/-/metro-file-map-0.83.3.tgz#3d79fbb1d379ab178dd895ce54cb5ecb183d74a2" + integrity sha512-jg5AcyE0Q9Xbbu/4NAwwZkmQn7doJCKGW0SLeSJmzNB9Z24jBe0AL2PHNMy4eu0JiKtNWHz9IiONGZWq7hjVTA== + 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" + +metro-file-map@0.83.7: + version "0.83.7" + resolved "https://registry.yarnpkg.com/metro-file-map/-/metro-file-map-0.83.7.tgz#1d0d47db8a76631f0fed2112edad5fec462aec50" + integrity sha512-+j0F1m+FQYVAQ6syf+mwhIPV5GoFQrkInX8bppuc50IzNsZbMrp8R5H/Sx/K2daQ3YEa9F/XwkeZT8gzJfgeCw== + 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" + +metro-minify-terser@0.83.3: + version "0.83.3" + resolved "https://registry.yarnpkg.com/metro-minify-terser/-/metro-minify-terser-0.83.3.tgz#c1c70929c86b14c8bf03e6321b4f9310bc8dbe87" + integrity sha512-O2BmfWj6FSfzBLrNCXt/rr2VYZdX5i6444QJU0fFoc7Ljg+Q+iqebwE3K0eTvkI6TRjELsXk1cjU+fXwAR4OjQ== + dependencies: + flow-enums-runtime "^0.0.6" + terser "^5.15.0" + +metro-minify-terser@0.83.7: + version "0.83.7" + resolved "https://registry.yarnpkg.com/metro-minify-terser/-/metro-minify-terser-0.83.7.tgz#2de0b70f8cd58e9383b014313a1d9e7babe8d878" + integrity sha512-MfJar2IS4tBRuLb9svwb0Gu5l9BsH+pcRm8eGcEi/wy8MzZinfinh5dFLt2nWkocnulIgtGB5NkFDdbXqMXKhQ== + dependencies: + flow-enums-runtime "^0.0.6" + terser "^5.15.0" + +metro-resolver@0.83.3: + version "0.83.3" + resolved "https://registry.yarnpkg.com/metro-resolver/-/metro-resolver-0.83.3.tgz#06207bdddc280b9335722a8c992aeec017413942" + integrity sha512-0js+zwI5flFxb1ktmR///bxHYg7OLpRpWZlBBruYG8OKYxeMP7SV0xQ/o/hUelrEMdK4LJzqVtHAhBm25LVfAQ== + dependencies: + flow-enums-runtime "^0.0.6" + +metro-resolver@0.83.7: + version "0.83.7" + resolved "https://registry.yarnpkg.com/metro-resolver/-/metro-resolver-0.83.7.tgz#84b2e2749f0dba0e1c204764d01c21892157cf1c" + integrity sha512-WSJIENlMcoSsuz66IfBHOkgfp3KJt2UW2TnEHPf1b8pIG2eEXNOVmo2+03A0H17WY2XGXWgxL0CG7FAopqgB1A== + dependencies: + flow-enums-runtime "^0.0.6" + +metro-runtime@0.83.3: + version "0.83.3" + resolved "https://registry.yarnpkg.com/metro-runtime/-/metro-runtime-0.83.3.tgz#ff504df5d93f38b1af396715b327e589ba8d184d" + integrity sha512-JHCJb9ebr9rfJ+LcssFYA2x1qPYuSD/bbePupIGhpMrsla7RCwC/VL3yJ9cSU+nUhU4c9Ixxy8tBta+JbDeZWw== + dependencies: + "@babel/runtime" "^7.25.0" + flow-enums-runtime "^0.0.6" + +metro-runtime@0.83.7, metro-runtime@^0.83.1: + version "0.83.7" + resolved "https://registry.yarnpkg.com/metro-runtime/-/metro-runtime-0.83.7.tgz#3606a71c94a4ef862b7a0e43156b35f7a4e4cf17" + integrity sha512-9GKkJURaB2iyYoEExKnedzAHzxmKtSi+k0tsZUvMoU27tBZJElchYt7JH/Ai/XzYAI9lCAaV7u5HZSI8J5Z+wQ== + dependencies: + "@babel/runtime" "^7.25.0" + flow-enums-runtime "^0.0.6" + +metro-source-map@0.83.3: + version "0.83.3" + resolved "https://registry.yarnpkg.com/metro-source-map/-/metro-source-map-0.83.3.tgz#04bb464f7928ea48bcdfd18912c8607cf317c898" + integrity sha512-xkC3qwUBh2psVZgVavo8+r2C9Igkk3DibiOXSAht1aYRRcztEZNFtAMtfSB7sdO2iFMx2Mlyu++cBxz/fhdzQg== + 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" + +metro-source-map@0.83.7, metro-source-map@^0.83.1: + version "0.83.7" + resolved "https://registry.yarnpkg.com/metro-source-map/-/metro-source-map-0.83.7.tgz#6208e72427c987e66a9ec23ebaee0b3cc76dd16c" + integrity sha512-JgA1h7oc1a1jydBe1GhVFsUoMYo3wLPk7oRA32rjlDsq+sP2JLt9x2p2lWbNSxTm/u8NV4VRid3hvEJgcX8tKw== + dependencies: + "@babel/traverse" "^7.29.0" + "@babel/types" "^7.29.0" + flow-enums-runtime "^0.0.6" + invariant "^2.2.4" + metro-symbolicate "0.83.7" + nullthrows "^1.1.1" + ob1 "0.83.7" + source-map "^0.5.6" + vlq "^1.0.0" + +metro-symbolicate@0.83.3: + version "0.83.3" + resolved "https://registry.yarnpkg.com/metro-symbolicate/-/metro-symbolicate-0.83.3.tgz#67af03950f0dfe19a7c059e3983e39a31e95d03a" + integrity sha512-F/YChgKd6KbFK3eUR5HdUsfBqVsanf5lNTwFd4Ca7uuxnHgBC3kR/Hba/RGkenR3pZaGNp5Bu9ZqqP52Wyhomw== + 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" + +metro-symbolicate@0.83.7: + version "0.83.7" + resolved "https://registry.yarnpkg.com/metro-symbolicate/-/metro-symbolicate-0.83.7.tgz#ee10cfbafb5ed5ae5f04a565c496fd772afb3f5c" + integrity sha512-g4suyxw20WOHWI680c+Kq4wC/NF+Hx5pRH9afrMp+sMTxqLeKcPR1Xf4wMhsjlbvx7LbIREdke6q928jEjvJWw== + dependencies: + flow-enums-runtime "^0.0.6" + invariant "^2.2.4" + metro-source-map "0.83.7" + nullthrows "^1.1.1" + source-map "^0.5.6" + vlq "^1.0.0" + +metro-transform-plugins@0.83.3: + version "0.83.3" + resolved "https://registry.yarnpkg.com/metro-transform-plugins/-/metro-transform-plugins-0.83.3.tgz#2c59ba841e269363cf3acb13138cb992f0c75013" + integrity sha512-eRGoKJU6jmqOakBMH5kUB7VitEWiNrDzBHpYbkBXW7C5fUGeOd2CyqrosEzbMK5VMiZYyOcNFEphvxk3OXey2A== + 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" + +metro-transform-plugins@0.83.7: + version "0.83.7" + resolved "https://registry.yarnpkg.com/metro-transform-plugins/-/metro-transform-plugins-0.83.7.tgz#9fc9b4c209ca2fdc1e720a9fefde7c20f32ab5ad" + integrity sha512-Ss0FpBiZDjX2kwhukMDl5sNdYK8T/06IPqxNE4H6PTlRlfs9q11cef13c/xESY/Pm4VCkp1yJUZO3kXzvMxQFA== + dependencies: + "@babel/core" "^7.25.2" + "@babel/generator" "^7.29.1" + "@babel/template" "^7.28.6" + "@babel/traverse" "^7.29.0" + flow-enums-runtime "^0.0.6" + nullthrows "^1.1.1" + +metro-transform-worker@0.83.3: + version "0.83.3" + resolved "https://registry.yarnpkg.com/metro-transform-worker/-/metro-transform-worker-0.83.3.tgz#ca6ae4a02b0f61b33299e6e56bacaba32dcd607f" + integrity sha512-Ztekew9t/gOIMZX1tvJOgX7KlSLL5kWykl0Iwu2cL2vKMKVALRl1hysyhUw0vjpAvLFx+Kfq9VLjnHIkW32fPA== + 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" + +metro-transform-worker@0.83.7: + version "0.83.7" + resolved "https://registry.yarnpkg.com/metro-transform-worker/-/metro-transform-worker-0.83.7.tgz#1ba8980f660630f7dfbf52fcf2b7bd6e4ae4528b" + integrity sha512-UegCo7ygB2fT64mRK2nbAjQVJ1zSwIIHy8d96jJv2nKZFDaViYBiughEdu5HM/Ceq0WN3LZrZk3zhl9aoiLYFw== + dependencies: + "@babel/core" "^7.25.2" + "@babel/generator" "^7.29.1" + "@babel/parser" "^7.29.0" + "@babel/types" "^7.29.0" + flow-enums-runtime "^0.0.6" + metro "0.83.7" + metro-babel-transformer "0.83.7" + metro-cache "0.83.7" + metro-cache-key "0.83.7" + metro-minify-terser "0.83.7" + metro-source-map "0.83.7" + metro-transform-plugins "0.83.7" + nullthrows "^1.1.1" + +metro@0.83.3: + version "0.83.3" + resolved "https://registry.yarnpkg.com/metro/-/metro-0.83.3.tgz#1e7e04c15519af746f8932c7f9c553d92c39e922" + integrity sha512-+rP+/GieOzkt97hSJ0MrPOuAH/jpaS21ZDvL9DJ35QYRDlQcwzcvUlGUf79AnQxq/2NPiS/AULhhM4TKutIt8Q== + 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" + +metro@0.83.7, metro@^0.83.1: + version "0.83.7" + resolved "https://registry.yarnpkg.com/metro/-/metro-0.83.7.tgz#8357495dfea9e11d34ea15c0a1e2acd508ee5559" + integrity sha512-SPaPEyvTsTmd0LpT7RaZciQyDw2i/JB7+iY9L5VfBo72+psescFxBqpI1TL9dnL+pmnfkU+l/J1mEEGLeF65EQ== + dependencies: + "@babel/code-frame" "^7.29.0" + "@babel/core" "^7.25.2" + "@babel/generator" "^7.29.1" + "@babel/parser" "^7.29.0" + "@babel/template" "^7.28.6" + "@babel/traverse" "^7.29.0" + "@babel/types" "^7.29.0" + accepts "^2.0.0" + ci-info "^2.0.0" + connect "^3.6.5" + debug "^4.4.0" + error-stack-parser "^2.0.6" + flow-enums-runtime "^0.0.6" + graceful-fs "^4.2.4" + hermes-parser "0.35.0" + 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.7" + metro-cache "0.83.7" + metro-cache-key "0.83.7" + metro-config "0.83.7" + metro-core "0.83.7" + metro-file-map "0.83.7" + metro-resolver "0.83.7" + metro-runtime "0.83.7" + metro-source-map "0.83.7" + metro-symbolicate "0.83.7" + metro-transform-plugins "0.83.7" + metro-transform-worker "0.83.7" + mime-types "^3.0.1" + nullthrows "^1.1.1" + serialize-error "^2.1.0" + source-map "^0.5.6" + throat "^5.0.0" + ws "^7.5.10" + yargs "^17.6.2" + +micromatch@^4.0.4: + version "4.0.8" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== + dependencies: + braces "^3.0.3" + picomatch "^2.3.1" + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +"mime-db@>= 1.43.0 < 2", mime-db@^1.54.0: + version "1.54.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.54.0.tgz#cddb3ee4f9c64530dff640236661d42cb6a314f5" + integrity sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ== + +mime-types@^2.1.27, mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime-types@^3.0.0, mime-types@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-3.0.2.tgz#39002d4182575d5af036ffa118100f2524b2e2ab" + integrity sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A== + dependencies: + mime-db "^1.54.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mimic-fn@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== + +minimatch@^10.2.2: + version "10.2.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.2.5.tgz#bd48687a0be38ed2961399105600f832095861d1" + integrity sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg== + dependencies: + brace-expansion "^5.0.5" + +minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2, minimatch@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.5.tgz#580c88f8d5445f2bd6aa8f3cadefa0de79fbd69e" + integrity sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^9.0.0: + version "9.0.9" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.9.tgz#9b0cb9fcb78087f6fd7eababe2511c4d3d60574e" + integrity sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg== + dependencies: + brace-expansion "^2.0.2" + +minimist@^1.2.0, minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +minipass@^7.0.4, minipass@^7.1.2, minipass@^7.1.3: + version "7.1.3" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.3.tgz#79389b4eb1bb2d003a9bba87d492f2bd37bdc65b" + integrity sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A== + +minizlib@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-3.1.0.tgz#6ad76c3a8f10227c9b51d1c9ac8e30b27f5a251c" + integrity sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw== + dependencies: + minipass "^7.1.2" + +mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@2.1.3, ms@^2.1.1, ms@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +mz@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" + integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== + dependencies: + any-promise "^1.0.0" + object-assign "^4.0.1" + thenify-all "^1.0.0" + +nanoid@^3.3.7: + version "3.3.16" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.16.tgz#a04d8ec4b1f10009d2d533947aefe4293737816c" + integrity sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q== + +napi-postinstall@^0.3.4: + version "0.3.4" + resolved "https://registry.yarnpkg.com/napi-postinstall/-/napi-postinstall-0.3.4.tgz#7af256d6588b5f8e952b9190965d6b019653bbb9" + integrity sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +negotiator@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-1.0.0.tgz#b6c91bb47172d69f93cfd7c357bbb529019b5f6a" + integrity sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg== + +negotiator@~0.6.4: + version "0.6.4" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.4.tgz#777948e2452651c570b712dd01c23e262713fff7" + integrity sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w== + +nested-error-stacks@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/nested-error-stacks/-/nested-error-stacks-2.0.1.tgz#d2cc9fc5235ddb371fc44d506234339c8e4b0a4b" + integrity sha512-SrQrok4CATudVzBS7coSz26QRSmlK9TzzoFbeKfcPBUFPjcQM9Rqvr/DlJkOrwI/0KcgvMub1n1g5Jt9EgRn4A== + +node-exports-info@^1.6.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/node-exports-info/-/node-exports-info-1.6.2.tgz#243a3105677d6781cd26e6a72350fd928a5cb46f" + integrity sha512-kXs9Go0cah0qHVV2v389IXQLdLCeE1xfFtjOAF+iobu0OIoG1pje8At2vMHyaPMiPMnG/LWP50twML21eMcAag== + dependencies: + array.prototype.flatmap "^1.3.3" + es-errors "^1.3.0" + object.entries "^1.1.9" + semver "^6.3.1" + +node-forge@^1.3.3: + version "1.4.0" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.4.0.tgz#1c7b7d8bdc2d078739f58287d589d903a11b2fc2" + integrity sha512-LarFH0+6VfriEhqMMcLX2F7SwSXeWwnEAJEsYm5QKWchiVYVvJyV9v7UDvUv+w5HO23ZpQTXDv/GxdDdMyOuoQ== + +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== + +node-releases@^2.0.51: + version "2.0.51" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.51.tgz#cdc08433577f5b32ad01694481726e22eeb54aef" + integrity sha512-wRNIrw4DmVLKQlbgOMdkMx27Wrpzes2hh5Jtbi2bjPd+4wJstWIqP5A+lscnqbm0xxmT5Bpg8Lec5ItEBwx6BQ== + +normalize-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +npm-package-arg@^11.0.0: + version "11.0.3" + resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-11.0.3.tgz#dae0c21199a99feca39ee4bfb074df3adac87e2d" + integrity sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw== + dependencies: + hosted-git-info "^7.0.0" + proc-log "^4.0.0" + semver "^7.3.5" + validate-npm-package-name "^5.0.0" + +nullthrows@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/nullthrows/-/nullthrows-1.1.1.tgz#7818258843856ae971eae4208ad7d7eb19a431b1" + integrity sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw== + +ob1@0.83.3: + version "0.83.3" + resolved "https://registry.yarnpkg.com/ob1/-/ob1-0.83.3.tgz#2208e20c9070e9beff3ad067f2db458fa6b07014" + integrity sha512-egUxXCDwoWG06NGCS5s5AdcpnumHKJlfd3HH06P3m9TEMwwScfcY35wpQxbm9oHof+dM/lVH9Rfyu1elTVelSA== + dependencies: + flow-enums-runtime "^0.0.6" + +ob1@0.83.7: + version "0.83.7" + resolved "https://registry.yarnpkg.com/ob1/-/ob1-0.83.7.tgz#0f9a9461ee3c3048eacd40893fee3385d42d8731" + integrity sha512-9M5kpuOLyTPogMtZiQUIxdAZxl7Dxs6tVBbJErSumsqGMuhVSoUbkfeZ3XNPpLpwBBtqY5QDUzGwggLHX3slQg== + dependencies: + flow-enums-runtime "^0.0.6" + +object-assign@^4.0.1, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-inspect@^1.13.3, object-inspect@^1.13.4: + version "1.13.4" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.4.tgz#8375265e21bc20d0fa582c22e1b13485d6e00213" + integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew== + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.4, object.assign@^4.1.7: + version "4.1.7" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.7.tgz#8c14ca1a424c6a561b0bb2a22f66f5049a945d3d" + integrity sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw== + 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" + +object.entries@^1.1.9: + version "1.1.9" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.9.tgz#e4770a6a1444afb61bd39f984018b5bede25f8b3" + integrity sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.4" + define-properties "^1.2.1" + es-object-atoms "^1.1.1" + +object.fromentries@^2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" + integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + +object.groupby@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.3.tgz#9b125c36238129f6f7b61954a1e7176148d5002e" + integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + +object.values@^1.1.6, object.values@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.1.tgz#deed520a50809ff7f75a7cfd4bc64c7a038c6216" + integrity sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww== + dependencies: + ee-first "1.1.1" + +on-finished@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + +on-headers@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.1.0.tgz#59da4f91c45f5f989c6e4bcedc5a3b0aed70ff65" + integrity sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A== + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + integrity sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ== + dependencies: + mimic-fn "^1.0.0" + +open@^7.0.3: + version "7.4.2" + resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321" + integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q== + dependencies: + is-docker "^2.0.0" + is-wsl "^2.1.1" + +open@^8.0.4: + version "8.4.2" + resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" + integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== + dependencies: + define-lazy-prop "^2.0.0" + is-docker "^2.1.1" + is-wsl "^2.2.0" + +optionator@^0.9.3: + version "0.9.4" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" + integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.5" + +ora@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/ora/-/ora-3.4.0.tgz#bf0752491059a3ef3ed4c85097531de9fdbcd318" + integrity sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg== + 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" + +own-keys@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/own-keys/-/own-keys-1.0.2.tgz#31448ec1f781ecb1447f6f6aa0d6534222af59de" + integrity sha512-19YVAg7T+WTrxggPukVq7DjTv6+PJ867TmhCvBsYwmbFCsZd344rq2Ld1p0wo8f8Qrrhgp82c6FJRqdXWtSEhg== + dependencies: + call-bound "^1.0.4" + get-intrinsic "^1.3.0" + object-keys "^1.1.1" + safe-push-apply "^1.0.0" + +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2, p-limit@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-png@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/parse-png/-/parse-png-2.1.0.tgz#2a42ad719fedf90f81c59ebee7ae59b280d6b338" + integrity sha512-Nt/a5SfCLiTnQAjx3fHlqp8hRgTL3z7kTQZzvIMS9uCAepnCyjpdEc6M/sz69WqMBdaDBw9sF1F1UaHROYzGkQ== + dependencies: + pngjs "^3.3.0" + +parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.5, path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-scurry@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-2.0.2.tgz#6be0d0ee02a10d9e0de7a98bae65e182c9061f85" + integrity sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg== + dependencies: + lru-cache "^11.0.0" + minipass "^7.1.2" + +picocolors@^1.0.0, picocolors@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== + +picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.2.tgz#5a942915e26b372dc0f0e6753149a16e6b1c5601" + integrity sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA== + +picomatch@^4.0.3, picomatch@^4.0.4: + version "4.0.5" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.5.tgz#51ea57a17d86f605f81039595fbc40ed06a55fab" + integrity sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A== + +pirates@^4.0.1, pirates@^4.0.4: + version "4.0.7" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.7.tgz#643b4a18c4257c8a65104b73f3049ce9a0a15e22" + integrity sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA== + +plist@^3.0.5: + version "3.1.1" + resolved "https://registry.yarnpkg.com/plist/-/plist-3.1.1.tgz#fa6099e1e3cf6ea180258ebe6378ea3878c2c841" + integrity sha512-ZIfcLJC+7E7FBFnDxm9MPmt7D+DidyQ26lewieO75AdhA2ayMtsJSES0iWzqJQbcVRSrTufQoy0DR94xHue0oA== + dependencies: + "@xmldom/xmldom" "^0.9.10" + base64-js "^1.5.1" + xmlbuilder "^15.1.1" + +pngjs@^3.3.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.4.0.tgz#99ca7d725965fb655814eaf65f38f12bbdbf555f" + integrity sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w== + +possible-typed-array-names@^1.0.0, possible-typed-array-names@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz#93e3582bc0e5426586d9d07b79ee40fc841de4ae" + integrity sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg== + +postcss@~8.4.32: + version "8.4.49" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.49.tgz#4ea479048ab059ab3ae61d082190fabfd994fe19" + integrity sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA== + dependencies: + nanoid "^3.3.7" + picocolors "^1.1.1" + source-map-js "^1.2.1" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prettier@^3.6.2: + version "3.9.6" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.9.6.tgz#b3ea5146515d40fc53f18aa63f74dfab1e10dbf6" + integrity sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g== + +pretty-bytes@^5.6.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" + integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== + +pretty-format@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" + integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== + dependencies: + "@jest/schemas" "^29.6.3" + ansi-styles "^5.0.0" + react-is "^18.0.0" + +proc-log@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/proc-log/-/proc-log-4.2.0.tgz#b6f461e4026e75fdfe228b265e9f7a00779d7034" + integrity sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA== + +progress@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + +promise@^8.3.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/promise/-/promise-8.3.0.tgz#8cb333d1edeb61ef23869fbb8a4ea0279ab60e0a" + integrity sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg== + dependencies: + asap "~2.0.6" + +prompts@^2.3.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + +prop-types@^15.8.1: + version "15.8.1" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + +punycode@^2.1.0, punycode@^2.1.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + +qrcode-terminal@0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/qrcode-terminal/-/qrcode-terminal-0.11.0.tgz#ffc6c28a2fc0bfb47052b47e23f4f446a5fbdb9e" + integrity sha512-Uu7ii+FQy4Qf82G4xu7ShHhjhGahEpCWc3x8UavY3CTcWV+ufmmCtwkr7ZKsX42jdL0kr1B5FKUeqJvAn51jzQ== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +queue@6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/queue/-/queue-6.0.2.tgz#b91525283e2315c7553d2efa18d83e76432fed65" + integrity sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA== + dependencies: + inherits "~2.0.3" + +range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +rc@~1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +react-devtools-core@^6.1.5: + version "6.1.5" + resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-6.1.5.tgz#c5eca79209dab853a03b2158c034c5166975feee" + integrity sha512-ePrwPfxAnB+7hgnEr8vpKxL9cmnp7F322t8oqcPshbIQQhDKgFDW4tjhF2wjVbdXF9O/nyuy3sQWd9JGpiLPvA== + dependencies: + shell-quote "^1.6.1" + ws "^7" + +react-is@^16.13.1: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-is@^18.0.0: + version "18.3.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" + integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== + +react-native-get-random-values@1.11.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/react-native-get-random-values/-/react-native-get-random-values-1.11.0.tgz#1ca70d1271f4b08af92958803b89dccbda78728d" + integrity sha512-4BTbDbRmS7iPdhYLRcz3PGFIpFJBwNZg9g42iwa2P6FOv9vZj/xJc678RZXnLNZzd0qd7Q3CCF6Yd+CU2eoXKQ== + dependencies: + fast-base64-decode "^1.0.0" + +react-native-is-edge-to-edge@^1.2.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/react-native-is-edge-to-edge/-/react-native-is-edge-to-edge-1.3.1.tgz#feb9a6a8faf0874298947edd556e5af22044e139" + integrity sha512-NIXU/iT5+ORyCc7p0z2nnlkouYKX425vuU1OEm6bMMtWWR9yvb+Xg5AZmImTKoF9abxCPqrKC3rOZsKzUYgYZA== + +react-native-reanimated@~4.1.1: + version "4.1.7" + resolved "https://registry.yarnpkg.com/react-native-reanimated/-/react-native-reanimated-4.1.7.tgz#b4e8524503a1b6ec1b5a40c460ee807a6a9fd2cf" + integrity sha512-Q4H6xA3Tn7QL0/E/KjI86I1KK4tcf+ErRE04LH34Etka2oVQhW6oXQ+Q8ZcDCVxiWp5vgbBH6XcH8BOo4w/Rhg== + dependencies: + react-native-is-edge-to-edge "^1.2.1" + semver "^7.7.2" + +react-native-safe-area-context@~5.6.0: + version "5.6.2" + resolved "https://registry.yarnpkg.com/react-native-safe-area-context/-/react-native-safe-area-context-5.6.2.tgz#283e006f5b434fb247fcb4be0971ad7473d5c560" + integrity sha512-4XGqMNj5qjUTYywJqpdWZ9IG8jgkS3h06sfVjfw5yZQZfWnRFXczi0GnYyFyCc2EBps/qFmoCH8fez//WumdVg== + +react-native-url-polyfill@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/react-native-url-polyfill/-/react-native-url-polyfill-3.0.0.tgz#16b809c35d45f7d4cf968967bc35ab73b7542826" + integrity sha512-aA5CiuUCUb/lbrliVCJ6lZ17/RpNJzvTO/C7gC/YmDQhTUoRD5q5HlJfwLWcxz4VgAhHwXKzhxH+wUN24tAdqg== + dependencies: + whatwg-url-without-unicode "8.0.0-3" + +react-native-worklets@~0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/react-native-worklets/-/react-native-worklets-0.5.2.tgz#371f7dd5760cb04caa28b51a948d9a8e4049c308" + integrity sha512-lCzmuIPAK/UaOJYEPgYpVqrsxby1I54f7PyyZUMEO04nwc00CDrCvv9lCTY1daLHYTF8lS3f9zlzErfVsIKqkA== + dependencies: + "@babel/plugin-transform-arrow-functions" "^7.0.0-0" + "@babel/plugin-transform-class-properties" "^7.0.0-0" + "@babel/plugin-transform-classes" "^7.0.0-0" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.0.0-0" + "@babel/plugin-transform-optional-chaining" "^7.0.0-0" + "@babel/plugin-transform-shorthand-properties" "^7.0.0-0" + "@babel/plugin-transform-template-literals" "^7.0.0-0" + "@babel/plugin-transform-unicode-regex" "^7.0.0-0" + "@babel/preset-typescript" "^7.16.7" + convert-source-map "^2.0.0" + semver "7.7.2" + +react-native@0.81.5: + version "0.81.5" + resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.81.5.tgz#6c963f137d3979b22aef2d8482067775c8fe2fed" + integrity sha512-1w+/oSjEXZjMqsIvmkCRsOc8UBYv163bTWKTI8+1mxztvQPhCRYGTvZ/PL1w16xXHneIj/SLGfxWg2GWN2uexw== + 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" + +react-refresh@^0.14.0, react-refresh@^0.14.2: + version "0.14.2" + resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.2.tgz#3833da01ce32da470f1f936b9d477da5c7028bf9" + integrity sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA== + +react@19.1.0: + version "19.1.0" + resolved "https://registry.yarnpkg.com/react/-/react-19.1.0.tgz#926864b6c48da7627f004795d6cce50e90793b75" + integrity sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg== + +reflect.getprototypeof@^1.0.10, reflect.getprototypeof@^1.0.9: + version "1.0.10" + resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz#c629219e78a3316d8b604c765ef68996964e7bf9" + integrity sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw== + dependencies: + call-bind "^1.0.8" + define-properties "^1.2.1" + es-abstract "^1.23.9" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.7" + get-proto "^1.0.1" + which-builtin-type "^1.2.1" + +regenerate-unicode-properties@^10.2.2: + version "10.2.2" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz#aa113812ba899b630658c7623466be71e1f86f66" + integrity sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g== + dependencies: + regenerate "^1.4.2" + +regenerate@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== + +regenerator-runtime@^0.13.2: + version "0.13.11" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" + integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== + +regexp.prototype.flags@^1.5.3, regexp.prototype.flags@^1.5.4: + version "1.5.4" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz#1ad6c62d44a259007e55b3970e00f746efbcaa19" + integrity sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA== + dependencies: + call-bind "^1.0.8" + define-properties "^1.2.1" + es-errors "^1.3.0" + get-proto "^1.0.1" + gopd "^1.2.0" + set-function-name "^2.0.2" + +regexpu-core@^6.3.1: + version "6.4.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-6.4.0.tgz#3580ce0c4faedef599eccb146612436b62a176e5" + integrity sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA== + 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" + +regjsgen@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.8.0.tgz#df23ff26e0c5b300a6470cad160a9d090c3a37ab" + integrity sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q== + +regjsparser@^0.13.0: + version "0.13.2" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.13.2.tgz#f654734b5c588b22ba3e21693b30523417180808" + integrity sha512-NgRBy2Nx/bE+9F27nVHnqcN5HjyLmecqsqx2PJHu3/IEtADD4WuxuXIVExD5PoSDFVrl78dOonfcOe5O+5nbzQ== + dependencies: + jsesc "~3.1.0" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +requireg@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/requireg/-/requireg-0.2.2.tgz#437e77a5316a54c9bcdbbf5d1f755fe093089830" + integrity sha512-nYzyjnFcPNGR3lx9lwPPPnuQxv6JWEZd2Ci0u9opN7N5zUEPIhY/GbL3vMGOr2UXwEg9WwSyV9X9Y/kLFgPsOg== + dependencies: + nested-error-stacks "~2.0.1" + rc "~1.2.7" + resolve "~1.7.1" + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve-pkg-maps@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" + integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== + +resolve-workspace-root@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/resolve-workspace-root/-/resolve-workspace-root-2.0.1.tgz#9cbbf8321ebccaaf0e4ffea5274aa26b611ccd62" + integrity sha512-nR23LHAvaI6aHtMg6RWoaHpdR4D881Nydkzi2CixINyg9T00KgaJdJI6Vwty+Ps8WLxZHuxsS0BseWjxSA4C+w== + +resolve.exports@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.3.tgz#41955e6f1b4013b7586f873749a635dea07ebe3f" + integrity sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A== + +resolve@^1.22.11, resolve@^1.22.2: + version "1.22.12" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.12.tgz#f5b2a680897c69c238a13cd16b15671f8b73549f" + integrity sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA== + dependencies: + es-errors "^1.3.0" + is-core-module "^2.16.1" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +resolve@^2.0.0-next.5, resolve@^2.0.0-next.6: + version "2.0.0-next.7" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.7.tgz#ba3b035d4b1ee7c522426eee73cabcb0fd5515dd" + integrity sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ== + dependencies: + es-errors "^1.3.0" + is-core-module "^2.16.2" + node-exports-info "^1.6.0" + object-keys "^1.1.1" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +resolve@~1.7.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.7.1.tgz#aadd656374fd298aee895bc026b8297418677fd3" + integrity sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw== + dependencies: + path-parse "^1.0.5" + +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + integrity sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q== + dependencies: + onetime "^2.0.0" + signal-exit "^3.0.2" + +reusify@^1.0.4: + version "1.1.0" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.1.0.tgz#0fe13b9522e1473f51b558ee796e08f11f9b489f" + integrity sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw== + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +rxjs@^7.5.2: + version "7.8.2" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.2.tgz#955bc473ed8af11a002a2be52071bf475638607b" + integrity sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA== + dependencies: + tslib "^2.1.0" + +safe-array-concat@^1.1.3: + version "1.1.4" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.4.tgz#a54cc9b61a57f33b42abad3cbdda3a2b38cc5719" + integrity sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg== + dependencies: + call-bind "^1.0.9" + call-bound "^1.0.4" + get-intrinsic "^1.3.0" + has-symbols "^1.1.0" + isarray "^2.0.5" + +safe-buffer@5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-push-apply@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/safe-push-apply/-/safe-push-apply-1.0.0.tgz#01850e981c1602d398c85081f360e4e6d03d27f5" + integrity sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA== + dependencies: + es-errors "^1.3.0" + isarray "^2.0.5" + +safe-regex-test@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.1.0.tgz#7f87dfb67a3150782eaaf18583ff5d1711ac10c1" + integrity sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + is-regex "^1.2.1" + +sax@>=0.6.0: + version "1.6.1" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.6.1.tgz#4c23cf608c0b693ab54b4b5888e92cfe977b9843" + integrity sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q== + +scheduler@0.26.0: + version "0.26.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.26.0.tgz#4ce8a8c2a2095f13ea11bf9a445be50c555d6337" + integrity sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA== + +semver@7.7.2: + version "7.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.2.tgz#67d99fdcd35cec21e6f8b87a7fd515a33f982b58" + integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA== + +semver@^6.3.0, semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.1.3, semver@^7.3.5, semver@^7.5.4, semver@^7.6.0, semver@^7.7.1, semver@^7.7.2, semver@^7.7.3: + version "7.8.5" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.8.5.tgz#39b646037dd50c14fb451e7e4cac58ed8b863f69" + integrity sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA== + +send@^0.19.0, send@~0.19.1: + version "0.19.2" + resolved "https://registry.yarnpkg.com/send/-/send-0.19.2.tgz#59bc0da1b4ea7ad42736fd642b1c4294e114ff29" + integrity sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg== + 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" + +serialize-error@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-2.1.0.tgz#50b679d5635cdf84667bdc8e59af4e5b81d5f60a" + integrity sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw== + +serve-static@^1.16.2: + version "1.16.3" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.3.tgz#a97b74d955778583f3862a4f0b841eb4d5d78cf9" + integrity sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA== + dependencies: + encodeurl "~2.0.0" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "~0.19.1" + +set-function-length@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== + 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" + +set-function-name@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" + integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.2" + +set-proto@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/set-proto/-/set-proto-1.0.0.tgz#0760dbcff30b2d7e801fd6e19983e56da337565e" + integrity sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw== + dependencies: + dunder-proto "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + +setprototypeof@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shell-quote@^1.6.1: + version "1.10.0" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.10.0.tgz#482033e192e4f5c07151521ffa03400ec71b1b0f" + integrity sha512-w1aiOKwKuRgtwAReIIj89puqg+I7GvX4IbLrvmhXbzQsj1+Zwi4VO3+fa6ZF91TWSjIxoEkKnMeHcLEODK5ZXA== + +side-channel-list@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.1.tgz#c2e0b5a14a540aebee3bbc6c3f8666cc9b509127" + integrity sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w== + dependencies: + es-errors "^1.3.0" + object-inspect "^1.13.4" + +side-channel-map@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/side-channel-map/-/side-channel-map-1.0.1.tgz#d6bb6b37902c6fef5174e5f533fab4c732a26f42" + integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + +side-channel-weakmap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz#11dda19d5368e40ce9ec2bdc1fb0ecbc0790ecea" + integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + side-channel-map "^1.0.1" + +side-channel@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.1.tgz#ea02c62e05dc4bea67d4442f0fb71ee192f8e0ab" + integrity sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ== + dependencies: + es-errors "^1.3.0" + object-inspect "^1.13.4" + side-channel-list "^1.0.1" + side-channel-map "^1.0.1" + side-channel-weakmap "^1.0.2" + +signal-exit@^3.0.2, signal-exit@^3.0.7: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +simple-plist@^1.1.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/simple-plist/-/simple-plist-1.3.1.tgz#16e1d8f62c6c9b691b8383127663d834112fb017" + integrity sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw== + dependencies: + bplist-creator "0.1.0" + bplist-parser "0.3.1" + plist "^3.0.5" + +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slugify@^1.3.4, slugify@^1.6.6: + version "1.6.9" + resolved "https://registry.yarnpkg.com/slugify/-/slugify-1.6.9.tgz#610957dea21e56b65e3a153215ef7b265715c8e8" + integrity sha512-vZ7rfeehZui7wQs438JXBckYLkIIdfHOXsaVEUMyS5fHo1483l1bMdo0EDSWYclY0yZKFOipDy4KHuKs6ssvdg== + +source-map-js@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" + integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== + +source-map-support@~0.5.20, source-map-support@~0.5.21: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== + +source-map@^0.6.0: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + +stable-hash@^0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/stable-hash/-/stable-hash-0.0.5.tgz#94e8837aaeac5b4d0f631d2972adef2924b40269" + integrity sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA== + +stack-utils@^2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" + integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== + dependencies: + escape-string-regexp "^2.0.0" + +stackframe@^1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.3.4.tgz#b881a004c8c149a5e8efef37d51b16e412943310" + integrity sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw== + +stacktrace-parser@^0.1.10: + version "0.1.11" + resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.11.tgz#c7c08f9b29ef566b9a6f7b255d7db572f66fabc4" + integrity sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg== + dependencies: + type-fest "^0.7.1" + +statuses@~1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== + +statuses@~2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.2.tgz#8f75eecef765b5e1cfcdc080da59409ed424e382" + integrity sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw== + +stop-iteration-iterator@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz#f481ff70a548f6124d0312c3aa14cbfa7aa542ad" + integrity sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ== + dependencies: + es-errors "^1.3.0" + internal-slot "^1.1.0" + +stream-buffers@2.2.x: + version "2.2.0" + resolved "https://registry.yarnpkg.com/stream-buffers/-/stream-buffers-2.2.0.tgz#91d5f5130d1cef96dcfa7f726945188741d09ee4" + integrity sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg== + +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string.prototype.matchall@^4.0.12: + version "4.0.12" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz#6c88740e49ad4956b1332a911e949583a275d4c0" + integrity sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + define-properties "^1.2.1" + es-abstract "^1.23.6" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.6" + gopd "^1.2.0" + has-symbols "^1.1.0" + internal-slot "^1.1.0" + regexp.prototype.flags "^1.5.3" + set-function-name "^2.0.2" + side-channel "^1.1.0" + +string.prototype.repeat@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz#e90872ee0308b29435aa26275f6e1b762daee01a" + integrity sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + +string.prototype.trim@^1.2.10: + version "1.2.11" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.11.tgz#e6bd19cda3985d05a42dda31f3ddf4d35d3430e3" + integrity sha512-PwvK7BU+CMTJGYQCTZb5RWXIML92lftJLhQz1tBzgKiqGxJaMlBAa48POXaNAC2s4y8jr3EFqrkF9+44neS46w== + dependencies: + call-bind "^1.0.9" + call-bound "^1.0.4" + define-data-property "^1.1.4" + define-properties "^1.2.1" + es-abstract "^1.24.2" + es-object-atoms "^1.1.2" + has-property-descriptors "^1.0.2" + safe-regex-test "^1.1.0" + +string.prototype.trimend@^1.0.9: + version "1.0.10" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.10.tgz#be6bcf4f3fe0460bdeccdb2cf4f971b310f8346e" + integrity sha512-2+3aDAOmPTmuFwjDnmJG2ctEkQKVki7vOSqaxkv42Mowj1V6PnvuwFCRrR5lChUux1TBskPjfkeTOhqczDMxTw== + dependencies: + call-bind "^1.0.9" + call-bound "^1.0.4" + define-properties "^1.2.1" + es-object-atoms "^1.1.2" + +string.prototype.trimstart@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" + integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== + +strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== + +structured-headers@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/structured-headers/-/structured-headers-0.4.1.tgz#77abd9410622c6926261c09b9d16cf10592694d1" + integrity sha512-0MP/Cxx5SzeeZ10p/bZI0S6MpgD+yxAhi1BOQ34jgnMXsCq3j1t6tQnZu+KdlL7dvJTLT3g9xN8tl10TqgFMcg== + +sucrase@~3.35.1: + version "3.35.1" + resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.35.1.tgz#4619ea50393fe8bd0ae5071c26abd9b2e346bfe1" + integrity sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw== + 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" + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.0.0, supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-hyperlinks@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz#3943544347c1ff90b15effb03fc14ae45ec10624" + integrity sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA== + dependencies: + has-flag "^4.0.0" + supports-color "^7.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +tar@^7.5.2: + version "7.5.22" + resolved "https://registry.yarnpkg.com/tar/-/tar-7.5.22.tgz#a696f998136e71487dc3f869a85bba2c67971ba9" + integrity sha512-MFO/QzvtAOmJbkhOaCTvbGcFN9L9b+JunIsDwaKljSOdcLMea3NJ1k9Usz/rjdfSXTq4dfzfeS7W4p4YOAAHeA== + dependencies: + "@isaacs/fs-minipass" "^4.0.0" + chownr "^3.0.0" + minipass "^7.1.2" + minizlib "^3.1.0" + yallist "^5.0.0" + +terminal-link@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" + integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== + dependencies: + ansi-escapes "^4.2.1" + supports-hyperlinks "^2.0.0" + +terser@^5.15.0: + version "5.49.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.49.0.tgz#30b341fdf70cfc98486965125ae660fda8403670" + integrity sha512-SNiDnXyHSrxVcIOtVbULzcTmniUiwcV7Nwdyj1twVubeTmbjoa8p69KKDpfkdoOavuM4/GRm1+ykI8qqnavHoA== + dependencies: + "@jridgewell/source-map" "^0.3.3" + acorn "^8.15.0" + commander "^2.20.0" + source-map-support "~0.5.20" + +test-exclude@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== + dependencies: + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" + minimatch "^3.0.4" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +thenify-all@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" + integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== + dependencies: + thenify ">= 3.1.0 < 4" + +"thenify@>= 3.1.0 < 4": + version "3.3.1" + resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" + integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== + dependencies: + any-promise "^1.0.0" + +throat@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/throat/-/throat-5.0.0.tgz#c5199235803aad18754a667d659b5e72ce16764b" + integrity sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA== + +tinyglobby@^0.2.11, tinyglobby@^0.2.13, tinyglobby@^0.2.15: + version "0.2.17" + resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.17.tgz#562a9a6c9eb2b3b123d39719f9af5bb44fcd7631" + integrity sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g== + dependencies: + fdir "^6.5.0" + picomatch "^4.0.4" + +tmpl@1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" + integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +toidentifier@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +ts-api-utils@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-2.5.0.tgz#4acd4a155e22734990a5ed1fe9e97f113bcb37c1" + integrity sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA== + +ts-interface-checker@^0.1.9: + version "0.1.13" + resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" + integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== + +tsconfig-paths@^3.15.0: + version "3.15.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" + integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.2" + minimist "^1.2.6" + strip-bom "^3.0.0" + +tslib@^2.1.0, tslib@^2.4.0: + version "2.8.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" + integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-detect@4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +type-fest@^0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" + integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== + +typed-array-buffer@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz#a72395450a4869ec033fd549371b47af3a2ee536" + integrity sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw== + dependencies: + call-bound "^1.0.3" + es-errors "^1.3.0" + is-typed-array "^1.1.14" + +typed-array-byte-length@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz#8407a04f7d78684f3d252aa1a143d2b77b4160ce" + integrity sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg== + dependencies: + call-bind "^1.0.8" + for-each "^0.3.3" + gopd "^1.2.0" + has-proto "^1.2.0" + is-typed-array "^1.1.14" + +typed-array-byte-offset@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz#ae3698b8ec91a8ab945016108aef00d5bff12355" + integrity sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.8" + for-each "^0.3.3" + gopd "^1.2.0" + has-proto "^1.2.0" + is-typed-array "^1.1.15" + reflect.getprototypeof "^1.0.9" + +typed-array-length@^1.0.7: + version "1.0.8" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.8.tgz#0b70e982c9e9dafe2def6d6458ff4b3f2d2b6d70" + integrity sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g== + dependencies: + call-bind "^1.0.9" + for-each "^0.3.5" + gopd "^1.2.0" + is-typed-array "^1.1.15" + possible-typed-array-names "^1.1.0" + reflect.getprototypeof "^1.0.10" + +typed-emitter@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/typed-emitter/-/typed-emitter-2.1.0.tgz#ca78e3d8ef1476f228f548d62e04e3d4d3fd77fb" + integrity sha512-g/KzbYKbH5C2vPkaXGu8DJlHrGKHLsM25Zg9WuC9pMGfuvT+X25tZQWo5fK1BjBm8+UrVE9LDCvaY0CQk+fXDA== + optionalDependencies: + rxjs "^7.5.2" + +typescript@~5.9.2: + version "5.9.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.9.3.tgz#5b4f59e15310ab17a216f5d6cf53ee476ede670f" + integrity sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw== + +unbox-primitive@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.1.0.tgz#8d9d2c9edeea8460c7f35033a88867944934d1e2" + integrity sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw== + dependencies: + call-bound "^1.0.3" + has-bigints "^1.0.2" + has-symbols "^1.1.0" + which-boxed-primitive "^1.1.1" + +undici-types@~8.3.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-8.3.0.tgz#44e9fc9f3244648cdea35e4f9bb2d681e9410809" + integrity sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ== + +undici@^6.18.2: + version "6.28.0" + resolved "https://registry.yarnpkg.com/undici/-/undici-6.28.0.tgz#9f0e385744fef5021d6596c5bccd783f61193c1c" + integrity sha512-LIY910g9TI13YS95lrMFrs8Rm/u/irgHeTWoKCoteeJ04CUJ92eEfj0rVn+7VKMPBpUPiUoBKfhNyLI23EE/KA== + +unicode-canonical-property-names-ecmascript@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz#cb3173fe47ca743e228216e4a3ddc4c84d628cc2" + integrity sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg== + +unicode-match-property-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" + integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== + dependencies: + unicode-canonical-property-names-ecmascript "^2.0.0" + unicode-property-aliases-ecmascript "^2.0.0" + +unicode-match-property-value-ecmascript@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz#65a7adfad8574c219890e219285ce4c64ed67eaa" + integrity sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg== + +unicode-property-aliases-ecmascript@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz#301d4f8a43d2b75c97adfad87c9dd5350c9475d1" + integrity sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ== + +unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +unrs-resolver@^1.6.2: + version "1.12.2" + resolved "https://registry.yarnpkg.com/unrs-resolver/-/unrs-resolver-1.12.2.tgz#a6c6888396abba5adaac4cab6587df866f1d7afd" + integrity sha512-dmlRxBJJayXjqTwC+JtF1HhJmgf3ftQ3YejFcZrf4+KKtJv0qDsK1pjqaaVjG7wJ5NJ6UVP1OqRMQ71Z4C3rxQ== + dependencies: + napi-postinstall "^0.3.4" + optionalDependencies: + "@unrs/resolver-binding-android-arm-eabi" "1.12.2" + "@unrs/resolver-binding-android-arm64" "1.12.2" + "@unrs/resolver-binding-darwin-arm64" "1.12.2" + "@unrs/resolver-binding-darwin-x64" "1.12.2" + "@unrs/resolver-binding-freebsd-x64" "1.12.2" + "@unrs/resolver-binding-linux-arm-gnueabihf" "1.12.2" + "@unrs/resolver-binding-linux-arm-musleabihf" "1.12.2" + "@unrs/resolver-binding-linux-arm64-gnu" "1.12.2" + "@unrs/resolver-binding-linux-arm64-musl" "1.12.2" + "@unrs/resolver-binding-linux-loong64-gnu" "1.12.2" + "@unrs/resolver-binding-linux-loong64-musl" "1.12.2" + "@unrs/resolver-binding-linux-ppc64-gnu" "1.12.2" + "@unrs/resolver-binding-linux-riscv64-gnu" "1.12.2" + "@unrs/resolver-binding-linux-riscv64-musl" "1.12.2" + "@unrs/resolver-binding-linux-s390x-gnu" "1.12.2" + "@unrs/resolver-binding-linux-x64-gnu" "1.12.2" + "@unrs/resolver-binding-linux-x64-musl" "1.12.2" + "@unrs/resolver-binding-openharmony-arm64" "1.12.2" + "@unrs/resolver-binding-wasm32-wasi" "1.12.2" + "@unrs/resolver-binding-win32-arm64-msvc" "1.12.2" + "@unrs/resolver-binding-win32-ia32-msvc" "1.12.2" + "@unrs/resolver-binding-win32-x64-msvc" "1.12.2" + +update-browserslist-db@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz#64d76db58713136acbeb4c49114366cc6cc2e80d" + integrity sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w== + dependencies: + escalade "^3.2.0" + picocolors "^1.1.1" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== + +uuid@^11.1.0: + version "11.1.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-11.1.1.tgz#f6d81d2e1c65d00762e5e29b16c5d2d995e208ad" + integrity sha512-vIYxrBCC/N/K+Js3qSN88go7kIfNPssr/hHCesKCQNAjmgvYS2oqr69kIufEG+O4+PfezOH4EbIeHCfFov8ZgQ== + +uuid@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-7.0.3.tgz#c5c9f2c8cf25dc0a372c4df1441c41f5bd0c680b" + integrity sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg== + +validate-npm-package-name@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz#a316573e9b49f3ccd90dbb6eb52b3f06c6d604e8" + integrity sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ== + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + +vlq@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/vlq/-/vlq-1.0.1.tgz#c003f6e7c0b4c1edd623fd6ee50bbc0d6a1de468" + integrity sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w== + +walker@^1.0.7, walker@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" + integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== + dependencies: + makeerror "1.0.12" + +wcwidth@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== + dependencies: + defaults "^1.0.3" + +webidl-conversions@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" + integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== + +whatwg-fetch@^3.0.0: + version "3.6.20" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz#580ce6d791facec91d37c72890995a0b48d31c70" + integrity sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg== + +whatwg-url-without-unicode@8.0.0-3: + version "8.0.0-3" + resolved "https://registry.yarnpkg.com/whatwg-url-without-unicode/-/whatwg-url-without-unicode-8.0.0-3.tgz#ab6df4bf6caaa6c85a59f6e82c026151d4bb376b" + integrity sha512-HoKuzZrUlgpz35YO27XgD28uh/WJH4B0+3ttFqRo//lmq+9T/mIOJ6kqmINI9HpUpz1imRC/nR/lxKpJiv0uig== + dependencies: + buffer "^5.4.3" + punycode "^2.1.1" + webidl-conversions "^5.0.0" + +which-boxed-primitive@^1.1.0, which-boxed-primitive@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz#d76ec27df7fa165f18d5808374a5fe23c29b176e" + integrity sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA== + dependencies: + is-bigint "^1.1.0" + is-boolean-object "^1.2.1" + is-number-object "^1.1.1" + is-string "^1.1.1" + is-symbol "^1.1.1" + +which-builtin-type@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.2.1.tgz#89183da1b4907ab089a6b02029cc5d8d6574270e" + integrity sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q== + dependencies: + call-bound "^1.0.2" + function.prototype.name "^1.1.6" + has-tostringtag "^1.0.2" + is-async-function "^2.0.0" + is-date-object "^1.1.0" + is-finalizationregistry "^1.1.0" + is-generator-function "^1.0.10" + is-regex "^1.2.1" + is-weakref "^1.0.2" + isarray "^2.0.5" + which-boxed-primitive "^1.1.0" + which-collection "^1.0.2" + which-typed-array "^1.1.16" + +which-collection@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0" + integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== + dependencies: + is-map "^2.0.3" + is-set "^2.0.3" + is-weakmap "^2.0.2" + is-weakset "^2.0.3" + +which-typed-array@^1.1.16, which-typed-array@^1.1.19: + version "1.1.22" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.22.tgz#8f3cc78aefb40b437346dd40a1dbfa5d1da43fe9" + integrity sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.9" + call-bound "^1.0.4" + for-each "^0.3.5" + get-proto "^1.0.1" + gopd "^1.2.0" + has-tostringtag "^1.0.2" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wonka@^6.3.2: + version "6.3.6" + resolved "https://registry.yarnpkg.com/wonka/-/wonka-6.3.6.tgz#a70e2e54ed6aaa8e20bb57d916166cdc3d385f2d" + integrity sha512-MXH+6mDHAZ2GuMpgKS055FR6v0xVP3XwquxIMYXgiW+FejHQlMGlvVRZT4qMCxR+bEo/FCtIdKxwej9WV3YQag== + +word-wrap@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +write-file-atomic@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" + integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== + dependencies: + imurmurhash "^0.1.4" + signal-exit "^3.0.7" + +ws@^6.2.3: + version "6.2.6" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.6.tgz#545a6a915b00b660937f7f2c3084d623fb2fc59f" + integrity sha512-XTrf1gv7kXoVf1hbC3PAyAiPgR8Wz1blcrYIjEsUmr08BLksT41R8KbjmS9408C2ERx7v1JDLD/BkpLEttjfKA== + dependencies: + async-limiter "~1.0.0" + +ws@^7, ws@^7.5.10: + version "7.5.13" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.13.tgz#12aa507eaca76c295c278b1aebf4698ab2c1845f" + integrity sha512-rsKI6xDBFVf4r/x8XyChGK04QR/XHroxs/jUcoWvtEZM8TPU/X/uIY9B1CsSzYws9ZJb/6bbBu7dPhFW00CAoA== + +ws@^8.12.1: + version "8.21.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.21.1.tgz#045650cd4b1207809e7547146223c3814a9af586" + integrity sha512-+0NTnW77fFN/DjQi6k/Sq/Yvk4Sgajw7urW8V+asjXnRgDs9gyGkdb7EzgfhA4goXsRIZKE28fzIXBHEzhuiWw== + +xcode@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/xcode/-/xcode-3.0.1.tgz#3efb62aac641ab2c702458f9a0302696146aa53c" + integrity sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA== + dependencies: + simple-plist "^1.1.0" + uuid "^7.0.3" + +xml2js@0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.6.0.tgz#07afc447a97d2bd6507a1f76eeadddb09f7a8282" + integrity sha512-eLTh0kA8uHceqesPqSE+VvO1CDDJWMwlQfB6LuN6T8w6MaDJ8Txm8P7s5cHD0miF0V+GGTZrDQfxPZQVsur33w== + dependencies: + sax ">=0.6.0" + xmlbuilder "~11.0.0" + +xmlbuilder@^15.1.1: + version "15.1.1" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-15.1.1.tgz#9dcdce49eea66d8d10b42cae94a79c3c8d0c2ec5" + integrity sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg== + +xmlbuilder@~11.0.0: + version "11.0.1" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" + integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yallist@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-5.0.0.tgz#00e2de443639ed0d78fd87de0d27469fbcffb533" + integrity sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw== + +yaml@^2.6.1: + version "2.9.0" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.9.0.tgz#78274afd93598a1dfdd6130df6a566defcbf9aa4" + integrity sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA== + +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs@^17.6.2: + version "17.7.3" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.3.tgz#779dffe6bcafec596a7172e983289a588647faaa" + integrity sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g== + 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" + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== diff --git a/mobile-react-native/voip-call/server/.env.example b/mobile-react-native/voip-call/server/.env.example new file mode 100644 index 0000000..e69de29 diff --git a/mobile-react-native/voip-call/server/.gitignore b/mobile-react-native/voip-call/server/.gitignore new file mode 100644 index 0000000..af6a1f3 --- /dev/null +++ b/mobile-react-native/voip-call/server/.gitignore @@ -0,0 +1,3 @@ +voip.db +apns.pem +fcm-credentials.json \ No newline at end of file diff --git a/mobile-react-native/voip-call/server/README.md b/mobile-react-native/voip-call/server/README.md new file mode 100644 index 0000000..303f7d5 --- /dev/null +++ b/mobile-react-native/voip-call/server/README.md @@ -0,0 +1,146 @@ +# voip-call-server + +## Run + +```bash +deno task start # listens on :4400 +``` + +## Credentials + +Both services are optional — configure APNs to call iOS devices, FCM to call +Android devices, or both to call between them. On startup the server prints which +services are enabled, and `/call` answers `503` when the callee's platform has no +credentials. + +## APNs certificate + +APNs auth is certificate-based — you need a **VoIP Services certificate** from your +Apple Developer account. See Apple's guide: +[Establishing a certificate-based connection to APNs](https://developer.apple.com/documentation/usernotifications/establishing-a-certificate-based-connection-to-apns). + +Drop the VoIP push certificate **and its private key, combined into one PEM**, at +`./apns.pem` — it's presented to APNs as a TLS client certificate. The bundle id and +sandbox host are set at the top of `main.ts`. + +```bash +# combine an exported cert + key into one PEM +cat cert.pem key.pem > apns.pem +``` + +## FCM credentials + +FCM (Android) push uses the [FCM HTTP v1 API](https://firebase.google.com/docs/cloud-messaging/send-message), +which authenticates with a **Firebase service account**. In the Firebase console +go to **Project settings → Service accounts → Generate new private key** and +download the JSON. See Google's guide: +[Authorize send requests](https://firebase.google.com/docs/cloud-messaging/auth-server). + +Drop the downloaded file at `./fcm-credentials.json` — the server reads +`client_email`, `private_key`, and `project_id` from it to mint an OAuth access +token scoped to `firebase.messaging`. + +## Push routing + +A push token is only valid with the service that issued it, so each device records +its `platform` (`ios` or `android`) when it registers. `/call` looks up the +**callee's** platform and rings them through the matching service — an Android +caller reaching an iOS callee goes out over APNs, and an iOS caller reaching an +Android callee goes out over FCM. + +## API + +| Method | Path | Body / Query | Description | +| --------- | --------------------- | ----------------------------------- | ---------------------------------------- | +| POST | `/register` | `{ username, voipToken, platform }` | Register / update device VoIP push token | +| GET | `/users?exclude=` | | List all registered users except `me` | +| POST | `/call` | `{ from, to, roomName, isVideo }` | Send a VoIP push to the callee | +| WebSocket | `/ws?username=` | | Bidirectional signaling socket | + +`platform` must be `"ios"` or `"android"`; anything else is rejected with `400`. + +## Signaling (WebSocket) + +Every connected app opens a persistent WebSocket at `/ws?username=`. The +server maintains an in-memory `username -> WebSocket` map and acts as a simple +relay: any JSON message that contains a `to` field is forwarded to that user's +socket, with `from` stamped to the sender's username. + +### Message: `call-cancelled` + +Sent by the **caller** when they cancel before the callee has answered. The +server relays it immediately to the callee, which calls `endCall()` to dismiss +the ringing UI. + +**Caller → Server:** + +```json +{ "type": "call-cancelled", "to": "", "roomName": "" } +``` + +**Server → Callee:** + +```json +{ + "type": "call-cancelled", + "to": "", + "roomName": "", + "from": "" +} +``` + +The callee only acts on this message when the call is still ringing (i.e. +`startedAt` is `null` and the call is not outgoing). If the call was already +answered the message is silently ignored. + +## APNs VoIP push payload + +The push is sent with the headers `apns-push-type: voip` and +`apns-topic: .voip`, to the VoIP token the app registered. The +payload forwarded to the callee's device (field semantics are in the +[VoIP calls guide](https://documentation.fishjam.io/docs/how-to/client/voip-calls#6-handle-an-incoming-call)): + +```json +{ + "roomName": "", + "displayName": "", + "isVideo": false, + "avatarUrl": "https://…/caller.jpg" +} +``` + +`avatarUrl` is optional. On **Android** the caller photo is downloaded and shown +in the incoming-call notification and full-screen UI (falling back to initials on +failure). On **iOS** CallKit cannot render caller images, so it is delivered to JS +(`onIncoming` payload) only for your own in-app UI. The server assigns each user one of +its bundled avatar images (served from `./avatars`) at registration, and sends +the caller's in the push. + +iOS 13+ requires that every received VoIP push immediately reports an incoming call to CallKit — the `@fishjam-cloud/react-native-webrtc` pod handles this automatically. + +## FCM push payload + +FCM values must be strings, so the same fields are sent as a high-priority +**data** message (`isVideo` is stringified), plus the `fishjam` discriminator +the SDK's messaging service keys on — a data message without it is never +treated as a call: + +```json +{ + "message": { + "token": "", + "data": { + "fishjam": "voip-incoming", + "roomName": "", + "displayName": "", + "isVideo": "false", + "avatarUrl": "https://…/caller.jpg" + }, + "android": { "priority": "high" } + } +} +``` + +The high-priority data message wakes `@fishjam-cloud/react-native-webrtc`'s +messaging service even when the app is backgrounded or killed, which reports the +incoming call to the native Telecom stack. diff --git a/mobile-react-native/voip-call/server/avatars/coral.png b/mobile-react-native/voip-call/server/avatars/coral.png new file mode 100644 index 0000000000000000000000000000000000000000..db8b92bdecc2e01de4971041a873ac8dc18ae531 GIT binary patch literal 10720 zcmXwfWmFtp(=9TAAwU=c1cxDb@ZioMgS$Jy3GO-p1_|yK++7mfouI)Tf(3VX`FP&D z?vL(Xt5=_0ed<(K*RHcel@uf~-x9q=KtRBhmJ(Nay$<|$08w7g6<2nZkqX>o{} z2jXD{dOEc_Y-g-w>CXsjC#&Et0-RmYX8g<_WSY9_>C;DT-P1DjU_c5T1@@KL2 zY`?iD)i*T_qYy+6hL0_thvxriDlIV}4mEFw;GsN$(%(n{UY zl=IY5`=+9Oi?yBk!;{y8rMK6T>d{`wUoY=$!5Wx?y*l{f0hP~FQMq1qhj}r(qTVjP ze!{;}hHrx76A>I20}1ZzHaDHNIHfB*zf$+)hSXFMutI*5X(fGUOFxqZq^`tQ(W4G( z6hS*PFPTPZgN16qazRc(Amb9H(t?JIth=WIW1$oAA-Db3A6%B0hyEZc{Z^xIQ-vqU!s;zffejn7PnCn6+@dV+#$gfANbsXIB|;-!F~V zL3v^)oG-P#t~-K|?}i`az=&P`J=hwGfx=OzM{suPuQ&sQ9-hau_**3ueeG0aTJ6I1lKL8D)-^5>TxHhxM6pco<27$HN$ z@i6Y&=+HhlIPWLJ1hH;lztpQx^z;0+stWEH#f=2#{jjzC7rGDo9BVCsxrK#E`+Gfj z>4XKe9V841XhH zDMM19C*HQrzIZ=>xeGL+mI*pmN`ANc(H>;O`CG;WbK6MxYe)nxh(5t5r#U7#uo5m@053<|6$cEZS+hzG*2+T1DKji4QWE`7)Emp6rkMF z(BUoTfwjjz&O6gJUaLoobo=?VaiKDQcT6z}Y5 zxb^sQZbXV{x<;C^&}?ouH{B4VM2w1F`8)L-TZ#CLQ;4PGXoKk;3FPv0iBHsXHCd&- z-s2|qLogzuPvn?IQNzm=q{clP_?f%rN%VDg=_sM!*Dnk27(W6uJVasP1O)j)SQrp< zi^3IfVzWt1reuBY4 zjWGli8jK5dR98V@Z}-<+Gp#(lT9)7;$<$_(fWd^+J1{Yvyed6%nTJz{6Bxxz8t?v^ z9F8Tw6KC{%_j|wLV;nqRvUIP5)~(cZ2s}|~JANA5Keo&p!}dokfsT;y9>e?zN~iJ{ zf!%$x6Ov3XKI~4@dn*%@eNv(r*s`uyaL|%>&$IKw>SbUkT~qjc~+X1j^e)o1evG{z0pI1c+{_EEwq<;+@yUV0!(6` z2HwAAOE&oI8!7|*d^{{XTgVYzZVgIRWCE7&_Ui2o$Ek4p=?r~o0n z#w;ZfvIZr9^*88$=1ldM$EWF05$ha}kkQ0;?Qf11Q|C=8gk+iHT?&qs2Jv zHwpaAteaM+Tu@iE^i>EGi5cjTq2*Gtq*|2Vw{7d`rQP6Zua4C!FDeWIe+V7??1E1t zb=t08kjhP#v>sU)c@7$9BkVQr`hbp;PpzB9Y$>MN2FZR87z+7g0N-S-6RbJP^Ww2K zpvpk5DYS$EL212~*pZ_Ev~L6wq1It^_WN8wwJ5)+39tq!UK38Q>Kxy`O(`dEI?V4A zs7wJc5%H*A(7PmYF$ZP^06}HF<>4g?fU|;oQhYP{jB{*{HE*nN^i`Ndu1))un}0$T z%tOZ|a$y-@rD*?<9o)Bv%I?~>tqSsIrBD$3hq-|yAN9Z~9cOyMlnU0Nix&BipH1JR z0fW)HIWJ^{gTLNOG6X7-4;JLm>%Bz+aCDK<1X}lSbvM>?>RnAsZkzD5%rpTv&`)|q zrR3jFJkA9AQJ_Hd6J-{IeRfM_`i*KCG)MX!+^j$2h#xJv!4t@)$_^{IsWY&_S^?QJ zs(Fl&>7I}166vNTia#VExTHP3pP&AG{DHPXj;pyx%u>M^$z`^Ty+%Zd&W1r~C-@?8 z*5>}yY(z{;^D@b9Ko~>!r#Y4;Oohpq7ZW)?D-`^-e|DxjUNc1oxsento`AFQx70oc z#14r}R3st)oF>{SIrBNpPpVMJ_J_~Xhuoi{=EKDM9Hhe#Ig4F!8u;zM6`GtM$vJJA zAJehD-=_tV0l=t;3-J@u;1o0)cx$|xr3nzHwnQ?i@wXN!I+UYLjYQLYchZ#+l`W&| zR1IESQc~cxwGSg)+^2_6@lr;SbP5VGC3R}^MUj}{^qAA<%Tm6*URTt8T9;EjNsB%* zJy3m}EG08e6oaPUCqCapZt*?8i3QeXIGV+tf{J?&VJ1Cp*OGk1g6HXvtdQbfTzNUD z=6hx6@OLi>hL9t1De+H`z=UKP?pPN0T9MJY8wab=-w~DT95wa>U2OioOFhCM;*)0n z7){^xXmK?;0}o;*lPG#IZ>S}?;1_?o2)*^%Qz4<=XNN_lV~bZn_{dTEz1iP0nd4L} ztN|kbIN=DAOW_i2q*NoQo%ilZ3#GV92BRkkejPC`)C{_&cxMJi%R@7*s|$a+>`CGl zw>scwBeQn;2x(1frK&d%j+kq`zwA}<8^JZ98ij@m!i3_p!-#q1=#i!m=b9u~dj08w zS@ZiAep2*xI9{R93o`vSLCbZsPurv)_?WR!%SPM*mT}18lVPC#uvQ(@qf%inExkGK zqRq8>{pU6!EY#6hu+oDO;zRxHs#oxF&rysEzZ7IP4aJc{yd$Kaf<|%Zai>3j@^3wf z3m4Zqz8xugbDqVm|6zFt$b5V?$ux(p9NHr+-@xRn=97qf@C$$~^TE-fYINZ(meJU`eUrund*(` zqUD~z9%Yc;HC3mWOECOYF`fjY`6DUI>A0ZpZe!s6IoNR|GZsO(9~>A=GNH2Rcv-Gl z?^%9u^3fYG8+MvgrT6Lye2q36X&ICmLus!5J|8T|e^uaqu)?IuV!s>dds~uRkbspq zVZsD}pWyE#6hjK()wg+1@5sx&&osV1zytnCfZj$UCn&zvr`!4*RB-XP($+R zfZ_}!yHs>ZShE_tgiIXue3pdspnP>~i|Q4qc2`F5#q18P2$zn^phNu-0ahtC9GK9k z%$-mUv<6XGQ))x73L(_#86(AAwVmdac~FO(Qv1b)bKNM}N-G8#F8y^5i?%3AO>6bX zNvG7Y&LkYA`R8vZlDt3tz%nISRYRR~=|3LVj5XT)MuY5^L%KPN=}u!Phl^uPYxJtc z2dHJ^!?Z3Q;gnK;y|yL`M9F^jF5<_BjBPvyRi!xjH_@+-*(MhQzq_F--amPyC$?~$S#p~`AdNp-LErSFa?C@U|A)L2 zm8`}#62uHiz^!5`d73v5(<|=hDrE=1&Hje~o4@$NA&pFqq+D54t>8zZEs3e$`rybL zud02tI`&&z?I@C~-xDfu)@l@5BJ4|NWh2T|DR_=8q8YATY^`S;ITCgCkZ0(eGK`y;*;@8{R)VM~wmd^G{#;O(F0rQr zp&-T5sZ!OMjwA}{NlQ2~hH|%t=sS{~B7rTUN|U8z+2lRyaY`HQP^+Fo&Hc1o0qOMl zl0dniC>NHoMuY8v-Z~R*H6+9e001^*r{eJc_X0|<&KVQKl77km>W*&5w-v4w67NEr z@FC_UaFx?8U`d);)~nU2G)cxQXx|fb5Gh_*(0gJJ(!aObuYTi9EPbkMSg1q#3aXq* z_jJd=XB%ItQEk)QZKYl46odRZ=%7h~UyitPD*DUR!J=XSj;<6OYaR=Ij&l7U-!&#J z5?pGlBmZ5&(_~jm=A;YiDDM-VU|*Pm`#G~e5puA+ePh;*&~yInJZ$xY{gb`#1Z zAwSmQ-g3za-i<#YKt>T(sP1XQv;N1hVi-^T6M6$_hPfGU&G!S%I(vTSoZ;2Bw8)x) z@u^BrqP?^gLGSaF1tx~8xa+)@!oC9czf6_Q54szb>2fT32BCbK)e$pR?uU*cN97W*x)V=Y=XA~d0~Pz#%i}*w zec6xPo%T6(y^6o)~ROOxju-3zI@}P`KCM2CdK9zKQ zT{WOsJj(xA;>j$V4VxM^VdhP$KY3nyp=^J6>X7YSYfIz0+Dzjp)Vm>R=u+pTvwj2>S>J+ zoZg3<&vJ%!VhXN>*6vW`UgHTxt)NS{gt)1vaJVAh)=u>7s-uSK7q_fX?xw9gEf^pI zgs`4r_qf+L-1ddLNN7cZt(4DzULZV>VU9Cw*BjjL*`Clx#`9KJDEFasH*8W_l9ysi zxXnxF$HYcaru2)#SY%cc#HRfWy8iGDd>C)8_7h-pZL6zbUVm9SwHCZXuf8N0Q_7EP zE9?mPwTv4v%iaG?8P3Q*$&qNSt5(&pF|T(ox1Q@I&%e$T$m9B#9_fp4dU8EEDTL0j zp99^_Lk8Hu9r#Vf;Q~1)YlJ0o)me&v%Kqzq{WzjIE;ou;;M)#9`Qdpg|Z#!*NkXH6r?`L~GZztn#dgfPCj7_~bDpCD}tYLc-IegaSPq|Z!bNDqt}_u*OFIu_Go``b z^M!U6nQLy!3z;kG1AO*PO9cjMEP%${A*_((=SLQl?)KO;`wlVjEpGd}R@M%kVV1e` zUCg*yLSN16=k~|xEbOed>-}09@AE3*6Ovy-{d1{#?PdQ&|4ylv8;>bpy6_8jU5nd$ zRXistp;oU7)M$SqCHKZU2qFRbVfPeL$`UDl09%c%PhC`) z+Eu$h+R!GgSYeQ$Q(yHa--f-<=^@H&FllM@I!G-+Z-Irc&&gmPR=I>TFd<0y1vM8O z!K(bIe?KgB-d85fTq%5VwehGr8+Llm^qOegm+p2#lldN(^^WGiGJm{8i;ab)l;L@$ zmLK;W@_O)0)lZF^uHg7@1$Dw(eW5IQl8wiNWg21b8O;jIF4sTwn@*VQah2Kb5+u59 zQ(!;gRO=u-mB@3^{T*+JLRl+jLR(siX zE($b>PeXAJ0`$EXCLR)Bp}E?mj7M4KzC$y!7Db7S6*v68&Wb-(%oc0kGz<<`7YG>- zyst!-CXgpk*Lyga9{Y)%0}Jt&2f77S!~gCI)`5TJ`#J=C$NSqJsMi_tKp5F%hsv(}t15M78{Z;7!-=?OX5(L4%}THy1{C zJIfXsnMOJpz$CZ}r7t-&5L8*;%zRbq_RHP5U;!P{s1cgfvbledEBzyCINkVcI^c*c zUM?7yag(0&=uY&IaelN@qapI6V|143p7=zOp67++2SGtIC!e0GBD>#!O7#?{jGQVf zxx^Ep>lbks$IeY^+nPrMDU~Nn0}|=nRfe!x1}_Y5fs)>+Tui2i*+XyWT-R-#$S;K%t(&VrV zK1P2xH)q@F^?QvCLh0NorsL@y3TZq5B5T?zSlUdsEtNR)d@G)=N;Q`>ER%4kn)=>S zbi(Zk&W$ed6Oj6Xq#*%~`R@J)_ejPVCiOn^t1{1=+VIqle!snP?l4Wc`NCwGTmbPs zQLk^S40XUfmu#?tTiufASrSgs&_$w3lE@Ca#B)}Y*ZK`LS!oP7=H%R7m@b!(Yx6M! zH~Aa1`R|RG;cc|{Kj*KdCrN6iBFh7&#HBT>*Jtp9796+4Lxki zJbW>D&z}JqvcmDr8$K$sUpc6;>^z*Vnn^{A7f*un=QTX*8KfTtThJG_o2MT#8=h4( zSuEV)O=(IFsNHN|=NBKjby$SOk~M>@g>Aj;WIgW;Il0ki$Qswb#Kf%#|2#@gfK|j4 zkXKsdcdIh?_pcbjCehHFC0L2IV`9%bV>Z&O9_w7EjixsUOCxuhpKgC`9<&qM(yQ1^ znI+?vkm=4jd<2JF_9e~7;hFwCSAx_C%5Q9D_9`Gz0w;M#TFSfssT7 zFcPx4EULAC`?qh%b!^&<*5A0NXIk=k{n$T^pPmp913{4iNGTlGvCi$Eg;jd71Gt(@ zFxk3Oa*|tHCpRSUJQ=na4QF<-QzrfcH5}YbE<@oAz93hKu1UuRgbp_pl)(Ym6-f?1 zz7e$PF$#N)aR)}y{WfrpM3SDDlrwNaCj`HlqPP1kaY5LWYxN_l|97CvV_b^WDwmf? zSfv_=SN7_w69(qf_hDW!DtJfXARnrSH$ z=UJhlC{~YrG@`B`zN_}_9*IUZTRITfJ<~j^GVEkes(8NN?jp=XzDFbOMgZYam59T^ zT54HF`pvQ54EQ=_9b#N)7{RDl2HrIZk9q!n(k?Cngre6=H!97AoZQ9~S_@BvE9TNx z8EqCjOpDk{7V@Qo5Ft`(qJo|EI=b?V42zLndc|%aGhc4{+1DGFXZ=nJ~@7@ zF>k(n`u%|-WA38SsN!AYl_r^UMBR&3=xfcNpIG)u_&*|&|9-VZ=1a$teDgcD`YlJP zRWfgPf%r6`=5LB(1#M~bbRjnSMOs{j(>z`w|8b48-#Wg;dxq5CC#*rq>^cTL)w{q^ z9eVEk2!pvqQdL7fX8#W}3_fOZ19h&mW#It{iIjB zf-%i@@69RDESS@ryVri5@UIYOGjEXIh;lU*6tB!m+g07V%q)2+3&CQL$;JJ@T!s{? zyO*D2qw1y1jZ*`^s|^}&^|I_DYke*-wv`L|lE;;Ap&isB$*u{ulJ zNh>&tDD7IZ!*}#L6E8%58?UMMZ{fb3L~^-s`&=t^^8b{q@z-N5y~p+H0wzhhF;VZ4Q$SR)2L!Qv!vMOz!a#d9uWZ z6Mb3>di?Eb(1GvsKb_4O>2`JO;+Bos?&vJ35c7w ziH;(w|I7nGS~v%jzQf$Pi>lh@u;pR7x|XdvV7E+KwE)Pna%u%O+#(nTPVFx?^nJsE zY!1br%%IFX3%XXY-=K<~COOqRCh`(5KrwYa3-uEkw${g4(ZVa~Jfjp_UU5#OVl;}g zZqYEhCWF~tDYC8srj??bv9EtA8640g^Av5QyV0?G8CLijhA5Vug`{b$Uj?qmxg}O= zu(uo&D&+H$*|QB#4MGGqfE3B*x=5HylPqmRXWpz%gYPMl8S#vQJ33jH$!oB-jqIbW z=b6>8aV|9Aw<=FJL3QEeiFNQq6pmg58z`n`nIrC|abrVW7vbsbLkDfHJ@KzZc^PNz zL6z_Ct|d>_#Y9O*Zqg_UPl#XUxB)3Y{+-U=qL1|Kxt{d*wI+i9;T*IVU^2RL4s*dR zNq-2Zd-5RnA;Hellst@Y^MGq>wxC_teRK8U>9{B$7{fa%B7<} zRwUzlMK>H51A1*)p5@=NXfKYc{Jz@px{xaxBI2}p@~4tkW!?v2q%&QBg6?=-FJvYP z4BXoWg{e*cOMDGi=uQ{|#S@$?^s^>tAEWj8sS9qai+9JauN3maV&T{URuR(ScD!YC zm>l8|`{|@pHgSI{DW1ReCwwz!q?!p4n8#j6EaiR}uYZr#-B7!(cUcls51w)nI0ueg zz3&6xe$)LsS}*BDW7_u2+UrMhxHRp6(yY3ANU3Fer(Tr9J#2}jJPA#hb?oQ;QTDbn zyXgQ{Z_Og^2fB=9>i;`3@U9ogTDG&~hkZ2o-HI(!D(2TenwKKG_R~JEq=RV44~4yF z^LtZ@x0tx9!6pa@Xt4iu0ff0A@d@RiEyd(Lg>`IkmX_xIAmHVjFIhsrr8^YO9o>Q^ z8(fS95^5c|W5E#R0z35jsF%q~VFG#rHWXXF#JU#kP*GOGY7txjsr1;VSbH4TH9w`A zn)>n)EA6WdasYY89jYP7Go;IKxF#YweO!)J& zS$a5i#J$Q*ctiH2s*hN4AjP{(cyq~|VdDl`JU#C?*Vad=4#jZqrTwriFVnJRiznw8 zZF-bL?$pU-#-ekO{=01}R6cV`S+l_XB5Ow2Oi7Fh35*6%D zxjvEuh{1;>VLX!oE}Iqj_}Z|PVummLnpkVrcHm+fXz#AY^o>$raQ}Zdhntl!M1l#ZqV+F$DK;zq+cDooM>?OqBVbhYECF=rmOaj$e8{VL9*Wgu3d~PUGx({rVB%^OE8L6 zmF7D6fP#;#pCaiE_2ov?C$eOK@SJ}**3S)b=O3?$tw6nW=p73Al&*&4MZWY^ZFYV;Jlw}PK6i=tp;}vKt@3P+C$0O zg>G;o0aBRVYCF2Avpf<>Bo$aBLZHF@C5^Mwl)413?Ive-qUzsdv!c*RjRatSn zFJqF0e=9qQ8S58+i6sES5s=-N)h`Y|C^3GeK-q5;%f#FCrvRc{=tZ(@9$bC9C~igh z5(~SgGi=Lv)na_Z!i69N7x`hyzNmZsZMmDo^J7Hnn!9ZsDsp1)vZUv50CYh!kH~d7 zJ?kyo+ZmuQiYsANXLsOhS1_8f-v&cMCN0ZMe|yq4yAJU7_5(SVQv*sW7@B53U&C-ce>=gwRDG;SWG0oL$qiuT^3p7F>Wa0p^t z!`5B5uw<5hD!w_fQm|?G*eR(H$@_R@_Ti6G<65LIziDS-vRVEHl%^L`=&oz}VegI@ zUWG9-R#m^D!BJq8wArD$IWL)ZQS-+F2Gy#C+3yJLU6Qw@LKRzIiF97wBOI|&q4)6a zDA0ZXpPVpb=`d&3KK49Z@f1_2)Ii^rC^!|2^5G~@*jBzA_Cx4722|RFUgf_#M%(!; z_R1J8`-7e8q5u#KsztV}^S};h{3eddP`$K$Jsu^#`dK_Jc1k*PTcSXuYeif{otDg)q_h1~%L` zi|Q%Y)M+wjzc`)k-TY-Ryp&x;q4_E2SzI$?^7C$1NvB2|{QIj? zPNNcr3d^+*u=D9SvIfRYA^*p;6e#-CMOPg)M3?DL;D{{ey^uJHf> literal 0 HcmV?d00001 diff --git a/mobile-react-native/voip-call/server/avatars/mint.png b/mobile-react-native/voip-call/server/avatars/mint.png new file mode 100644 index 0000000000000000000000000000000000000000..5a8dfd4298a3ebd638a6b78dab4b6b04d5f555a1 GIT binary patch literal 11036 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 literal 0 HcmV?d00001 diff --git a/mobile-react-native/voip-call/server/avatars/ocean.png b/mobile-react-native/voip-call/server/avatars/ocean.png new file mode 100644 index 0000000000000000000000000000000000000000..67df1936941a9a24cf7b43f429df9863b9883509 GIT binary patch literal 10867 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 B_+kJ6 literal 0 HcmV?d00001 diff --git a/mobile-react-native/voip-call/server/avatars/orchid.png b/mobile-react-native/voip-call/server/avatars/orchid.png new file mode 100644 index 0000000000000000000000000000000000000000..0e0f011d8b8f7e33ea8c41c4ca82adf5c1d141a8 GIT binary patch literal 10897 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%0A`H2`A!LX)52PSKxFS2PX-GzKSw%dh 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 literal 0 HcmV?d00001 diff --git a/mobile-react-native/voip-call/server/deno.json b/mobile-react-native/voip-call/server/deno.json new file mode 100644 index 0000000..b95a4f7 --- /dev/null +++ b/mobile-react-native/voip-call/server/deno.json @@ -0,0 +1,12 @@ +{ + "tasks": { + "start": "deno run --allow-net --allow-read --allow-env --allow-ffi main.ts" + }, + "imports": { + "@db/sqlite": "jsr:@db/sqlite@^0.12", + "google-auth-library": "npm:google-auth-library@^10.9.0" + }, + "fmt": { + "singleQuote": true + } +} diff --git a/mobile-react-native/voip-call/server/deno.lock b/mobile-react-native/voip-call/server/deno.lock new file mode 100644 index 0000000..694919a --- /dev/null +++ b/mobile-react-native/voip-call/server/deno.lock @@ -0,0 +1,207 @@ +{ + "version": "5", + "specifiers": { + "jsr:@db/sqlite@*": "0.13.0", + "jsr:@db/sqlite@0.12": "0.12.0", + "jsr:@denosaurs/plug@1": "1.1.0", + "jsr:@std/assert@0.217": "0.217.0", + "jsr:@std/encoding@1": "1.0.10", + "jsr:@std/fmt@1": "1.0.10", + "jsr:@std/fs@1": "1.0.24", + "jsr:@std/internal@^1.0.14": "1.0.14", + "jsr:@std/path@0.217": "0.217.0", + "jsr:@std/path@1": "1.1.5", + "jsr:@std/path@1.0": "1.0.9", + "jsr:@std/path@^1.1.5": "1.1.5", + "npm:google-auth-library@^10.9.0": "10.9.0" + }, + "jsr": { + "@db/sqlite@0.12.0": { + "integrity": "dd1ef7f621ad50fc1e073a1c3609c4470bd51edc0994139c5bf9851de7a6d85f", + "dependencies": [ + "jsr:@denosaurs/plug", + "jsr:@std/path@0.217" + ] + }, + "@db/sqlite@0.13.0": { + "integrity": "4545c635e0b3d4ddfdc0f2240f932f24b8ad0178e9c2e3a0f9403e7b18ae2fb5", + "dependencies": [ + "jsr:@denosaurs/plug", + "jsr:@std/path@1.0" + ] + }, + "@denosaurs/plug@1.1.0": { + "integrity": "eb2f0b7546c7bca2000d8b0282c54d50d91cf6d75cb26a80df25a6de8c4bc044", + "dependencies": [ + "jsr:@std/encoding", + "jsr:@std/fmt", + "jsr:@std/fs", + "jsr:@std/path@1" + ] + }, + "@std/assert@0.217.0": { + "integrity": "c98e279362ca6982d5285c3b89517b757c1e3477ee9f14eb2fdf80a45aaa9642" + }, + "@std/encoding@1.0.10": { + "integrity": "8783c6384a2d13abd5e9e87a7ae0520a30e9f56aeeaa3bdf910a3eaaf5c811a1" + }, + "@std/fmt@1.0.10": { + "integrity": "90dfba288802ac6de82fb31d0917eb9e4450b9925b954d5e51fc29ac07419db5" + }, + "@std/fs@1.0.24": { + "integrity": "f3061b45b81673a2bece689da041df32d174be064c89eb6397fb5718d3fb7877", + "dependencies": [ + "jsr:@std/internal", + "jsr:@std/path@^1.1.5" + ] + }, + "@std/internal@1.0.14": { + "integrity": "291516b3d4c35024d6ffbc0a9df5bf4c64116e05b50012cf846710152d2ffdf7" + }, + "@std/path@0.217.0": { + "integrity": "1217cc25534bca9a2f672d7fe7c6f356e4027df400c0e85c0ef3e4343bc67d11", + "dependencies": [ + "jsr:@std/assert" + ] + }, + "@std/path@1.0.9": { + "integrity": "260a49f11edd3db93dd38350bf9cd1b4d1366afa98e81b86167b4e3dd750129e" + }, + "@std/path@1.1.5": { + "integrity": "ccea00982ea28c36becaf6e62f855406c76a8c32d462f66f415bbb7d83a271bc", + "dependencies": [ + "jsr:@std/internal" + ] + } + }, + "npm": { + "agent-base@7.1.4": { + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==" + }, + "base64-js@1.5.1": { + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "bignumber.js@9.3.1": { + "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==" + }, + "buffer-equal-constant-time@1.0.1": { + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" + }, + "data-uri-to-buffer@4.0.1": { + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==" + }, + "debug@4.4.3": { + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dependencies": [ + "ms" + ] + }, + "ecdsa-sig-formatter@1.0.11": { + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dependencies": [ + "safe-buffer" + ] + }, + "extend@3.0.2": { + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "fetch-blob@3.2.0": { + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "dependencies": [ + "node-domexception", + "web-streams-polyfill" + ] + }, + "formdata-polyfill@4.0.10": { + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "dependencies": [ + "fetch-blob" + ] + }, + "gaxios@7.1.6": { + "integrity": "sha512-aIQ0QL8Or8vsUhHyXGA6AohOFRrAAiHhrvsAG6myzcSlfhxSXtnwXA/pRuQTilFgjhLe30swK5rg1d7E1f8Izw==", + "dependencies": [ + "extend", + "https-proxy-agent", + "node-fetch" + ] + }, + "gcp-metadata@8.1.2": { + "integrity": "sha512-zV/5HKTfCeKWnxG0Dmrw51hEWFGfcF2xiXqcA3+J90WDuP0SvoiSO5ORvcBsifmx/FoIjgQN3oNOGaQ5PhLFkg==", + "dependencies": [ + "gaxios", + "google-logging-utils", + "json-bigint" + ] + }, + "google-auth-library@10.9.0": { + "integrity": "sha512-xtvUqvINPhTaBm7nXqlYPcrMHJPm1lCNdSovxnKKhTm+4JsvQ+KGVYJViLoH9Yxu8w+T0Qv5HubzYT9BLrppJg==", + "dependencies": [ + "base64-js", + "ecdsa-sig-formatter", + "gaxios", + "gcp-metadata", + "google-logging-utils", + "jws" + ] + }, + "google-logging-utils@1.1.3": { + "integrity": "sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA==" + }, + "https-proxy-agent@7.0.6": { + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dependencies": [ + "agent-base", + "debug" + ] + }, + "json-bigint@1.0.0": { + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "dependencies": [ + "bignumber.js" + ] + }, + "jwa@2.0.1": { + "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", + "dependencies": [ + "buffer-equal-constant-time", + "ecdsa-sig-formatter", + "safe-buffer" + ] + }, + "jws@4.0.1": { + "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==", + "dependencies": [ + "jwa", + "safe-buffer" + ] + }, + "ms@2.1.3": { + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node-domexception@1.0.0": { + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "deprecated": true + }, + "node-fetch@3.3.2": { + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "dependencies": [ + "data-uri-to-buffer", + "fetch-blob", + "formdata-polyfill" + ] + }, + "safe-buffer@5.2.1": { + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "web-streams-polyfill@3.3.3": { + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==" + } + }, + "workspace": { + "dependencies": [ + "jsr:@db/sqlite@0.12", + "npm:google-auth-library@^10.9.0" + ] + } +} diff --git a/mobile-react-native/voip-call/server/main.ts b/mobile-react-native/voip-call/server/main.ts new file mode 100644 index 0000000..4d120f6 --- /dev/null +++ b/mobile-react-native/voip-call/server/main.ts @@ -0,0 +1,323 @@ +import { Database } from "@db/sqlite"; +import { JWT } from "google-auth-library"; + +const db = new Database("voip.db"); + +type DevicePlatform = "ios" | "android"; + +const isDevicePlatform = (value: unknown): value is DevicePlatform => + value === "ios" || value === "android"; + +db.exec(` + CREATE TABLE IF NOT EXISTS users ( + username TEXT NOT NULL PRIMARY KEY, + voip_token TEXT NOT NULL UNIQUE, + platform TEXT NOT NULL, + avatar TEXT, + updated_at INTEGER NOT NULL + ) +`); + +// --- Avatars (served from ./avatars) --- + +const AVATARS = ["orchid", "mint", "sunny", "coral", "ocean"] as const; +type AvatarName = (typeof AVATARS)[number]; + +const baseUrl = (req: Request) => + Deno.env.get("PUBLIC_BASE_URL") ?? new URL(req.url).origin; + +const avatarUrl = (req: Request, avatar: string) => + `${baseUrl(req)}/avatars/${avatar}.png`; + +/** + * Picks the avatar currently assigned to the fewest users (round-robin balance), + * breaking ties at random. Called once per user at registration. + */ +function assignLeastUsedAvatar(): AvatarName { + const counts = new Map(AVATARS.map((a) => [a, 0])); + const rows = db.sql<{ avatar: string | null }>` + SELECT avatar FROM users WHERE avatar IS NOT NULL + `; + for (const { avatar } of rows) { + if (avatar && counts.has(avatar as AvatarName)) { + counts.set(avatar as AvatarName, counts.get(avatar as AvatarName)! + 1); + } + } + const min = Math.min(...counts.values()); + const leastUsed = AVATARS.filter((a) => counts.get(a) === min); + return leastUsed[Math.floor(Math.random() * leastUsed.length)]; +} + +type PushParams = { + token: string; + roomName: string; + displayName: string; + isVideo: boolean; + avatarUrl?: string; +}; + +async function readIfPresent(path: string): Promise { + try { + return await Deno.readTextFile(path); + } catch (err) { + if (err instanceof Deno.errors.NotFound) return null; + throw err; + } +} + +// --- FCM push (Android) --- + +type ServiceAccount = { + client_email: string; + private_key: string; + project_id: string; +}; + +const fcmCredentials = await readIfPresent("./fcm-credentials.json"); +const serviceAccount: ServiceAccount | null = fcmCredentials + ? JSON.parse(fcmCredentials) + : null; + +const authClient = serviceAccount + ? new JWT({ + email: serviceAccount.client_email, + key: serviceAccount.private_key, + scopes: ["https://www.googleapis.com/auth/firebase.messaging"], + }) + : null; + +async function getAccessToken(client: JWT): Promise { + const { token } = await client.getAccessToken(); + if (!token) throw new Error("Failed to get access token"); + return token; +} + +async function sendFcmPush(params: PushParams): Promise { + if (!serviceAccount || !authClient) { + throw new Error("Android push requires ./fcm-credentials.json"); + } + const accessToken = await getAccessToken(authClient); + + const res = await fetch( + `https://fcm.googleapis.com/v1/projects/${serviceAccount.project_id}/messages:send`, + { + method: "POST", + headers: { + Authorization: `Bearer ${accessToken}`, + "Content-Type": "application/json", + }, + body: JSON.stringify({ + message: { + token: params.token, + data: { + // Discriminator the SDK's PushNotificationService keys on; a data + // message without it is never treated as a call. + fishjam: "voip-incoming", + roomName: params.roomName, + displayName: params.displayName, + isVideo: String(params.isVideo), + ...(params.avatarUrl ? { avatarUrl: params.avatarUrl } : {}), + }, + android: { priority: "high" }, + }, + }), + }, + ); + + if (!res.ok) { + const text = await res.text(); + throw new Error(`FCM push failed ${res.status}: ${text}`); + } +} + +// --- APNs VoIP push (certificate-based) --- + +const BUNDLE_ID = "io.fishjam.example.voipcall"; +const APNS_HOST = "api.development.push.apple.com"; + +const apnsPem = await readIfPresent("./apns.pem"); +const apnsClient = apnsPem + ? Deno.createHttpClient({ cert: apnsPem, key: apnsPem }) + : null; + +async function sendApnsPush(params: PushParams): Promise { + if (!apnsClient) { + throw new Error("iOS push requires ./apns.pem"); + } + const res = await fetch(`https://${APNS_HOST}/3/device/${params.token}`, { + client: apnsClient, + method: "POST", + headers: { + "apns-push-type": "voip", + "apns-topic": `${BUNDLE_ID}.voip`, + "content-type": "application/json", + }, + body: JSON.stringify({ + roomName: params.roomName, + displayName: params.displayName, + isVideo: params.isVideo, + ...(params.avatarUrl ? { avatarUrl: params.avatarUrl } : {}), + }), + }); + + if (!res.ok) { + const text = await res.text(); + throw new Error(`APNs push failed ${res.status}: ${text}`); + } +} + +// --- Push routing --- + +const sendPush: Record Promise> = + { + ios: sendApnsPush, + android: sendFcmPush, + }; + +// --- Helpers --- + +const json = (data: unknown, status = 200) => Response.json(data, { status }); + +// --- WebSocket signaling registry --- + +const sockets = new Map(); + +// --- Route handler --- + +Deno.serve({ port: 4400 }, async (req) => { + const url = new URL(req.url); + console.log(`${req.method} ${url.pathname}`); + + // POST /register { username, voipToken, platform } + if (req.method === "POST" && url.pathname === "/register") { + const { username, voipToken, platform } = (await req.json()) as { + username: string; + voipToken: string; + platform: string; + }; + if (!username || !voipToken) { + return json({ error: "username and voipToken are required" }, 400); + } + if (!isDevicePlatform(platform)) { + return json({ error: 'platform must be "ios" or "android"' }, 400); + } + const existing = db.sql<{ avatar: string | null }>` + SELECT avatar FROM users WHERE username = ${username} + `; + const avatar = existing[0]?.avatar ?? assignLeastUsedAvatar(); + db.exec( + `INSERT OR REPLACE INTO users (username, voip_token, platform, avatar, updated_at) VALUES (?, ?, ?, ?, ?)`, + [username, voipToken, platform, avatar, Date.now()], + ); + return json({ ok: true, avatarUrl: avatarUrl(req, avatar) }); + } + + // GET /users?exclude= + if (req.method === "GET" && url.pathname === "/users") { + const exclude = url.searchParams.get("exclude") ?? ""; + const rows = db.sql<{ username: string; avatar: string | null }>` + SELECT username, avatar FROM users WHERE username != ${exclude} ORDER BY username + `; + return json( + rows.map((r) => ({ + username: r.username, + avatarUrl: r.avatar ? avatarUrl(req, r.avatar) : null, + })), + ); + } + + // POST /call { from, to, roomName } + if (req.method === "POST" && url.pathname === "/call") { + const { from, to, roomName, isVideo } = (await req.json()) as { + from: string; + to: string; + roomName: string; + isVideo: boolean; + }; + if (!from || !to || !roomName) { + return json({ error: "from, to and roomName are required" }, 400); + } + + const calleeRows = db.sql<{ voip_token: string; platform: string | null }>` + SELECT voip_token, platform FROM users WHERE username = ${to} + `; + if (calleeRows.length === 0) { + return json({ error: "callee not found" }, 404); + } + const { voip_token: voipToken, platform } = calleeRows[0]; + if (!isDevicePlatform(platform)) { + return json({ error: "callee registered without a known platform" }, 409); + } + + const callerRows = db.sql<{ avatar: string | null }>` + SELECT avatar FROM users WHERE username = ${from} + `; + const callerAvatar = callerRows[0]?.avatar; + + try { + await sendPush[platform]({ + token: voipToken, + roomName: roomName, + displayName: from, + isVideo: isVideo, + avatarUrl: callerAvatar ? avatarUrl(req, callerAvatar) : undefined, + }); + } catch (err) { + console.error(`Failed to send ${platform} VoIP push:`, err); + return json({ error: "failed to send VoIP push" }, 502); + } + + return json({ ok: true }); + } + + // GET /ws?username= — bidirectional signaling socket + if (req.method === "GET" && url.pathname === "/ws") { + const username = url.searchParams.get("username"); + if (!username) return json({ error: "username required" }, 400); + + const { socket, response } = Deno.upgradeWebSocket(req); + socket.onopen = () => { + sockets.set(username, socket); + console.log(`${username} connected`); + }; + socket.onclose = () => { + if (sockets.get(username) === socket) sockets.delete(username); + console.log(`${username} disconnected`); + }; + socket.onmessage = (e) => { + let msg: { type?: string; to?: string; [key: string]: unknown }; + try { + msg = JSON.parse(e.data); + } catch { + return; + } + if (!msg.to) return; + const target = sockets.get(msg.to); + if (target?.readyState === WebSocket.OPEN) { + target.send(JSON.stringify({ ...msg, from: username })); + } + }; + return response; + } + + // GET /avatars/.png — serve the bundled avatar images + if (req.method === "GET" && url.pathname.startsWith("/avatars/")) { + const name = url.pathname.slice("/avatars/".length); + if (!/^[a-z0-9_-]+\.png$/.test(name)) { + return new Response("Not found", { status: 404 }); + } + try { + const file = await Deno.readFile(`./avatars/${name}`); + return new Response(file, { + headers: { + "content-type": "image/png", + "cache-control": "public, max-age=86400", + }, + }); + } catch { + return new Response("Not found", { status: 404 }); + } + } + + return new Response("Not found", { status: 404 }); +}); From 73ce0ae490ca8f573ee66893f689bbdabc276d98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Gadomski?= Date: Fri, 31 Jul 2026 15:42:15 +0200 Subject: [PATCH 2/7] Migrate with release candidates --- mobile-react-native/voip-call/README.md | 43 +- .../voip-call/app/.eslintrc.js | 16 - mobile-react-native/voip-call/app/.gitignore | 23 +- mobile-react-native/voip-call/app/App.tsx | 22 +- mobile-react-native/voip-call/app/README.md | 6 +- mobile-react-native/voip-call/app/app.json | 2 +- .../app/assets/images/adaptive-icon.png | Bin 3648 -> 10933 bytes .../voip-call/app/assets/images/favicon.png | Bin 1129 -> 1701 bytes .../app/assets/images/fishjam-logo.png | Bin 3761 -> 0 bytes .../voip-call/app/assets/images/icon.png | Bin 6483 -> 38730 bytes .../voip-call/app/assets/images/splash.png | Bin 6506 -> 64768 bytes .../voip-call/app/eslint.config.mjs | 59 ++ mobile-react-native/voip-call/app/index.js | 3 +- .../voip-call/app/metro.config.js | 30 - .../voip-call/app/package.json | 27 +- .../voip-call/app/src/hooks/useCallRoom.ts | 4 +- .../app/src/hooks/useCallSignaling.ts | 28 +- .../app/src/hooks/useDeviceRegistration.ts | 4 +- .../voip-call/app/src/hooks/usePlaceCall.ts | 6 +- .../app/src/hooks/useRecentsRedial.ts | 4 +- .../voip-call/app/src/screens/CallScreen.tsx | 4 +- .../voip-call/app/src/screens/InCallView.tsx | 10 +- .../voip-call/app/src/screens/LoginScreen.tsx | 15 - .../app/src/screens/OutgoingCallView.tsx | 4 +- .../voip-call/app/src/screens/UsersScreen.tsx | 6 +- mobile-react-native/voip-call/app/yarn.lock | 809 ++++-------------- 26 files changed, 297 insertions(+), 828 deletions(-) delete mode 100644 mobile-react-native/voip-call/app/.eslintrc.js delete mode 100644 mobile-react-native/voip-call/app/assets/images/fishjam-logo.png create mode 100644 mobile-react-native/voip-call/app/eslint.config.mjs delete mode 100644 mobile-react-native/voip-call/app/metro.config.js diff --git a/mobile-react-native/voip-call/README.md b/mobile-react-native/voip-call/README.md index 5a0dbae..bd4c5ac 100644 --- a/mobile-react-native/voip-call/README.md +++ b/mobile-react-native/voip-call/README.md @@ -5,7 +5,7 @@ push + signaling server (`server/`). Calls ring through the native call UI (CallKit on iOS, Telecom on Android) even when the app is backgrounded or killed, and connect through a Fishjam room. -How it all works (native configuration, `VoipProvider`, and the JS call flow) +How it all works (native configuration, `VoIPProvider`, and the JS call flow) is documented in the [VoIP calls guide](https://documentation.fishjam.io/docs/how-to/client/voip-calls); this README only covers running the example. @@ -39,6 +39,7 @@ devices, FCM to call Android devices, or both to call between them. `android/` by hand doesn't survive `expo prebuild --clean`. 3. **App environment.** Copy `app/.env.example` to `app/.env` and fill it in: + - `EXPO_PUBLIC_FISHJAM_ID`: your Fishjam app id. - `EXPO_PUBLIC_SANDBOX_API_URL`: the Sandbox API url from your Fishjam dashboard, used to mint peer tokens. @@ -47,11 +48,11 @@ devices, FCM to call Android devices, or both to call between them. machine's LAN address. 4. **Run on real devices.** VoIP pushes never reach the iOS Simulator, and FCM - needs Google Play services. + needs Google Play services. Install dependencies from the repo root + (`yarn`), then: ```bash cd app - yarn yarn ios # or: yarn android ``` @@ -59,39 +60,3 @@ To test it, register two users on two devices and call between them. The [guide's checklist](https://documentation.fishjam.io/docs/how-to/client/voip-calls#11-test-it) lists the paths worth checking: ringing with the app killed, Recents redial, and Hold & Accept. - -## Local SDK checkout - -Unlike the other examples here, this one does not build against published -packages alone. The VoIP support it needs is not on npm yet: - -- `@fishjam-cloud/ios-expo-voip` has never been published. -- The `useVoip` / `VoipProvider` API is missing from the published - `@fishjam-cloud/react-native-client`. -- The iOS `VoipManager` native code is missing from the published - `@fishjam-cloud/react-native-webrtc`. - -So `app/package.json` resolves those three through `link:` to a local -[`web-client-sdk`](https://github.com/fishjam-cloud/web-client-sdk) checkout, -expected as a sibling of this repository: - -``` -Desktop/ - examples/ <- you are here - web-client-sdk/ <- expected at ../../../../web-client-sdk -``` - -Two extra pieces make that work under Yarn 1 and Metro: - -- **`resolutions` in `app/package.json`.** The linked packages declare their own - dependencies with Yarn Berry's `workspace:*` protocol, which Yarn 1 cannot - resolve. The overrides pin those to the published `0.29.0` instead. The - top-level `link:` still wins for `react-native-webrtc`, so the local native - code is what actually gets built. -- **`app/metro.config.js`.** It adds the checkout to `watchFolders` and to - `nodeModulesPaths`, so Metro can bundle the symlinked sources, and forces a - single copy of `react` / `react-native`. - -If your checkout lives elsewhere, adjust the `link:` paths. Once the packages -ship to npm, replace each `link:` with a plain version range and delete both -`resolutions` and `app/metro.config.js`. diff --git a/mobile-react-native/voip-call/app/.eslintrc.js b/mobile-react-native/voip-call/app/.eslintrc.js deleted file mode 100644 index 61c7625..0000000 --- a/mobile-react-native/voip-call/app/.eslintrc.js +++ /dev/null @@ -1,16 +0,0 @@ -module.exports = { - root: true, - extends: ['expo'], - ignorePatterns: [ - 'dist/*', - 'node_modules/*', - 'ios/*', - 'android/*', - 'server/*', - '.eslintrc.js', - 'prettier.config.js', - ], - rules: { - 'import/no-unresolved': 'off', - }, -}; diff --git a/mobile-react-native/voip-call/app/.gitignore b/mobile-react-native/voip-call/app/.gitignore index 935c017..b737d82 100644 --- a/mobile-react-native/voip-call/app/.gitignore +++ b/mobile-react-native/voip-call/app/.gitignore @@ -1,11 +1,26 @@ +# Learn more https://docs.github.com/en/get-started/getting-started-with-git/ignoring-files + # dependencies node_modules/ # Expo .expo/ dist/ +web-build/ expo-env.d.ts +# Native +.kotlin/ +*.orig.* +*.jks +*.p8 +*.p12 +*.key +*.mobileprovision + +# Metro +.metro-health-check* + # debug npm-debug.* yarn-debug.* @@ -13,6 +28,11 @@ yarn-error.* # macOS .DS_Store +*.pem + +# local env files +.env +.env*.local # typescript *.tsbuildinfo @@ -21,4 +41,5 @@ yarn-error.* /ios /android -google-services.json \ No newline at end of file +# Firebase config — fetch your own from the Firebase console (see ../README.md) +google-services.json diff --git a/mobile-react-native/voip-call/app/App.tsx b/mobile-react-native/voip-call/app/App.tsx index 476ef05..e0dcc6b 100644 --- a/mobile-react-native/voip-call/app/App.tsx +++ b/mobile-react-native/voip-call/app/App.tsx @@ -1,17 +1,17 @@ +import type { VoIPIncomingPayload } from '@fishjam-cloud/react-native-client'; import { FishjamProvider, - useVoip, - VoipProvider, + useVoIP, + VoIPProvider, } from '@fishjam-cloud/react-native-client'; import { StatusBar } from 'expo-status-bar'; import { useCallback, useEffect, useRef } from 'react'; import { ActivityIndicator, StyleSheet, View } from 'react-native'; import { SafeAreaProvider } from 'react-native-safe-area-context'; -import type { VoipIncomingPayload } from '@fishjam-cloud/react-native-client'; import { - useCallSignaling, type SendSignalRef, + useCallSignaling, } from './src/hooks/useCallSignaling'; import { useDeviceRegistration } from './src/hooks/useDeviceRegistration'; import { useRecentsRedial } from './src/hooks/useRecentsRedial'; @@ -25,7 +25,7 @@ import { UserProvider } from './src/user/UserProvider'; function Main({ sendSignalRef }: { sendSignalRef: SendSignalRef }) { const { username, isLoading } = useUser(); - const { status, lastEndedReason } = useVoip(); + const { status, lastEndedReason } = useVoIP(); useRequestPermissions(); useCallSignaling(sendSignalRef); @@ -34,7 +34,7 @@ function Main({ sendSignalRef }: { sendSignalRef: SendSignalRef }) { useEffect(() => { if (!lastEndedReason) return; - console.log( + console.debug( `On user: ${username}, [VoIP] Call ended — reason: ${lastEndedReason}`, ); }, [lastEndedReason, username]); @@ -61,12 +61,12 @@ function Main({ sendSignalRef }: { sendSignalRef: SendSignalRef }) { return ; } -function VoipApp() { +function VoIPApp() { const sendSignalRef: SendSignalRef = useRef(undefined); // A call we declined while another one was ringing never reaches the callee's // signaling flow, so tell the caller ourselves. - const onWaitingCallDeclined = useCallback((payload: VoipIncomingPayload) => { + const onWaitingCallDeclined = useCallback((payload: VoIPIncomingPayload) => { sendSignalRef.current?.({ type: 'call-rejected', to: payload.handle, @@ -76,12 +76,12 @@ function VoipApp() { return ( - +
- + ); } @@ -89,7 +89,7 @@ function VoipApp() { const App = () => ( - + ); diff --git a/mobile-react-native/voip-call/app/README.md b/mobile-react-native/voip-call/app/README.md index 9d482b6..89382b0 100644 --- a/mobile-react-native/voip-call/app/README.md +++ b/mobile-react-native/voip-call/app/README.md @@ -10,7 +10,6 @@ the [VoIP calls guide](https://documentation.fishjam.io/docs/how-to/client/voip- With the [server](../server/README.md) running and `.env` filled in: ```bash -yarn yarn ios # or: yarn android ``` @@ -19,9 +18,8 @@ Google Play services. ## iOS native registration -On Expo, the app depends on `@fishjam-cloud/ios-expo-voip` (not on npm yet — -resolved through a `link:` to a local checkout, see the -[example README](../README.md#local-sdk-checkout)), +On Expo, the app depends on +[`@fishjam-cloud/ios-expo-voip`](https://www.npmjs.com/package/@fishjam-cloud/ios-expo-voip), which registers the native subscriptions the SDK needs at launch: PushKit and the Recents redial intent forwarding. Without the PushKit registration the app never receives `didReceiveIncomingPush`, so VoIP pushes don't work at all, and diff --git a/mobile-react-native/voip-call/app/app.json b/mobile-react-native/voip-call/app/app.json index 9211b42..2f1e7ce 100644 --- a/mobile-react-native/voip-call/app/app.json +++ b/mobile-react-native/voip-call/app/app.json @@ -45,7 +45,7 @@ "@fishjam-cloud/react-native-client", { "android": { - "enableVoip": true + "enableVoIP": true }, "ios": { "enableVoIPBackgroundMode": true diff --git a/mobile-react-native/voip-call/app/assets/images/adaptive-icon.png b/mobile-react-native/voip-call/app/assets/images/adaptive-icon.png index 4053315ea8cad2af412f94df1e5afe347afe93f8..471f7c36f4623959b366e2e7f26f561379fbba80 100644 GIT binary patch literal 10933 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�=LBN2_&` zrhmRLdYX#A%*@J7OP@9xvo+n$K5Whlx`NFuw<29HZH4r7wt5`cC65^;y#I{;Ui=JQ z*ETo%Ge6iuN;wh-=#@L;xr}R}FDOR(9<|^-pt`yxb2GB;zaP#*jrMUSvP+t=U+C|% z8@IJ3kdQpip>xm)0ozwY%t4@?DyiTuv2pl~rAWFP$~H7%mjq7badlS86{a4`ERVwk+FOo`-NY8>gl%DtyLby&BpGvGfgiZ%M=}!Rk*3bIZ3$>knK^`O1($vFwIuBq774IM> zn)b>^|8BFWozpOL&TVig4G*wr{DC{SfX8zX~dZO!ZB6fFSl43Wr<1W>vqOC3Yt6g(p z!^puDFu0FGNKpTEqj7khW>m7DXk!&bVoCC+zq^(5>cr&GMq+n zmJ|qZwexgb`Fz{@v~~W*_hI+yB9H*(gYk@2T@W6oFOuw`5WqalW$ig~Q94BS*rJ zk}$7UAmcL#1R@D&3p$3~``U+f&Pv?OQZVPWouqYWGsXd@`U{ZbOdoZByeb~-pLpt* z8g3xT)TL3|;eI;ReEEiH?9NhI`F9=EslTy!VDzMQ*z5V=*PM}NB8*A8^%D;ujGCN1A_(f>_X!lHxWbQXCRw;o6Ke-X634jUTX4CQkh@<<)U@ zq)NvM`P59hEk$1yVJd@C!(;BK^j4W>*xrRM4N9SUA^3gDFo=zbhKi8V79!G zC@zjpXa??O^zrN1tY3fVp$=Q3&j*YC(BkL1Ok{@s#_<*&a>~P$K<~E>>I>DP6m^*E zA7#+F*F)w6l5-&PsMGa}^z)xclZJt)@WLB3Ch9eh`vRKWtcJV~lfd&Fhv~~tAxgH8 z=J3tHn>nc5trwdOj=?`Ho>6nh`7f2mkm1>XQ@GbQ@P&PP)#gaP24(9#46qW%Q`)T(Ye&jf3hVG9?qs|B)eJM4!#5(a%dvd zcgzGgBaZ^y*jNosK#0gC z@Uq!__BI=2;T#{q;!1|T*uw#wf|qel*XRogzAOEkNsHQU16B|H|^ugB6eji)r zU5S=NMG8nvXxzrQxSA(>dyh2C^ExDfYZU*BD}4Xgj)05lBjVbO}qp~`l|7sNF L)MTrrEkgeX^-aiv literal 3648 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 WwL{zXu4Xfr%d@pQY{}kFz3^Yz_x$Jp diff --git a/mobile-react-native/voip-call/app/assets/images/favicon.png b/mobile-react-native/voip-call/app/assets/images/favicon.png index 408bd746615785760b09e6f23fa8378d3e614331..f8d9dd101b4ff5648d16de61a5d0a54bd79c7128 100644 GIT binary patch literal 1701 zcmV;W23q-vP)000JTNklu*#=6hG(8+3v4B+-as)GvNA8Xuqh5B%mwzi1+nm}oQx ziQ$8qXiV^hCiPJbijM@)+Da)XU|ZPk-Q9cd%p5cK);{TO>2@ji*W0Gu)0umI=QU?$ z@M35n%^*lQ2vQD$l!GAUAV@g~QVxQYgCOM~NI3{n4uX_J&T|~I{fQX=%6R$|_x19r z0W)+S3ZrZc0$?^nD_6n#cIe!M>)R&=#-pashBH2#8*m=YoYjwF*A++M=n?btk8pZ0 zD+m}g8)af{0E8$B3CUMVT(cgwZsRRCVZFh4R1X`6NH8IP$EfYnF(3qU#ctRALTJ&9AwC%QudCZvhnf-5MgtX2a zHxmE~8dBPM;l+guq4=$)|4;GZdrd?Cj)vhdTcg>48ULR|@5w^|{3!C3@}i;Uk3J~< z_N(6WFs*C_tx*Vb?jLb*f2d7S1vq&ukrM$f%`aRMC)$74E#KJZoc(7w2qI%}lFh2X zGGq?4z7U4l{$A&`z2?`WAO!n9?tjaPr=n!G{~w6|WTUIkJXa4SzSduU-g5X*L8$<7 zinZp3B;_wek*8GV;5+4!Veac)c5!4#DZ2dGE{8y@z3TaT>ET18VWgQa@xE!HKRbvy zV2+|_$tNF2#tds+Pc5GV0cM+R11H@N-!B@YjG6vEB%5+t+ZaOxA%G|e{aHE0#n;z5 zDY*5Z7Wvqm7)9pb0l};cPaiCtmYa%izHVL7U=CD6j%bebEYmtPW{Ms}TrOqqygR#l zk6m)crSY-=T05QBHa+>YjiLs7fU1kx81vJQ6|Jo+#(@Ybq7^H14?Z-$+>S*&;#eNX z9Ng_YxLmf<#UcP_2J!5fau`jiDu^5e?)5j=pr5S|i*4_1+X2p^h7kXLe2Ea|5++2k zc3riRu`9%?R%&Xt**xE7vt9z`WWR}5^_e1+wbu|7!iLjgCh@tm>XO|Evl$twF_zgB zi(D$%9B3E^s-c5lREDQyaMI~Y8J##@b)?OW=)^HgKnPeg4}_r&p=tJGgPs@l{t^E2 zv$d|C;i9D14}!{9htY8sGlZ~;NC^Mk1NzMAF#{Vj_Qbst7~>z_4hI5`$7LZIhiHhTrM zhuQ@4D;(dCl&aBhyDoU%#D_^TToF)pF|J!HlE|)(WU(86t{|wo7&|(nWUFpd$sBhwL5j%c3VZMM(<1JjoR6XZ5@>joh`0w8rBjw z{8U2Rzo%?i63x0WU%dp#b~U(qjq2K!cin~E9I~wq^a)ybv5X zep;k-iOiKC5GzfOJziM7cDd`a5cR|oBMQV8&nw=tBWi7Ja-4cNT#h+28F=EE!iLTj zu7d#c$Z2bM#3m`F>y>stB=$Ti9(hay$~r7EX9Dpl17@=D_){0}=yIgYJB~dNLgYEC z?hq~ayl~Ar{p@qN{dQIg+d6`K?p^9Q^V9w^FF0Z&+3#KVnN8P~zxXus`?0JPr6>xt z-Gap(2imW=c3Gpwn;UyWBW2c+qi&|K^KQ6xr#%ob#%}qUW!J8ezj~MT_l<<%l-0%_ zYhpw0$dVnSeZ^mWbmRx~$8joL^n}py*|p&@Ehsj*Ao8P#)~>@FxAIN5U~_Y#+}J@2 z$5clP@ajt$-w(8=@w+nsm#CP@I?unb&;+L5QbMW31O43J$AbefGQ{NoRAf(8Gajy3 zMI9TVb2G1Rv-VCdN|MvNX*M~3Rt^tO-dr=-yC0SgZR~6SfvW}tDF;EyL6C9~q#Oh( v2SLg~ka7^D90Vx`LCQgpa?oNcP%r)iNR~%lS!U=!00000NkvXXu0mjfVS+KE literal 1129 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 b^vnMP06&BEV6zMx00000NkvXXu0mjf84yMR diff --git a/mobile-react-native/voip-call/app/assets/images/icon.png b/mobile-react-native/voip-call/app/assets/images/icon.png index 31be37b2c6c59b989806f6473b5be99b26dc4bb8..348683ffa4a0d16009f2873ada8ad0d3cc336410 100644 GIT binary patch literal 38730 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 literal 6483 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 RtA8#c%#AILN`Ixq{0oq!5zznu diff --git a/mobile-react-native/voip-call/app/assets/images/splash.png b/mobile-react-native/voip-call/app/assets/images/splash.png index f064caf2dc780547489ced022f68643b4145cb3e..63aec3ce0c75d315f8f5f62c50d8bc29c2389545 100644 GIT binary patch literal 64768 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 = Promise.resolve(); * Returns the room we have actually joined, or `null` while still connecting. */ export function useCallRoom(): string | null { - const { currentCall, reportConnectFailed } = useVoip(); + const { currentCall, reportConnectFailed } = useVoIP(); const { username } = useUser(); const { joinRoom, leaveRoom } = useConnection(); const { startCamera, stopCamera } = useCamera(); diff --git a/mobile-react-native/voip-call/app/src/hooks/useCallSignaling.ts b/mobile-react-native/voip-call/app/src/hooks/useCallSignaling.ts index 8125ff8..318308c 100644 --- a/mobile-react-native/voip-call/app/src/hooks/useCallSignaling.ts +++ b/mobile-react-native/voip-call/app/src/hooks/useCallSignaling.ts @@ -1,10 +1,9 @@ -import { useCallback, useEffect, useRef, type MutableRefObject } from 'react'; - import { - useVoip, type CurrentCall, - type VoipCallStatus, + useVoIP, + type VoIPCallStatus, } from '@fishjam-cloud/react-native-client'; +import { type MutableRefObject, useCallback, useEffect, useRef } from 'react'; import { useUser } from '../user/UserContext'; @@ -13,11 +12,11 @@ const SERVER_URL = export type SendSignal = (msg: Record) => void; -/** Filled by {@link useCallSignaling} so App can wire `VoipProvider.onWaitingCallDeclined`. */ +/** Filled by {@link useCallSignaling} so App can wire `VoIPProvider.onWaitingCallDeclined`. */ export type SendSignalRef = MutableRefObject; export function useCallSignaling(sendSignalRef: SendSignalRef): void { - const { endCall, currentCall, status, lastEndedReason } = useVoip(); + const { endCall, currentCall, status, lastEndedReason } = useVoIP(); const { username } = useUser(); const socketRef = useRef(null); @@ -57,19 +56,20 @@ export function useCallSignaling(sendSignalRef: SendSignalRef): void { return; } - const { endCall, currentCall } = handlersRef.current; - if (!currentCall || currentCall.startedAt !== null) return; - if (currentCall.roomName !== msg.roomName) return; + const { endCall: latestEndCall, currentCall: latestCall } = + handlersRef.current; + if (!latestCall || latestCall.startedAt !== null) return; + if (latestCall.roomName !== msg.roomName) return; // The caller cancelled while we (the callee) are still ringing — from // our side this incoming call rang and was never answered. - if (msg.type === 'call-cancelled' && !currentCall.isOutgoing) { - void endCall('missed'); + if (msg.type === 'call-cancelled' && !latestCall.isOutgoing) { + void latestEndCall('missed'); } // The callee rejected while we (the caller) are still ringing out — the // other party declined, not just hung up. - else if (msg.type === 'call-rejected' && currentCall.isOutgoing) { - void endCall('rejected'); + else if (msg.type === 'call-rejected' && latestCall.isOutgoing) { + void latestEndCall('rejected'); } }; @@ -82,7 +82,7 @@ export function useCallSignaling(sendSignalRef: SendSignalRef): void { // Detect the local user ending a call before it connected, and notify the // other party so their ringing UI can be dismissed. - const prevRef = useRef<{ status: VoipCallStatus; call: CurrentCall | null }>({ + const prevRef = useRef<{ status: VoIPCallStatus; call: CurrentCall | null }>({ status, call: currentCall, }); diff --git a/mobile-react-native/voip-call/app/src/hooks/useDeviceRegistration.ts b/mobile-react-native/voip-call/app/src/hooks/useDeviceRegistration.ts index 79bed7c..196d5c0 100644 --- a/mobile-react-native/voip-call/app/src/hooks/useDeviceRegistration.ts +++ b/mobile-react-native/voip-call/app/src/hooks/useDeviceRegistration.ts @@ -1,4 +1,4 @@ -import { useVoip } from '@fishjam-cloud/react-native-client'; +import { useVoIP } from '@fishjam-cloud/react-native-client'; import { useEffect } from 'react'; import { Platform } from 'react-native'; @@ -13,7 +13,7 @@ const SERVER_URL = */ export function useDeviceRegistration(): void { const { username } = useUser(); - const { voipToken } = useVoip(); + const { voipToken } = useVoIP(); useEffect(() => { if (!username || !voipToken) return; diff --git a/mobile-react-native/voip-call/app/src/hooks/usePlaceCall.ts b/mobile-react-native/voip-call/app/src/hooks/usePlaceCall.ts index 2536d55..f50afca 100644 --- a/mobile-react-native/voip-call/app/src/hooks/usePlaceCall.ts +++ b/mobile-react-native/voip-call/app/src/hooks/usePlaceCall.ts @@ -1,4 +1,4 @@ -import { useVoip } from '@fishjam-cloud/react-native-client'; +import { useVoIP } from '@fishjam-cloud/react-native-client'; import { useCallback } from 'react'; import { useUser } from '../user/UserContext'; @@ -6,7 +6,7 @@ import { useUser } from '../user/UserContext'; const SERVER_URL = process.env.EXPO_PUBLIC_VOIP_SERVER_URL ?? 'http://localhost:4400'; -/** Must match the `isVideo` prop passed to `VoipProvider` in App.tsx. */ +/** Must match the `isVideo` prop passed to `VoIPProvider` in App.tsx. */ export const IS_VIDEO_CALL = true; /** Random room name for the call. */ @@ -24,7 +24,7 @@ function makeRoomName() { * UI, so if signaling fails we never show a call that cannot connect. */ export function usePlaceCall(): (to: string) => Promise { - const { startCall } = useVoip(); + const { startCall } = useVoIP(); const { username } = useUser(); return useCallback( diff --git a/mobile-react-native/voip-call/app/src/hooks/useRecentsRedial.ts b/mobile-react-native/voip-call/app/src/hooks/useRecentsRedial.ts index 2151a4c..cad0c9c 100644 --- a/mobile-react-native/voip-call/app/src/hooks/useRecentsRedial.ts +++ b/mobile-react-native/voip-call/app/src/hooks/useRecentsRedial.ts @@ -1,4 +1,4 @@ -import { useVoip } from '@fishjam-cloud/react-native-client'; +import { useVoIP } from '@fishjam-cloud/react-native-client'; import { useEffect } from 'react'; import { useUser } from '../user/UserContext'; @@ -9,7 +9,7 @@ import { usePlaceCall } from './usePlaceCall'; * intent until we are ready, so we can simply wait for the session to be restored. */ export function useRecentsRedial(): void { - const { pendingCallIntent, clearCallIntent } = useVoip(); + const { pendingCallIntent, clearCallIntent } = useVoIP(); const { username } = useUser(); const placeCall = usePlaceCall(); diff --git a/mobile-react-native/voip-call/app/src/screens/CallScreen.tsx b/mobile-react-native/voip-call/app/src/screens/CallScreen.tsx index 2c09038..0b3d766 100644 --- a/mobile-react-native/voip-call/app/src/screens/CallScreen.tsx +++ b/mobile-react-native/voip-call/app/src/screens/CallScreen.tsx @@ -1,4 +1,4 @@ -import { usePeers, useVoip } from '@fishjam-cloud/react-native-client'; +import { usePeers, useVoIP } from '@fishjam-cloud/react-native-client'; import { useEffect } from 'react'; import { useCallRoom } from '../hooks/useCallRoom'; @@ -12,7 +12,7 @@ import { OutgoingCallView } from './OutgoingCallView'; * reported back to the call as connect / hang-up. */ export function CallScreen() { - const { status, currentCall, reportConnected, endCall } = useVoip(); + const { status, currentCall, reportConnected, endCall } = useVoIP(); const { remotePeers } = usePeers(); const joinedRoom = useCallRoom(); diff --git a/mobile-react-native/voip-call/app/src/screens/InCallView.tsx b/mobile-react-native/voip-call/app/src/screens/InCallView.tsx index 4f914fe..4fd3989 100644 --- a/mobile-react-native/voip-call/app/src/screens/InCallView.tsx +++ b/mobile-react-native/voip-call/app/src/screens/InCallView.tsx @@ -5,16 +5,16 @@ import { useMicrophone, usePeers, useVAD, + useVoIP, } from '@fishjam-cloud/react-native-client'; -import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; import { StatusBar } from 'expo-status-bar'; +import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; import { Platform, StyleSheet, Text, View } from 'react-native'; import { SafeAreaView } from 'react-native-safe-area-context'; import { Avatar, InCallButton, VideoCallView } from '../components'; import { AdditionalColors, BrandColors, TextColors } from '../theme/colors'; import { useUser } from '../user/UserContext'; -import { useVoip } from '@fishjam-cloud/react-native-client'; type PeerMeta = { displayName?: string }; @@ -47,7 +47,7 @@ function useElapsed(startedAt: number | null): number { * devices on resume. Runs only while mounted, i.e. only during an active call. */ function useHoldMediaSync() { - const { isOnHold } = useVoip(); + const { isOnHold } = useVoIP(); const { isCameraOn, toggleCamera } = useCamera(); const { isMicrophoneOn, toggleMicrophone } = useMicrophone(); @@ -85,7 +85,7 @@ function useHoldMediaSync() { * muting from the native call UI actually silences us. */ function useMuteSync() { - const { isMuted } = useVoip(); + const { isMuted } = useVoIP(); const { isMicrophoneOn, toggleMicrophone } = useMicrophone(); const prevMutedRef = useRef(isMuted); @@ -103,7 +103,7 @@ function useMuteSync() { } export function InCallView() { - const { currentCall, endCall, isOnHold, setCallHeld } = useVoip(); + const { currentCall, endCall, isOnHold, setCallHeld } = useVoIP(); const { username, avatarUrlFor } = useUser(); useHoldMediaSync(); diff --git a/mobile-react-native/voip-call/app/src/screens/LoginScreen.tsx b/mobile-react-native/voip-call/app/src/screens/LoginScreen.tsx index 9cf4f2b..93779fb 100644 --- a/mobile-react-native/voip-call/app/src/screens/LoginScreen.tsx +++ b/mobile-react-native/voip-call/app/src/screens/LoginScreen.tsx @@ -2,7 +2,6 @@ import { MaterialCommunityIcons } from '@expo/vector-icons'; import { useState } from 'react'; import { ActivityIndicator, - Image, KeyboardAvoidingView, Platform, StyleSheet, @@ -16,9 +15,6 @@ import { SafeAreaView } from 'react-native-safe-area-context'; import { AdditionalColors, BrandColors, TextColors } from '../theme/colors'; import { useUser } from '../user/UserContext'; -// eslint-disable-next-line @typescript-eslint/no-require-imports -const FishjamLogo = require('../../assets/images/fishjam-logo.png'); - export function LoginScreen() { const { register } = useUser(); const [input, setInput] = useState(''); @@ -44,12 +40,6 @@ export function LoginScreen() { style={styles.flex} behavior={Platform.OS === 'ios' ? 'padding' : 'height'}> - - Date: Fri, 31 Jul 2026 16:13:35 +0200 Subject: [PATCH 3/7] Fix --- .../voip-call/app/.eslintrc.js | 16 + mobile-react-native/voip-call/app/.gitignore | 23 +- mobile-react-native/voip-call/app/App.tsx | 6 +- .../voip-call/app/eslint.config.mjs | 59 -- mobile-react-native/voip-call/app/index.js | 3 +- .../voip-call/app/package.json | 22 +- .../voip-call/app/prettier.config.js | 9 +- .../app/src/hooks/useCallSignaling.ts | 20 +- .../voip-call/app/src/screens/InCallView.tsx | 4 +- .../app/src/screens/OutgoingCallView.tsx | 2 +- .../voip-call/app/src/screens/UsersScreen.tsx | 4 +- mobile-react-native/voip-call/app/yarn.lock | 694 +++++++++++++++--- 12 files changed, 654 insertions(+), 208 deletions(-) create mode 100644 mobile-react-native/voip-call/app/.eslintrc.js delete mode 100644 mobile-react-native/voip-call/app/eslint.config.mjs diff --git a/mobile-react-native/voip-call/app/.eslintrc.js b/mobile-react-native/voip-call/app/.eslintrc.js new file mode 100644 index 0000000..61c7625 --- /dev/null +++ b/mobile-react-native/voip-call/app/.eslintrc.js @@ -0,0 +1,16 @@ +module.exports = { + root: true, + extends: ['expo'], + ignorePatterns: [ + 'dist/*', + 'node_modules/*', + 'ios/*', + 'android/*', + 'server/*', + '.eslintrc.js', + 'prettier.config.js', + ], + rules: { + 'import/no-unresolved': 'off', + }, +}; diff --git a/mobile-react-native/voip-call/app/.gitignore b/mobile-react-native/voip-call/app/.gitignore index b737d82..935c017 100644 --- a/mobile-react-native/voip-call/app/.gitignore +++ b/mobile-react-native/voip-call/app/.gitignore @@ -1,26 +1,11 @@ -# Learn more https://docs.github.com/en/get-started/getting-started-with-git/ignoring-files - # dependencies node_modules/ # Expo .expo/ dist/ -web-build/ expo-env.d.ts -# Native -.kotlin/ -*.orig.* -*.jks -*.p8 -*.p12 -*.key -*.mobileprovision - -# Metro -.metro-health-check* - # debug npm-debug.* yarn-debug.* @@ -28,11 +13,6 @@ yarn-error.* # macOS .DS_Store -*.pem - -# local env files -.env -.env*.local # typescript *.tsbuildinfo @@ -41,5 +21,4 @@ yarn-error.* /ios /android -# Firebase config — fetch your own from the Firebase console (see ../README.md) -google-services.json +google-services.json \ No newline at end of file diff --git a/mobile-react-native/voip-call/app/App.tsx b/mobile-react-native/voip-call/app/App.tsx index e0dcc6b..b1cf490 100644 --- a/mobile-react-native/voip-call/app/App.tsx +++ b/mobile-react-native/voip-call/app/App.tsx @@ -1,4 +1,3 @@ -import type { VoIPIncomingPayload } from '@fishjam-cloud/react-native-client'; import { FishjamProvider, useVoIP, @@ -9,9 +8,10 @@ import { useCallback, useEffect, useRef } from 'react'; import { ActivityIndicator, StyleSheet, View } from 'react-native'; import { SafeAreaProvider } from 'react-native-safe-area-context'; +import type { VoIPIncomingPayload } from '@fishjam-cloud/react-native-client'; import { - type SendSignalRef, useCallSignaling, + type SendSignalRef, } from './src/hooks/useCallSignaling'; import { useDeviceRegistration } from './src/hooks/useDeviceRegistration'; import { useRecentsRedial } from './src/hooks/useRecentsRedial'; @@ -34,7 +34,7 @@ function Main({ sendSignalRef }: { sendSignalRef: SendSignalRef }) { useEffect(() => { if (!lastEndedReason) return; - console.debug( + console.log( `On user: ${username}, [VoIP] Call ended — reason: ${lastEndedReason}`, ); }, [lastEndedReason, username]); diff --git a/mobile-react-native/voip-call/app/eslint.config.mjs b/mobile-react-native/voip-call/app/eslint.config.mjs deleted file mode 100644 index b281c49..0000000 --- a/mobile-react-native/voip-call/app/eslint.config.mjs +++ /dev/null @@ -1,59 +0,0 @@ -import js from '@eslint/js'; -import prettier from 'eslint-config-prettier'; -import importPlugin from 'eslint-plugin-import'; -import prettierPlugin from 'eslint-plugin-prettier'; -import reactHooks from 'eslint-plugin-react-hooks'; -import simpleImportSort from 'eslint-plugin-simple-import-sort'; -import tseslint from 'typescript-eslint'; - -export default tseslint.config( - { - ignores: [ - 'dist/', - 'node_modules/', - 'coverage/', - 'build/', - 'ios/', - 'android/', - '.expo/', - 'prettier.config.js', - 'babel.config.js', - ], - }, - js.configs.recommended, - ...tseslint.configs.recommended, - prettier, - { - plugins: { - 'react-hooks': reactHooks, - 'simple-import-sort': simpleImportSort, - 'import': importPlugin, - 'prettier': prettierPlugin, - }, - rules: { - '@typescript-eslint/ban-ts-comment': 'off', - '@typescript-eslint/consistent-type-imports': 'error', - '@typescript-eslint/no-empty-function': 'off', - '@typescript-eslint/no-unused-vars': [ - 'error', - { - argsIgnorePattern: '^_', - varsIgnorePattern: '^_', - caughtErrorsIgnorePattern: '^_', - }, - ], - 'no-case-declarations': 'off', - 'no-console': ['error', { allow: ['debug', 'warn', 'error'] }], - 'no-shadow': 'error', - 'react-hooks/exhaustive-deps': 'error', - 'react-hooks/rules-of-hooks': 'error', - 'simple-import-sort/imports': 'error', - 'simple-import-sort/exports': 'error', - 'import/first': 'error', - 'import/newline-after-import': 'error', - 'import/no-duplicates': 'error', - 'import/no-unresolved': 'off', - 'prettier/prettier': 'error', - }, - }, -); diff --git a/mobile-react-native/voip-call/app/index.js b/mobile-react-native/voip-call/app/index.js index e07cd5e..5212d31 100644 --- a/mobile-react-native/voip-call/app/index.js +++ b/mobile-react-native/voip-call/app/index.js @@ -1,6 +1,5 @@ -import 'react-native-get-random-values'; - import { registerRootComponent } from 'expo'; +import 'react-native-get-random-values'; import App from './App'; diff --git a/mobile-react-native/voip-call/app/package.json b/mobile-react-native/voip-call/app/package.json index 1f3e22b..ddc76c3 100644 --- a/mobile-react-native/voip-call/app/package.json +++ b/mobile-react-native/voip-call/app/package.json @@ -1,20 +1,18 @@ { "name": "voip-call", "main": "index.js", - "version": "1.0.0", + "version": "0.29.0", "private": true, "scripts": { "start": "expo start", "android": "expo run:android", "ios": "expo run:ios", - "lint": "eslint .", - "format": "prettier --write .", - "format:check": "prettier --check ." + "lint": "eslint ." }, "dependencies": { + "@expo/vector-icons": "^15.0.3", "@fishjam-cloud/ios-expo-voip": "0.29.0", "@fishjam-cloud/react-native-client": "0.30.0-rc.0", - "@fishjam-cloud/react-native-webrtc": "0.30.0-rc.0", "@react-native-async-storage/async-storage": "^3.1.1", "expo": "~54.0.30", "expo-splash-screen": "~31.0.13", @@ -27,17 +25,9 @@ "react-native-worklets": "0.5.1" }, "devDependencies": { - "@babel/core": "^7.28.0", - "@eslint/js": "^9.24.0", "@types/react": "~19.1.0", - "eslint": "^9.0.0", - "eslint-config-prettier": "^10.1.5", - "eslint-plugin-import": "^2.31.0", - "eslint-plugin-prettier": "^5.5.1", - "eslint-plugin-react-hooks": "^5.1.0", - "eslint-plugin-simple-import-sort": "^12.1.0", - "prettier": "^3.6.2", - "typescript": "~5.9.2", - "typescript-eslint": "^8.29.1" + "eslint": "^8.57.1", + "eslint-config-expo": "~8.0.1", + "typescript": "~5.9.2" } } diff --git a/mobile-react-native/voip-call/app/prettier.config.js b/mobile-react-native/voip-call/app/prettier.config.js index e662df5..1b0a5c6 100644 --- a/mobile-react-native/voip-call/app/prettier.config.js +++ b/mobile-react-native/voip-call/app/prettier.config.js @@ -1 +1,8 @@ -module.exports = require('../../common/prettier.config'); +module.exports = { + bracketSameLine: true, + quoteProps: 'consistent', + singleQuote: true, + tabWidth: 2, + trailingComma: 'all', + useTabs: false, +}; diff --git a/mobile-react-native/voip-call/app/src/hooks/useCallSignaling.ts b/mobile-react-native/voip-call/app/src/hooks/useCallSignaling.ts index 318308c..108d3ea 100644 --- a/mobile-react-native/voip-call/app/src/hooks/useCallSignaling.ts +++ b/mobile-react-native/voip-call/app/src/hooks/useCallSignaling.ts @@ -1,9 +1,10 @@ +import { useCallback, useEffect, useRef, type MutableRefObject } from 'react'; + import { - type CurrentCall, useVoIP, + type CurrentCall, type VoIPCallStatus, } from '@fishjam-cloud/react-native-client'; -import { type MutableRefObject, useCallback, useEffect, useRef } from 'react'; import { useUser } from '../user/UserContext'; @@ -56,20 +57,19 @@ export function useCallSignaling(sendSignalRef: SendSignalRef): void { return; } - const { endCall: latestEndCall, currentCall: latestCall } = - handlersRef.current; - if (!latestCall || latestCall.startedAt !== null) return; - if (latestCall.roomName !== msg.roomName) return; + const { endCall, currentCall } = handlersRef.current; + if (!currentCall || currentCall.startedAt !== null) return; + if (currentCall.roomName !== msg.roomName) return; // The caller cancelled while we (the callee) are still ringing — from // our side this incoming call rang and was never answered. - if (msg.type === 'call-cancelled' && !latestCall.isOutgoing) { - void latestEndCall('missed'); + if (msg.type === 'call-cancelled' && !currentCall.isOutgoing) { + void endCall('missed'); } // The callee rejected while we (the caller) are still ringing out — the // other party declined, not just hung up. - else if (msg.type === 'call-rejected' && latestCall.isOutgoing) { - void latestEndCall('rejected'); + else if (msg.type === 'call-rejected' && currentCall.isOutgoing) { + void endCall('rejected'); } }; diff --git a/mobile-react-native/voip-call/app/src/screens/InCallView.tsx b/mobile-react-native/voip-call/app/src/screens/InCallView.tsx index 4fd3989..46ea012 100644 --- a/mobile-react-native/voip-call/app/src/screens/InCallView.tsx +++ b/mobile-react-native/voip-call/app/src/screens/InCallView.tsx @@ -5,16 +5,16 @@ import { useMicrophone, usePeers, useVAD, - useVoIP, } from '@fishjam-cloud/react-native-client'; -import { StatusBar } from 'expo-status-bar'; import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; +import { StatusBar } from 'expo-status-bar'; import { Platform, StyleSheet, Text, View } from 'react-native'; import { SafeAreaView } from 'react-native-safe-area-context'; import { Avatar, InCallButton, VideoCallView } from '../components'; import { AdditionalColors, BrandColors, TextColors } from '../theme/colors'; import { useUser } from '../user/UserContext'; +import { useVoIP } from '@fishjam-cloud/react-native-client'; type PeerMeta = { displayName?: string }; diff --git a/mobile-react-native/voip-call/app/src/screens/OutgoingCallView.tsx b/mobile-react-native/voip-call/app/src/screens/OutgoingCallView.tsx index fd4891d..7629af3 100644 --- a/mobile-react-native/voip-call/app/src/screens/OutgoingCallView.tsx +++ b/mobile-react-native/voip-call/app/src/screens/OutgoingCallView.tsx @@ -1,4 +1,3 @@ -import { useVoIP } from '@fishjam-cloud/react-native-client'; import { useEffect } from 'react'; import { StyleSheet, Text, View } from 'react-native'; import Animated, { @@ -13,6 +12,7 @@ import { SafeAreaView } from 'react-native-safe-area-context'; import { Avatar, InCallButton } from '../components'; import { BrandColors, TextColors } from '../theme/colors'; import { useUser } from '../user/UserContext'; +import { useVoIP } from '@fishjam-cloud/react-native-client'; /** Ringing UI while an outgoing call waits for the other side. Rendered by `CallScreen`. */ export function OutgoingCallView() { diff --git a/mobile-react-native/voip-call/app/src/screens/UsersScreen.tsx b/mobile-react-native/voip-call/app/src/screens/UsersScreen.tsx index fd21a41..834dabe 100644 --- a/mobile-react-native/voip-call/app/src/screens/UsersScreen.tsx +++ b/mobile-react-native/voip-call/app/src/screens/UsersScreen.tsx @@ -1,5 +1,4 @@ import { MaterialCommunityIcons } from '@expo/vector-icons'; -import { useVoIP } from '@fishjam-cloud/react-native-client'; import { useEffect } from 'react'; import { ActivityIndicator, @@ -13,9 +12,10 @@ import { import { SafeAreaView } from 'react-native-safe-area-context'; import { Avatar } from '../components'; -import { usePlaceCall } from '../hooks/usePlaceCall'; import { AdditionalColors, BrandColors, TextColors } from '../theme/colors'; import { useUser } from '../user/UserContext'; +import { useVoIP } from '@fishjam-cloud/react-native-client'; +import { usePlaceCall } from '../hooks/usePlaceCall'; export function UsersScreen() { const { username, users, refreshUsers, logout } = useUser(); diff --git a/mobile-react-native/voip-call/app/yarn.lock b/mobile-react-native/voip-call/app/yarn.lock index e8bf448..7d561e0 100644 --- a/mobile-react-native/voip-call/app/yarn.lock +++ b/mobile-react-native/voip-call/app/yarn.lock @@ -28,7 +28,7 @@ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.29.7.tgz#6f0237f0f36d2e51c0570a636faed9d2d0efe629" integrity sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg== -"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.20.0", "@babel/core@^7.25.2", "@babel/core@^7.28.0": +"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.20.0", "@babel/core@^7.25.2": version "7.29.7" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.29.7.tgz#80c10b17248082968b57a857b91640971f2070f7" integrity sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA== @@ -788,14 +788,36 @@ resolved "https://registry.yarnpkg.com/@bufbuild/protobuf/-/protobuf-2.13.0.tgz#92ae09d6412c658a56b3c2cd867386850064c901" integrity sha512-acq7c49vxfm1ggJ95P70TX7ABDM0vxr1SYD3BB0o0jnBLB4OAqeHyKuN+cD3w80gXEDQ2zxHpR6CUeA+O/aU9g== -"@eslint-community/eslint-utils@^4.8.0", "@eslint-community/eslint-utils@^4.9.1": +"@emnapi/core@1.10.0": + version "1.10.0" + resolved "https://registry.yarnpkg.com/@emnapi/core/-/core-1.10.0.tgz#380ccc8f2412ea22d1d972df7f8ee23a3b9c7467" + integrity sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw== + dependencies: + "@emnapi/wasi-threads" "1.2.1" + tslib "^2.4.0" + +"@emnapi/runtime@1.10.0": + version "1.10.0" + resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.10.0.tgz#4b260c0d3534204e98c6110b8db1a987d26ec87c" + integrity sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA== + dependencies: + tslib "^2.4.0" + +"@emnapi/wasi-threads@1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz#28fed21a1ba1ce797c44a070abc94d42f3ae8548" + integrity sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w== + dependencies: + tslib "^2.4.0" + +"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.8.0", "@eslint-community/eslint-utils@^4.9.1": version "4.10.1" resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz#8911bd72b2c3640a543609e0400b8c4d2e7e7cb6" integrity sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg== dependencies: eslint-visitor-keys "^3.4.3" -"@eslint-community/regexpp@^4.12.1", "@eslint-community/regexpp@^4.12.2": +"@eslint-community/regexpp@^4.12.1", "@eslint-community/regexpp@^4.12.2", "@eslint-community/regexpp@^4.6.1": version "4.12.2" resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.2.tgz#bccdf615bcf7b6e8db830ec0b8d21c9a25de597b" integrity sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew== @@ -823,6 +845,21 @@ dependencies: "@types/json-schema" "^7.0.15" +"@eslint/eslintrc@^2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" + integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.6.0" + globals "^13.19.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + "@eslint/eslintrc@^3.3.6": version "3.3.6" resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.3.6.tgz#d22bfd6b3a7d8e1f2c0b2f2e6de111b53ec6e13e" @@ -838,7 +875,12 @@ minimatch "^3.1.5" strip-json-comments "^3.1.1" -"@eslint/js@9.39.5", "@eslint/js@^9.24.0": +"@eslint/js@8.57.1": + version "8.57.1" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.1.tgz#de633db3ec2ef6a3c89e2f19038063e8a122e2c2" + integrity sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q== + +"@eslint/js@9.39.5": version "9.39.5" resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.39.5.tgz#6f2fbcff75500d229d535e0a949ae13472c84787" integrity sha512-QywQuszQh77pIXCsq998c8hbhSTI/azTty1Z6N53dmAudKHhy573j3yvRLsX2BSp8YpLtoCEG8E9DJe+8zUh4A== @@ -1262,11 +1304,25 @@ resolved "https://registry.yarnpkg.com/@humanfs/types/-/types-0.15.0.tgz#f2a09f62012390b2bff3fc6fb248ddec8c09a090" integrity sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q== +"@humanwhocodes/config-array@^0.13.0": + version "0.13.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.13.0.tgz#fb907624df3256d04b9aa2df50d7aa97ec648748" + integrity sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw== + dependencies: + "@humanwhocodes/object-schema" "^2.0.3" + debug "^4.3.1" + minimatch "^3.0.5" + "@humanwhocodes/module-importer@^1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== +"@humanwhocodes/object-schema@^2.0.3": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" + integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== + "@humanwhocodes/retry@^0.4.0", "@humanwhocodes/retry@^0.4.2": version "0.4.3" resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.4.3.tgz#c2b9d2e374ee62c586d3adbea87199b1d7a7a6ba" @@ -1411,10 +1467,38 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" -"@pkgr/core@^0.3.6": - version "0.3.6" - resolved "https://registry.yarnpkg.com/@pkgr/core/-/core-0.3.6.tgz#3569708bd4be4d8870ba32bf1c456dac81600d97" - integrity sha512-SEeaJLb3qBNF/OaXnaR1NmmBbFYk1zC0ZH/52fATcRPLFg/p791YrcyFFy44Bo9sLaGuSuLp5Q6axbb/O+v/RA== +"@napi-rs/wasm-runtime@^1.1.4": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@napi-rs/wasm-runtime/-/wasm-runtime-1.2.2.tgz#c70706532e5827c0932ca6bf43ee2c512f29c639" + integrity sha512-JfB4kuJQjaoHuCTseIINHtHWeJnvgEcxjwA5t/Y00ZgaOO1Crz3fjT/p8kT28zA/Caz7oiUMn3d6H2yOVCVwuw== + dependencies: + "@tybys/wasm-util" "^0.10.3" + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.8": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@nolyfill/is-core-module@1.0.39": + version "1.0.39" + resolved "https://registry.yarnpkg.com/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz#3dc35ba0f1e66b403c00b39344f870298ebb1c8e" + integrity sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA== "@react-native-async-storage/async-storage@^3.1.1": version "3.1.1" @@ -1582,6 +1666,13 @@ dependencies: "@sinonjs/commons" "^3.0.0" +"@tybys/wasm-util@^0.10.3": + version "0.10.3" + resolved "https://registry.yarnpkg.com/@tybys/wasm-util/-/wasm-util-0.10.3.tgz#015cba9e9dd47ce14d03d2a8c5d547bfb169665d" + integrity sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg== + dependencies: + tslib "^2.4.0" + "@types/babel__core@^7.1.14": version "7.20.5" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" @@ -1687,7 +1778,7 @@ dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@8.65.0": +"@typescript-eslint/eslint-plugin@^8.9.0": version "8.65.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.65.0.tgz#0a58df6fea8c0bf6b396f518077099bc8b762bb5" integrity sha512-IEgob78X12rHpUmtcwFsXhZdVGJtwTVP8FiCLZkR6GlYVrl2PcuB+KhCE5BlVC/eQpQnu8WXRtkHZuPar+gCRA== @@ -1701,7 +1792,7 @@ natural-compare "^1.4.0" ts-api-utils "^2.5.0" -"@typescript-eslint/parser@8.65.0": +"@typescript-eslint/parser@^8.9.0": version "8.65.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.65.0.tgz#5295c1058c0a1dd746ef28baaf9c0341dbdf03dc" integrity sha512-CZ4nMxWwgu1HEEFNkeaCptra9QCtkmKdgf3sWh1rl1trIhmxLilgTV4cwcbQ4wemnT4sWQN8CaKOmdYx+g2gMA== @@ -1745,7 +1836,7 @@ debug "^4.4.3" ts-api-utils "^2.5.0" -"@typescript-eslint/types@8.65.0", "@typescript-eslint/types@^8.65.0": +"@typescript-eslint/types@8.65.0", "@typescript-eslint/types@^8.29.1", "@typescript-eslint/types@^8.65.0": version "8.65.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.65.0.tgz#3e86738416a777c8b8925ab46745f48ecf904c9f" integrity sha512-JSSwWNy+H0E/01jJEM+hrX6N0OFDzFzeIhHFSAS01tlVaevpG8cFyYRPhS5yjGOvBUx3sqQHVMjCL1CAZZMxBg== @@ -1765,7 +1856,7 @@ tinyglobby "^0.2.15" ts-api-utils "^2.5.0" -"@typescript-eslint/utils@8.65.0": +"@typescript-eslint/utils@8.65.0", "@typescript-eslint/utils@^8.29.1": version "8.65.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.65.0.tgz#afedd974a0c8deeef553b509df5800bafd615a72" integrity sha512-gXiwIHsYreboxeJucHKPvgwl7dXt50mF8s1/c00cP/WoVTyWKFdtfhRWwZiXYFU5H2O8vVoSLNrexFZjYS/SGA== @@ -1783,11 +1874,125 @@ "@typescript-eslint/types" "8.65.0" eslint-visitor-keys "^5.0.0" -"@ungap/structured-clone@^1.3.0": +"@ungap/structured-clone@^1.2.0", "@ungap/structured-clone@^1.3.0": version "1.3.3" resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.3.3.tgz#094041e1a4cb1987f038335421281ac8be390bcc" integrity sha512-60YRaenCQcVjYEKOcG824+DRGGIQ3VKErcBoAEDJZz5bKIs2ZG+X/H9Nk+Q6EVkwJk5QNApxbrc5QtBSwtrXAg== +"@unrs/resolver-binding-android-arm-eabi@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.12.2.tgz#98a9fee62c01f209747a4ab5855f1ced38a6d03a" + integrity sha512-g5T90pqg1bo/7mytQx6F4iBNC0Wsh9cu+z9veDbFjc7HjpesJFWD7QMS0NGStXM075+7dJPPVvBbpZlnrdpi/w== + +"@unrs/resolver-binding-android-arm64@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.12.2.tgz#46b7e8a1393f907462324f1576e8883529acf066" + integrity sha512-YGCRZv/9GLhwmz6mYDeTsm/92BAyR28l6c2ReweVW5pWgfsitWLY8upvfRlGdoyD8HjeTHSYJWyZGD4KJA/nFQ== + +"@unrs/resolver-binding-darwin-arm64@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.12.2.tgz#0ea07b00e2583ab004b853d4c02ec5f0745d490c" + integrity sha512-u9DiNT1auQMO20A9SyTuG3wUgQWB9Z7KjAg0uFuCDR1FsAY8A0CG2S6JpHS1xwm/w1G08bjXZDcyOCjv1WAm2w== + +"@unrs/resolver-binding-darwin-x64@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.12.2.tgz#a2a6901ed58449b91b4438e582f6890cba956049" + integrity sha512-f7rPLi/T1HVKZu/u6t87lroib16n8vrSzcyxI7lg4BGO9UF26KhQL44sd9eOUgrTYhvRXtWOIZT5PejdPyJfUA== + +"@unrs/resolver-binding-freebsd-x64@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.12.2.tgz#ebe6fe7f6706b7378ea4a48a024602e9c2f48f89" + integrity sha512-BpcOjWCJub6nRZUS2zA20pmLvjtqAtGejETaIyRLiZiQf++cbrjltLA5NN/xaXfqeOBOSlMFbemIl5/S5tljmg== + +"@unrs/resolver-binding-linux-arm-gnueabihf@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.12.2.tgz#e6040fedaa240124419d35b25b69c5fa15ddb499" + integrity sha512-vZTDvdSISZjJx66OzJqtsOhzifbqRjbmI1Mnu49fQDwog5GtDI4QidRiEAYbZCRj9C8YZEW+3ZjqsyS9GR4k2A== + +"@unrs/resolver-binding-linux-arm-musleabihf@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.12.2.tgz#d217a8fb59f659c131539326c140e7b62e3e3c6a" + integrity sha512-BiPI+IrIlwcW4nLLMM21+B1dFPzd55yAVgVGrdgDjNef+ch03GdxrcyaIz8X9SsQirh/kCQ7mviyWlMxdh2D7g== + +"@unrs/resolver-binding-linux-arm64-gnu@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.12.2.tgz#edab13c46a45783a7e01351e113825c04f352e24" + integrity sha512-zJc0H99FEPoFfSrNpa91HYfxzfAJCr502oxNK1cfdC9hlaFI43RT+JFCann9JUgZmLzzntChHyn13Sgn9ljHNg== + +"@unrs/resolver-binding-linux-arm64-musl@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.12.2.tgz#e5e195db1130f7d3b6aa2fd67b3c9fe1ea4859a0" + integrity sha512-KQ3Lki6l+Pz1k/eBipN41ES+YUK30beLGb9YqcB1O542cyLCNE6GaxrfcY3T6EezmGGk84wb5XyO9loTM9tkcA== + +"@unrs/resolver-binding-linux-loong64-gnu@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-loong64-gnu/-/resolver-binding-linux-loong64-gnu-1.12.2.tgz#f01d22e091bae13016f4636698d9dcbbda775c3e" + integrity sha512-3SJGEh1DborhG6pyxvhPzCT4bbSIVihsvgJc13P1bHG7KLdNDaF9T3gsTwFc7Jw/5Y5/iWOjkEx7Zy0NvCGX3Q== + +"@unrs/resolver-binding-linux-loong64-musl@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-loong64-musl/-/resolver-binding-linux-loong64-musl-1.12.2.tgz#7d23efcb98adf076bfbcecc27b4212c36aa6697d" + integrity sha512-jiuG/Obbel7uw1PwHNFfrkiKhLAF6mnyZ6aWlOAVN9WqKm8v0OFGnciJIHu8+CMvXLQ8AD51LPzAoUfT21D5Ew== + +"@unrs/resolver-binding-linux-ppc64-gnu@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.12.2.tgz#1f35f1eaa322f33cf2d96dac27f0626a93ffe2f6" + integrity sha512-q7xRvVpmcfeL+LlZg8Pbbo6QaTZwDU5BaGZbwfhkEsXJn3Was8xYfE0RBH266xZt0rM6B7i8xAYIvjthuUIWHg== + +"@unrs/resolver-binding-linux-riscv64-gnu@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.12.2.tgz#674faa696f5ce96f214873946a1e2d6ca96723dd" + integrity sha512-0CVdx6lcnT3Q9inOH8tsMIOJ6ImndllMjqJHg8RLVdB7Vq4SfkEXl9mCSsVNuNA4MCYycRicCUxPCabVHJRr6A== + +"@unrs/resolver-binding-linux-riscv64-musl@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.12.2.tgz#37835fdd0b472ecdcffccd4288f19018454b138c" + integrity sha512-iOwlRo9vnp6R6ohHQS11n0NnfdXx/omhkocmIfaPRpQhKZ+3BDMkkdRVh53qjkFkpPddf+FETA28NwGN7l5l+w== + +"@unrs/resolver-binding-linux-s390x-gnu@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.12.2.tgz#b6edf13db4bb0accdcd1ad482a4eea0301de9224" + integrity sha512-HYJtLfXq94q8iZNFT1lknx258wlkkWhZeUXJRqzKBBUJ00CvZ+N33zgbCqimLjsyw5Va6uUxhVa12mI+kaveEw== + +"@unrs/resolver-binding-linux-x64-gnu@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.12.2.tgz#daddad00bf65a405202284da1eb1db8eb83b218f" + integrity sha512-mPsUhunKKDih5O96Y6enDQyHc1SqBPlY1E/SfMWDM3EdJ95Z9CArPeCVwCCqbP45ljvivdEk8Fxn+SIb1rDAJQ== + +"@unrs/resolver-binding-linux-x64-musl@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.12.2.tgz#dfdff1e0c2bad25420b41c76a746011c3983b9bb" + integrity sha512-azrt6+5ydLd8Vt210AAFis/lZevSfPw93EJRIJG+xPu4WCJ8K0kppCTpMyLPcKT7H15M4Jnt2tMp5bOvCkRC6A== + +"@unrs/resolver-binding-openharmony-arm64@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-openharmony-arm64/-/resolver-binding-openharmony-arm64-1.12.2.tgz#ce07c4f5e7b42f7bfce45e7629b8659063aefefe" + integrity sha512-YZ9hP4O0X9PQb8eO980qmLNGH4zT3I9+SZTdt0Pr0YyuGQhYKoOZkV02VzrzyOZJ5xIJ3UFIenKkUkGg8GjgWQ== + +"@unrs/resolver-binding-wasm32-wasi@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.12.2.tgz#82514f0506cfaf65f17fe16095f92d450e487183" + integrity sha512-tYFDIkMxSflfEc/h92ZWNsZlHSwgimbNHSO3PL2JWQHfCuC2q316jMyYU9TIWZsFK2bQwyK5VAdYgn8ygPj69A== + dependencies: + "@emnapi/core" "1.10.0" + "@emnapi/runtime" "1.10.0" + "@napi-rs/wasm-runtime" "^1.1.4" + +"@unrs/resolver-binding-win32-arm64-msvc@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.12.2.tgz#521427dd59a8f4740ddd1dc7c3bc6af1aa1d260d" + integrity sha512-qzNyg3xL0VPQmCaUh+N5jSitce6k+uCBfMDesWRnlULOZaqUkaJ0ybdT+UqlAWJoQjuqfIU/0Ptx9bteN4D82g== + +"@unrs/resolver-binding-win32-ia32-msvc@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.12.2.tgz#05b63286ff2da37e0ce3083b8390884385efff62" + integrity sha512-WD9sY00OfpHVGfsnHZoA8jVT+esS/Bg8z8jzxp5BnDCjjwsuKsPQrzswwpFy4J1AUJbXPRfkpcX0mXrzeXW79g== + +"@unrs/resolver-binding-win32-x64-msvc@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.12.2.tgz#72da0da48d72b1e87831b9c0308931d3f4669027" + integrity sha512-nAB74NfSNKknqQ1RrYj6uz8FcXEomu/MATJZxh/x+BArzN2U3JbOYC0APYzUIGhVY3m5hRxA8VPNdPBoG8txlA== + "@urql/core@^5.0.6", "@urql/core@^5.1.2": version "5.2.0" resolved "https://registry.yarnpkg.com/@urql/core/-/core-5.2.0.tgz#77ee41e192e261fea30c2ca6c2f340410b45d214" @@ -1842,7 +2047,7 @@ acorn-jsx@^5.3.2: resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn@^8.15.0: +acorn@^8.15.0, acorn@^8.9.0: version "8.18.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.18.0.tgz#4faf01b2d6d326bfeed97aea1f52220b5f4c1940" integrity sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ== @@ -1852,7 +2057,7 @@ agent-base@^7.1.2: resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.4.tgz#e3cd76d4c548ee895d3c3fd8dc1f6c5b9032e7a8" integrity sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ== -ajv@^6.14.0: +ajv@^6.12.4, ajv@^6.14.0: version "6.15.0" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.15.0.tgz#07e982c74626167aa7a2495c53817892d7139492" integrity sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw== @@ -1941,7 +2146,7 @@ array-buffer-byte-length@^1.0.1, array-buffer-byte-length@^1.0.2: call-bound "^1.0.3" is-array-buffer "^3.0.5" -array-includes@^3.1.9: +array-includes@^3.1.6, array-includes@^3.1.8, array-includes@^3.1.9: version "3.1.9" resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.9.tgz#1f0ccaa08e90cdbc3eb433210f903ad0f17c3f3a" integrity sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ== @@ -1955,6 +2160,18 @@ array-includes@^3.1.9: is-string "^1.1.1" math-intrinsics "^1.1.0" +array.prototype.findlast@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz#3e4fbcb30a15a7f5bf64cf2faae22d139c2e4904" + integrity sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-shim-unscopables "^1.0.2" + array.prototype.findlastindex@^1.2.6: version "1.2.6" resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz#cfa1065c81dcb64e34557c9b81d012f6a421c564" @@ -1968,7 +2185,7 @@ array.prototype.findlastindex@^1.2.6: es-object-atoms "^1.1.1" es-shim-unscopables "^1.1.0" -array.prototype.flat@^1.3.3: +array.prototype.flat@^1.3.1, array.prototype.flat@^1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz#534aaf9e6e8dd79fb6b9a9917f839ef1ec63afe5" integrity sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg== @@ -1988,6 +2205,17 @@ array.prototype.flatmap@^1.3.3: es-abstract "^1.23.5" es-shim-unscopables "^1.0.2" +array.prototype.tosorted@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz#fe954678ff53034e717ea3352a03f0b0b86f7ffc" + integrity sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.3" + es-errors "^1.3.0" + es-shim-unscopables "^1.0.2" + arraybuffer.prototype.slice@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz#9d760d84dbdd06d0cbf92c8849615a1a7ab3183c" @@ -2499,7 +2727,7 @@ core-js-compat@^3.43.0: dependencies: browserslist "^4.28.1" -cross-spawn@^7.0.6: +cross-spawn@^7.0.2, cross-spawn@^7.0.6: version "7.0.6" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== @@ -2604,7 +2832,7 @@ define-lazy-prop@^2.0.0: resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== -define-properties@^1.2.1: +define-properties@^1.1.3, define-properties@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== @@ -2635,6 +2863,13 @@ doctrine@^2.1.0: dependencies: esutils "^2.0.2" +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + dotenv-expand@~11.0.6: version "11.0.7" resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-11.0.7.tgz#af695aea007d6fdc84c86cd8d0ad7beb40a0bd08" @@ -2708,7 +2943,7 @@ es-abstract-get@^1.0.0: is-callable "^1.2.7" object-inspect "^1.13.4" -es-abstract@^1.23.2, es-abstract@^1.23.5, es-abstract@^1.23.9, es-abstract@^1.24.0, es-abstract@^1.24.2: +es-abstract@^1.17.5, es-abstract@^1.23.2, es-abstract@^1.23.3, es-abstract@^1.23.5, es-abstract@^1.23.6, es-abstract@^1.23.9, es-abstract@^1.24.0, es-abstract@^1.24.2: version "1.24.2" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.24.2.tgz#2dbd38c180735ee983f77585140a2706a963ed9a" integrity sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg== @@ -2778,6 +3013,28 @@ es-errors@^1.3.0: resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== +es-iterator-helpers@^1.2.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.4.0.tgz#2b4635ee3e8db2285378a47a1ea8f8dd34adb653" + integrity sha512-c/A0P0oxkACDc+cKWw8evLXK83oBKgn0qPOqCYT4x9uolpCIJAcYvJC9QYKNDRPsTeGyCrQ326jrvgZWdCdK5Q== + dependencies: + call-bind "^1.0.9" + call-bound "^1.0.4" + define-properties "^1.2.1" + es-abstract "^1.24.2" + es-errors "^1.3.0" + es-set-tostringtag "^2.1.0" + function-bind "^1.1.2" + get-intrinsic "^1.3.0" + globalthis "^1.0.4" + gopd "^1.2.0" + has-property-descriptors "^1.0.2" + has-proto "^1.2.0" + has-symbols "^1.1.0" + internal-slot "^1.1.0" + iterator.prototype "^1.1.5" + math-intrinsics "^1.1.0" + es-object-atoms@^1.0.0, es-object-atoms@^1.1.1, es-object-atoms@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.2.tgz#a2d0b373205724dfa525d23b0c3e1b1ca582c99b" @@ -2839,10 +3096,18 @@ escape-string-regexp@^4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== -eslint-config-prettier@^10.1.5: - version "10.1.8" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz#15734ce4af8c2778cc32f0b01b37b0b5cd1ecb97" - integrity sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w== +eslint-config-expo@~8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/eslint-config-expo/-/eslint-config-expo-8.0.1.tgz#a68488f47fc38e7aa0e352f08afe5da6068addf6" + integrity sha512-r9PSgkuZk5Q5ALbk1yowYwEIj0oqO/ikRO9TNhpx2DzSOdK65y3urgFI04WYvQzMr9q1fnA62wr9iGfrsmF5pQ== + dependencies: + "@typescript-eslint/eslint-plugin" "^8.9.0" + "@typescript-eslint/parser" "^8.9.0" + eslint-import-resolver-typescript "^3.6.3" + eslint-plugin-expo "^0.1.0" + eslint-plugin-import "^2.30.0" + eslint-plugin-react "^7.36.1" + eslint-plugin-react-hooks "^4.6.2" eslint-import-resolver-node@^0.3.9: version "0.3.10" @@ -2853,6 +3118,19 @@ eslint-import-resolver-node@^0.3.9: is-core-module "^2.16.1" resolve "^2.0.0-next.6" +eslint-import-resolver-typescript@^3.6.3: + version "3.10.1" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.10.1.tgz#23dac32efa86a88e2b8232eb244ac499ad636db2" + integrity sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ== + dependencies: + "@nolyfill/is-core-module" "1.0.39" + debug "^4.4.0" + get-tsconfig "^4.10.0" + is-bun-module "^2.0.0" + stable-hash "^0.0.5" + tinyglobby "^0.2.13" + unrs-resolver "^1.6.2" + eslint-module-utils@^2.12.1: version "2.14.0" resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.14.0.tgz#611f8e1c6ceb29a93eb949e1cc670b8287764819" @@ -2860,7 +3138,16 @@ eslint-module-utils@^2.12.1: dependencies: debug "^3.2.7" -eslint-plugin-import@^2.31.0: +eslint-plugin-expo@^0.1.0: + version "0.1.4" + resolved "https://registry.yarnpkg.com/eslint-plugin-expo/-/eslint-plugin-expo-0.1.4.tgz#fbeb5f126028b5fad6d977ac5128d774bd8a8144" + integrity sha512-YA7yiMacQbLJySuyJA0Eb5V65obqp6fVOWtw1JdYDRWC5MeToPrnNvhGDpk01Bv3Vm4ownuzUfvi89MXi1d6cg== + dependencies: + "@typescript-eslint/types" "^8.29.1" + "@typescript-eslint/utils" "^8.29.1" + eslint "^9.24.0" + +eslint-plugin-import@^2.30.0: version "2.32.0" resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz#602b55faa6e4caeaa5e970c198b5c00a37708980" integrity sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA== @@ -2885,23 +3172,42 @@ eslint-plugin-import@^2.31.0: string.prototype.trimend "^1.0.9" tsconfig-paths "^3.15.0" -eslint-plugin-prettier@^5.5.1: - version "5.5.6" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.6.tgz#363ebe4d769bce157ccdd8129ce3efd91dc62564" - integrity sha512-ifetmTcxWfz+4qRW3pH/ujdTq2jQIj59AxJMIN26K5avYgU8dxycUETQonWiW+wPrYXA0j3Try0l1CnwVQtDqQ== - dependencies: - prettier-linter-helpers "^1.0.1" - synckit "^0.11.13" +eslint-plugin-react-hooks@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz#c829eb06c0e6f484b3fbb85a97e57784f328c596" + integrity sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ== -eslint-plugin-react-hooks@^5.1.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz#1be0080901e6ac31ce7971beed3d3ec0a423d9e3" - integrity sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg== +eslint-plugin-react@^7.36.1: + version "7.37.5" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz#2975511472bdda1b272b34d779335c9b0e877065" + integrity sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA== + dependencies: + array-includes "^3.1.8" + array.prototype.findlast "^1.2.5" + array.prototype.flatmap "^1.3.3" + array.prototype.tosorted "^1.1.4" + doctrine "^2.1.0" + es-iterator-helpers "^1.2.1" + estraverse "^5.3.0" + hasown "^2.0.2" + jsx-ast-utils "^2.4.1 || ^3.0.0" + minimatch "^3.1.2" + object.entries "^1.1.9" + object.fromentries "^2.0.8" + object.values "^1.2.1" + prop-types "^15.8.1" + resolve "^2.0.0-next.5" + semver "^6.3.1" + string.prototype.matchall "^4.0.12" + string.prototype.repeat "^1.0.0" -eslint-plugin-simple-import-sort@^12.1.0: - version "12.1.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-12.1.1.tgz#e64bfdaf91c5b98a298619aa634a9f7aa43b709e" - integrity sha512-6nuzu4xwQtE3332Uz0to+TxDQYRLTKRESSc2hefVT48Zc8JthmN23Gx9lnYhu0FtkRSL1oxny3kJ2aveVhmOVA== +eslint-scope@^7.2.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" + integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" eslint-scope@^8.4.0: version "8.4.0" @@ -2911,7 +3217,7 @@ eslint-scope@^8.4.0: esrecurse "^4.3.0" estraverse "^5.2.0" -eslint-visitor-keys@^3.4.3: +eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: version "3.4.3" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== @@ -2926,7 +3232,51 @@ eslint-visitor-keys@^5.0.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz#9e3c9489697824d2d4ce3a8ad12628f91e9f59be" integrity sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA== -eslint@^9.0.0: +eslint@^8.57.1: + version "8.57.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.1.tgz#7df109654aba7e3bbe5c8eae533c5e461d3c6ca9" + integrity sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.6.1" + "@eslint/eslintrc" "^2.1.4" + "@eslint/js" "8.57.1" + "@humanwhocodes/config-array" "^0.13.0" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" + "@ungap/structured-clone" "^1.2.0" + ajv "^6.12.4" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.2.2" + eslint-visitor-keys "^3.4.3" + espree "^9.6.1" + esquery "^1.4.2" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + glob-parent "^6.0.2" + globals "^13.19.0" + graphemer "^1.4.0" + ignore "^5.2.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + is-path-inside "^3.0.3" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.3" + strip-ansi "^6.0.1" + text-table "^0.2.0" + +eslint@^9.24.0: version "9.39.5" resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.39.5.tgz#2a4e3c8b0f753196efae943c8ffaa8730fc6a3fa" integrity sha512-DgZS62aPLXKlnxILS/AYCoRvHaZeXceIzlXPkkGGzJWSow1aEk0lbTlxUSlyjC8jcaKxAdOnTDz+o1JFSBsyjw== @@ -2975,12 +3325,21 @@ espree@^10.0.1, espree@^10.4.0: acorn-jsx "^5.3.2" eslint-visitor-keys "^4.2.1" +espree@^9.6.0, espree@^9.6.1: + version "9.6.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" + integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== + dependencies: + acorn "^8.9.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.4.1" + esprima@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.5.0: +esquery@^1.4.2, esquery@^1.5.0: version "1.7.0" resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.7.0.tgz#08d048f261f0ddedb5bae95f46809463d9c9496d" integrity sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g== @@ -2994,7 +3353,7 @@ esrecurse@^4.3.0: dependencies: estraverse "^5.2.0" -estraverse@^5.1.0, estraverse@^5.2.0: +estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== @@ -3131,11 +3490,6 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-diff@^1.1.2: - version "1.3.0" - resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" - integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== - fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" @@ -3151,6 +3505,13 @@ fast-text-encoding@1.0.6: resolved "https://registry.yarnpkg.com/fast-text-encoding/-/fast-text-encoding-1.0.6.tgz#0aa25f7f638222e3396d72bf936afcf1d42d6867" integrity sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w== +fastq@^1.6.0: + version "1.20.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.20.1.tgz#ca750a10dc925bc8b18839fd203e3ef4b3ced675" + integrity sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw== + dependencies: + reusify "^1.0.4" + fb-watchman@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" @@ -3163,6 +3524,13 @@ fdir@^6.5.0: resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.5.0.tgz#ed2ab967a331ade62f18d077dae192684d50d350" integrity sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg== +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + file-entry-cache@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f" @@ -3206,6 +3574,15 @@ find-up@^5.0.0: locate-path "^6.0.0" path-exists "^4.0.0" +flat-cache@^3.0.4: + version "3.2.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" + integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== + dependencies: + flatted "^3.2.9" + keyv "^4.5.3" + rimraf "^3.0.2" + flat-cache@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-4.0.1.tgz#0ece39fcb14ee012f4b0410bd33dd9c1f011127c" @@ -3317,7 +3694,7 @@ get-package-type@^0.1.0: resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== -get-proto@^1.0.1: +get-proto@^1.0.0, get-proto@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== @@ -3334,6 +3711,13 @@ get-symbol-description@^1.1.0: es-errors "^1.3.0" get-intrinsic "^1.2.6" +get-tsconfig@^4.10.0: + version "4.14.0" + resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.14.0.tgz#985d85c52a9903864280ccc2448d413fbf1efed8" + integrity sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA== + dependencies: + resolve-pkg-maps "^1.0.0" + getenv@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/getenv/-/getenv-2.0.0.tgz#b1698c7b0f29588f4577d06c42c73a5b475c69e0" @@ -3367,6 +3751,13 @@ glob@^7.1.1, glob@^7.1.3, glob@^7.1.4: once "^1.3.0" path-is-absolute "^1.0.0" +globals@^13.19.0: + version "13.24.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" + integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== + dependencies: + type-fest "^0.20.2" + globals@^14.0.0: version "14.0.0" resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e" @@ -3390,6 +3781,11 @@ graceful-fs@^4.2.4, graceful-fs@^4.2.9: resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + has-bigints@^1.0.2: version "1.1.0" resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.1.0.tgz#28607e965ac967e03cd2a2c70a2636a1edad49fe" @@ -3609,6 +4005,13 @@ is-boolean-object@^1.2.1: call-bound "^1.0.3" has-tostringtag "^1.0.2" +is-bun-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-bun-module/-/is-bun-module-2.0.0.tgz#4d7859a87c0fcac950c95e666730e745eae8bddd" + integrity sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ== + dependencies: + semver "^7.7.1" + is-callable@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" @@ -3708,6 +4111,11 @@ is-number@^7.0.0: resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== +is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + is-regex@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.2.1.tgz#76d70a3ed10ef9be48eb577887d74205bf0cad22" @@ -3807,6 +4215,18 @@ istanbul-lib-instrument@^5.0.4: istanbul-lib-coverage "^3.2.0" semver "^6.3.0" +iterator.prototype@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.5.tgz#12c959a29de32de0aa3bbbb801f4d777066dae39" + integrity sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g== + dependencies: + define-data-property "^1.1.4" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.6" + get-proto "^1.0.0" + has-symbols "^1.1.0" + set-function-name "^2.0.2" + jest-environment-node@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.7.0.tgz#0b93e111dda8ec120bc8300e6d1fb9576e164376" @@ -3968,7 +4388,17 @@ json5@^2.2.3: resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== -keyv@^4.5.4: +"jsx-ast-utils@^2.4.1 || ^3.0.0": + version "3.3.5" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a" + integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ== + dependencies: + array-includes "^3.1.6" + array.prototype.flat "^1.3.1" + object.assign "^4.1.4" + object.values "^1.1.6" + +keyv@^4.5.3, keyv@^4.5.4: version "4.5.4" resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== @@ -4126,7 +4556,7 @@ log-symbols@^2.2.0: dependencies: chalk "^2.0.1" -loose-envify@^1.0.0: +loose-envify@^1.0.0, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== @@ -4611,7 +5041,7 @@ minimatch@^10.2.2: dependencies: brace-expansion "^5.0.8" -minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2, minimatch@^3.1.5: +minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2, minimatch@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.5.tgz#580c88f8d5445f2bd6aa8f3cadefa0de79fbd69e" integrity sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w== @@ -4676,6 +5106,11 @@ nanoid@^3.3.7: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.16.tgz#a04d8ec4b1f10009d2d533947aefe4293737816c" integrity sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q== +napi-postinstall@^0.3.4: + version "0.3.4" + resolved "https://registry.yarnpkg.com/napi-postinstall/-/napi-postinstall-0.3.4.tgz#7af256d6588b5f8e952b9190965d6b019653bbb9" + integrity sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ== + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" @@ -4760,7 +5195,7 @@ ob1@0.83.7: dependencies: flow-enums-runtime "^0.0.6" -object-assign@^4.0.1: +object-assign@^4.0.1, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== @@ -4775,7 +5210,7 @@ object-keys@^1.1.1: resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object.assign@^4.1.7: +object.assign@^4.1.4, object.assign@^4.1.7: version "4.1.7" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.7.tgz#8c14ca1a424c6a561b0bb2a22f66f5049a945d3d" integrity sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw== @@ -4816,7 +5251,7 @@ object.groupby@^1.0.3: define-properties "^1.2.1" es-abstract "^1.23.2" -object.values@^1.2.1: +object.values@^1.1.6, object.values@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.1.tgz#deed520a50809ff7f75a7cfd4bc64c7a038c6216" integrity sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA== @@ -5043,18 +5478,6 @@ prelude-ls@^1.2.1: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== -prettier-linter-helpers@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.1.tgz#6a31f88a4bad6c7adda253de12ba4edaea80ebcd" - integrity sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg== - dependencies: - fast-diff "^1.1.2" - -prettier@^3.6.2: - version "3.9.6" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.9.6.tgz#b3ea5146515d40fc53f18aa63f74dfab1e10dbf6" - integrity sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g== - pretty-bytes@^5.6.0: version "5.6.0" resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" @@ -5094,6 +5517,15 @@ prompts@^2.3.2: kleur "^3.0.3" sisteransi "^1.0.5" +prop-types@^15.8.1: + version "15.8.1" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + punycode@^2.1.0, punycode@^2.1.1: version "2.3.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" @@ -5104,6 +5536,11 @@ qrcode-terminal@0.11.0: resolved "https://registry.yarnpkg.com/qrcode-terminal/-/qrcode-terminal-0.11.0.tgz#ffc6c28a2fc0bfb47052b47e23f4f446a5fbdb9e" integrity sha512-Uu7ii+FQy4Qf82G4xu7ShHhjhGahEpCWc3x8UavY3CTcWV+ufmmCtwkr7ZKsX42jdL0kr1B5FKUeqJvAn51jzQ== +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + queue@6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/queue/-/queue-6.0.2.tgz#b91525283e2315c7553d2efa18d83e76432fed65" @@ -5134,6 +5571,11 @@ react-devtools-core@^6.1.5: shell-quote "^1.6.1" ws "^7" +react-is@^16.13.1: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + react-is@^18.0.0: version "18.3.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" @@ -5269,7 +5711,7 @@ regenerator-runtime@^0.13.2: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== -regexp.prototype.flags@^1.5.4: +regexp.prototype.flags@^1.5.3, regexp.prototype.flags@^1.5.4: version "1.5.4" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz#1ad6c62d44a259007e55b3970e00f746efbcaa19" integrity sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA== @@ -5334,6 +5776,11 @@ resolve-from@^5.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== +resolve-pkg-maps@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" + integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== + resolve-workspace-root@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/resolve-workspace-root/-/resolve-workspace-root-2.0.1.tgz#9cbbf8321ebccaaf0e4ffea5274aa26b611ccd62" @@ -5354,7 +5801,7 @@ resolve@^1.22.11, resolve@^1.22.2: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -resolve@^2.0.0-next.6: +resolve@^2.0.0-next.5, resolve@^2.0.0-next.6: version "2.0.0-next.7" resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.7.tgz#ba3b035d4b1ee7c522426eee73cabcb0fd5515dd" integrity sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ== @@ -5381,6 +5828,11 @@ restore-cursor@^2.0.0: onetime "^2.0.0" signal-exit "^3.0.2" +reusify@^1.0.4: + version "1.1.0" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.1.0.tgz#0fe13b9522e1473f51b558ee796e08f11f9b489f" + integrity sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw== + rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" @@ -5388,6 +5840,13 @@ rimraf@^3.0.2: dependencies: glob "^7.1.3" +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + rxjs@^7.5.2: version "7.8.2" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.2.tgz#955bc473ed8af11a002a2be52071bf475638607b" @@ -5448,7 +5907,7 @@ semver@^6.3.0, semver@^6.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.1.3, semver@^7.3.5, semver@^7.5.4, semver@^7.6.0, semver@^7.7.2, semver@^7.7.3: +semver@^7.1.3, semver@^7.3.5, semver@^7.5.4, semver@^7.6.0, semver@^7.7.1, semver@^7.7.2, semver@^7.7.3: version "7.8.5" resolved "https://registry.yarnpkg.com/semver/-/semver-7.8.5.tgz#39b646037dd50c14fb451e7e4cac58ed8b863f69" integrity sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA== @@ -5637,6 +6096,11 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== +stable-hash@^0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/stable-hash/-/stable-hash-0.0.5.tgz#94e8837aaeac5b4d0f631d2972adef2924b40269" + integrity sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA== + stack-utils@^2.0.3: version "2.0.6" resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" @@ -5688,6 +6152,33 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" +string.prototype.matchall@^4.0.12: + version "4.0.12" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz#6c88740e49ad4956b1332a911e949583a275d4c0" + integrity sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + define-properties "^1.2.1" + es-abstract "^1.23.6" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.6" + gopd "^1.2.0" + has-symbols "^1.1.0" + internal-slot "^1.1.0" + regexp.prototype.flags "^1.5.3" + set-function-name "^2.0.2" + side-channel "^1.1.0" + +string.prototype.repeat@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz#e90872ee0308b29435aa26275f6e1b762daee01a" + integrity sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + string.prototype.trim@^1.2.10: version "1.2.11" resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.11.tgz#e6bd19cda3985d05a42dda31f3ddf4d35d3430e3" @@ -5802,13 +6293,6 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== -synckit@^0.11.13: - version "0.11.13" - resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.11.13.tgz#062a5ea57d81befc35892f8254de5c567e97c80a" - integrity sha512-eNRKgb3z66Yp3D2CixVujOUvXLFUTij/zVnV8KRyvFdQwpz7I5DS8UfRkTeLzb64u+dkzDSdelE24izu+zSSUg== - dependencies: - "@pkgr/core" "^0.3.6" - tar@^7.5.2: version "7.5.22" resolved "https://registry.yarnpkg.com/tar/-/tar-7.5.22.tgz#a696f998136e71487dc3f869a85bba2c67971ba9" @@ -5847,6 +6331,11 @@ test-exclude@^6.0.0: glob "^7.1.4" minimatch "^3.0.4" +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + thenify-all@^1.0.0: version "1.6.0" resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" @@ -5866,7 +6355,7 @@ throat@^5.0.0: resolved "https://registry.yarnpkg.com/throat/-/throat-5.0.0.tgz#c5199235803aad18754a667d659b5e72ce16764b" integrity sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA== -tinyglobby@^0.2.11, tinyglobby@^0.2.15: +tinyglobby@^0.2.11, tinyglobby@^0.2.13, tinyglobby@^0.2.15: version "0.2.17" resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.17.tgz#562a9a6c9eb2b3b123d39719f9af5bb44fcd7631" integrity sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g== @@ -5911,7 +6400,7 @@ tsconfig-paths@^3.15.0: minimist "^1.2.6" strip-bom "^3.0.0" -tslib@^2.1.0: +tslib@^2.1.0, tslib@^2.4.0: version "2.8.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== @@ -5928,6 +6417,11 @@ type-detect@4.0.8: resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + type-fest@^0.21.3: version "0.21.3" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" @@ -5990,16 +6484,6 @@ typed-emitter@^2.1.0: optionalDependencies: rxjs "^7.5.2" -typescript-eslint@^8.29.1: - version "8.65.0" - resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.65.0.tgz#754c953fd6a9a3d36fa54015bdba80a6eb2a4957" - integrity sha512-/ggrHAwyjENDusvyxbuqxAC2dTnZg/Z8F+fgQtYIz+L6n/9HfSlEZcFGV/NsMNa6CkGk0xUjUAFwC0vHOflvIA== - dependencies: - "@typescript-eslint/eslint-plugin" "8.65.0" - "@typescript-eslint/parser" "8.65.0" - "@typescript-eslint/typescript-estree" "8.65.0" - "@typescript-eslint/utils" "8.65.0" - typescript@~5.9.2: version "5.9.3" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.9.3.tgz#5b4f59e15310ab17a216f5d6cf53ee476ede670f" @@ -6053,6 +6537,36 @@ unpipe@~1.0.0: resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== +unrs-resolver@^1.6.2: + version "1.12.2" + resolved "https://registry.yarnpkg.com/unrs-resolver/-/unrs-resolver-1.12.2.tgz#a6c6888396abba5adaac4cab6587df866f1d7afd" + integrity sha512-dmlRxBJJayXjqTwC+JtF1HhJmgf3ftQ3YejFcZrf4+KKtJv0qDsK1pjqaaVjG7wJ5NJ6UVP1OqRMQ71Z4C3rxQ== + dependencies: + napi-postinstall "^0.3.4" + optionalDependencies: + "@unrs/resolver-binding-android-arm-eabi" "1.12.2" + "@unrs/resolver-binding-android-arm64" "1.12.2" + "@unrs/resolver-binding-darwin-arm64" "1.12.2" + "@unrs/resolver-binding-darwin-x64" "1.12.2" + "@unrs/resolver-binding-freebsd-x64" "1.12.2" + "@unrs/resolver-binding-linux-arm-gnueabihf" "1.12.2" + "@unrs/resolver-binding-linux-arm-musleabihf" "1.12.2" + "@unrs/resolver-binding-linux-arm64-gnu" "1.12.2" + "@unrs/resolver-binding-linux-arm64-musl" "1.12.2" + "@unrs/resolver-binding-linux-loong64-gnu" "1.12.2" + "@unrs/resolver-binding-linux-loong64-musl" "1.12.2" + "@unrs/resolver-binding-linux-ppc64-gnu" "1.12.2" + "@unrs/resolver-binding-linux-riscv64-gnu" "1.12.2" + "@unrs/resolver-binding-linux-riscv64-musl" "1.12.2" + "@unrs/resolver-binding-linux-s390x-gnu" "1.12.2" + "@unrs/resolver-binding-linux-x64-gnu" "1.12.2" + "@unrs/resolver-binding-linux-x64-musl" "1.12.2" + "@unrs/resolver-binding-openharmony-arm64" "1.12.2" + "@unrs/resolver-binding-wasm32-wasi" "1.12.2" + "@unrs/resolver-binding-win32-arm64-msvc" "1.12.2" + "@unrs/resolver-binding-win32-ia32-msvc" "1.12.2" + "@unrs/resolver-binding-win32-x64-msvc" "1.12.2" + update-browserslist-db@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz#64d76db58713136acbeb4c49114366cc6cc2e80d" From f2dd3a9008c500ad3cd1c8d6e04fdf6b28f5ea0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82?= Date: Mon, 3 Aug 2026 18:08:07 +0200 Subject: [PATCH 4/7] Rename VoIP status to callStatus --- mobile-react-native/voip-call/app/App.tsx | 4 ++-- .../voip-call/app/src/hooks/useCallSignaling.ts | 17 ++++++++++------- .../voip-call/app/src/screens/CallScreen.tsx | 12 ++++++------ .../voip-call/app/src/screens/UsersScreen.tsx | 4 ++-- 4 files changed, 20 insertions(+), 17 deletions(-) diff --git a/mobile-react-native/voip-call/app/App.tsx b/mobile-react-native/voip-call/app/App.tsx index b1cf490..2eec33b 100644 --- a/mobile-react-native/voip-call/app/App.tsx +++ b/mobile-react-native/voip-call/app/App.tsx @@ -25,7 +25,7 @@ import { UserProvider } from './src/user/UserProvider'; function Main({ sendSignalRef }: { sendSignalRef: SendSignalRef }) { const { username, isLoading } = useUser(); - const { status, lastEndedReason } = useVoIP(); + const { callStatus, lastEndedReason } = useVoIP(); useRequestPermissions(); useCallSignaling(sendSignalRef); @@ -42,7 +42,7 @@ function Main({ sendSignalRef }: { sendSignalRef: SendSignalRef }) { // Checked before the session gates below: a call can exist while the user session // is still loading (answering a VoIP push right after a cold start) or missing // (still registered for pushes after a logout), and it must connect regardless. - if (status === 'connecting' || status === 'active') { + if (callStatus === 'connecting' || callStatus === 'active') { return ; } diff --git a/mobile-react-native/voip-call/app/src/hooks/useCallSignaling.ts b/mobile-react-native/voip-call/app/src/hooks/useCallSignaling.ts index 108d3ea..b9ebf0a 100644 --- a/mobile-react-native/voip-call/app/src/hooks/useCallSignaling.ts +++ b/mobile-react-native/voip-call/app/src/hooks/useCallSignaling.ts @@ -17,7 +17,7 @@ export type SendSignal = (msg: Record) => void; export type SendSignalRef = MutableRefObject; export function useCallSignaling(sendSignalRef: SendSignalRef): void { - const { endCall, currentCall, status, lastEndedReason } = useVoIP(); + const { endCall, currentCall, callStatus, lastEndedReason } = useVoIP(); const { username } = useUser(); const socketRef = useRef(null); @@ -82,13 +82,16 @@ export function useCallSignaling(sendSignalRef: SendSignalRef): void { // Detect the local user ending a call before it connected, and notify the // other party so their ringing UI can be dismissed. - const prevRef = useRef<{ status: VoIPCallStatus; call: CurrentCall | null }>({ - status, + const prevRef = useRef<{ + callStatus: VoIPCallStatus; + call: CurrentCall | null; + }>({ + callStatus, call: currentCall, }); useEffect(() => { - const { status: prevStatus, call: prevCall } = prevRef.current; + const { callStatus: prevStatus, call: prevCall } = prevRef.current; const userEndedCall = lastEndedReason === 'local' || lastEndedReason === 'rejected'; @@ -96,7 +99,7 @@ export function useCallSignaling(sendSignalRef: SendSignalRef): void { if ( prevCall && prevCall.startedAt === null && - status === 'available' && + callStatus === 'available' && userEndedCall ) { // Caller cancelled an outgoing call that was still ringing. @@ -117,6 +120,6 @@ export function useCallSignaling(sendSignalRef: SendSignalRef): void { } } - prevRef.current = { status, call: currentCall }; - }, [status, currentCall, lastEndedReason, sendSignal]); + prevRef.current = { callStatus, call: currentCall }; + }, [callStatus, currentCall, lastEndedReason, sendSignal]); } diff --git a/mobile-react-native/voip-call/app/src/screens/CallScreen.tsx b/mobile-react-native/voip-call/app/src/screens/CallScreen.tsx index 0b3d766..8e96038 100644 --- a/mobile-react-native/voip-call/app/src/screens/CallScreen.tsx +++ b/mobile-react-native/voip-call/app/src/screens/CallScreen.tsx @@ -6,13 +6,13 @@ import { InCallView } from './InCallView'; import { OutgoingCallView } from './OutgoingCallView'; /** - * The screen shown for the whole lifetime of a call (`status` is `connecting` or + * The screen shown for the whole lifetime of a call (`callStatus` is `connecting` or * `active`). It owns the Fishjam side of the call: mounting joins the current call's * room via `useCallRoom`, unmounting leaves it, and the remote peer's presence is * reported back to the call as connect / hang-up. */ export function CallScreen() { - const { status, currentCall, reportConnected, endCall } = useVoIP(); + const { callStatus, currentCall, reportConnected, endCall } = useVoIP(); const { remotePeers } = usePeers(); const joinedRoom = useCallRoom(); @@ -23,13 +23,13 @@ export function CallScreen() { useEffect(() => { if (!currentCall || joinedRoom !== currentCall.roomName) return; - if (status === 'connecting' && remotePeers.length > 0) { + if (callStatus === 'connecting' && remotePeers.length > 0) { void reportConnected(); - } else if (status === 'active' && remotePeers.length === 0) { + } else if (callStatus === 'active' && remotePeers.length === 0) { void endCall('remote'); } }, [ - status, + callStatus, currentCall, joinedRoom, remotePeers.length, @@ -37,7 +37,7 @@ export function CallScreen() { endCall, ]); - if (status === 'active') { + if (callStatus === 'active') { return ; } return ; diff --git a/mobile-react-native/voip-call/app/src/screens/UsersScreen.tsx b/mobile-react-native/voip-call/app/src/screens/UsersScreen.tsx index 834dabe..13ae2bd 100644 --- a/mobile-react-native/voip-call/app/src/screens/UsersScreen.tsx +++ b/mobile-react-native/voip-call/app/src/screens/UsersScreen.tsx @@ -19,9 +19,9 @@ import { usePlaceCall } from '../hooks/usePlaceCall'; export function UsersScreen() { const { username, users, refreshUsers, logout } = useUser(); - const { status } = useVoIP(); + const { callStatus } = useVoIP(); const placeCall = usePlaceCall(); - const isCalling = status === 'connecting' || status === 'active'; + const isCalling = callStatus === 'connecting' || callStatus === 'active'; useEffect(() => { refreshUsers(); From fa20d25cea54f5789d512a4c26266914d854acc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Gadomski?= Date: Thu, 6 Aug 2026 14:26:01 +0200 Subject: [PATCH 5/7] Update voip readmes --- mobile-react-native/voip-call/README.md | 7 +++-- mobile-react-native/voip-call/app/README.md | 4 +-- .../voip-call/app/package.json | 2 +- mobile-react-native/voip-call/app/yarn.lock | 28 +++++++++---------- 4 files changed, 21 insertions(+), 20 deletions(-) diff --git a/mobile-react-native/voip-call/README.md b/mobile-react-native/voip-call/README.md index bd4c5ac..5ed62b6 100644 --- a/mobile-react-native/voip-call/README.md +++ b/mobile-react-native/voip-call/README.md @@ -47,12 +47,13 @@ devices, FCM to call Android devices, or both to call between them. above. Not `localhost` when running on a physical phone; use your machine's LAN address. -4. **Run on real devices.** VoIP pushes never reach the iOS Simulator, and FCM - needs Google Play services. Install dependencies from the repo root - (`yarn`), then: +4. **Run the app.** iOS needs a real device — CallKit's incoming call screen + doesn't work on the Simulator. Android runs on an emulator with Google Play + services. Install dependencies, then: ```bash cd app + yarn yarn ios # or: yarn android ``` diff --git a/mobile-react-native/voip-call/app/README.md b/mobile-react-native/voip-call/app/README.md index 89382b0..6ef23c5 100644 --- a/mobile-react-native/voip-call/app/README.md +++ b/mobile-react-native/voip-call/app/README.md @@ -13,8 +13,8 @@ With the [server](../server/README.md) running and `.env` filled in: yarn ios # or: yarn android ``` -Real devices only: VoIP pushes never reach the iOS Simulator, and FCM needs -Google Play services. +iOS needs a real device: CallKit's incoming call screen doesn't work on the +Simulator. Android runs on an emulator with Google Play services. ## iOS native registration diff --git a/mobile-react-native/voip-call/app/package.json b/mobile-react-native/voip-call/app/package.json index ddc76c3..87aa11e 100644 --- a/mobile-react-native/voip-call/app/package.json +++ b/mobile-react-native/voip-call/app/package.json @@ -12,7 +12,7 @@ "dependencies": { "@expo/vector-icons": "^15.0.3", "@fishjam-cloud/ios-expo-voip": "0.29.0", - "@fishjam-cloud/react-native-client": "0.30.0-rc.0", + "@fishjam-cloud/react-native-client": "0.30.0-rc.1", "@react-native-async-storage/async-storage": "^3.1.1", "expo": "~54.0.30", "expo-splash-screen": "~31.0.13", diff --git a/mobile-react-native/voip-call/app/yarn.lock b/mobile-react-native/voip-call/app/yarn.lock index 7d561e0..d98e536 100644 --- a/mobile-react-native/voip-call/app/yarn.lock +++ b/mobile-react-native/voip-call/app/yarn.lock @@ -1244,21 +1244,21 @@ resolved "https://registry.yarnpkg.com/@fishjam-cloud/ios-expo-voip/-/ios-expo-voip-0.29.0.tgz#0a662b26ab9356e17363ea6a99efc412f4a237b6" integrity sha512-QIcyc/ni3HO2oS3F4+AUVue442vbNNqmYCjnbdev9P9yjv9UePbTFoByRigrvKzL7BxyaAYIs9QQTZw3HeYoDQ== -"@fishjam-cloud/react-client@0.30.0-rc.0": - version "0.30.0-rc.0" - resolved "https://registry.yarnpkg.com/@fishjam-cloud/react-client/-/react-client-0.30.0-rc.0.tgz#743f8719f1f75545b623df9bb73970ea0943b59b" - integrity sha512-l2iJgyhmicbpN6BndrHen23kGvXedVJmZUeya2Y+dBuRe44j2o5q+0x6g02mHWCW3L19DBJThdY3++4ubF5Viw== +"@fishjam-cloud/react-client@0.30.0-rc.1": + version "0.30.0-rc.1" + resolved "https://registry.yarnpkg.com/@fishjam-cloud/react-client/-/react-client-0.30.0-rc.1.tgz#1a23d9b50cf9fa8c480d36857d5bbf54c62ce799" + integrity sha512-Dau21NUyIgG5v3Jz1SEvSlJ21NGKtBHF8ymbF3fkEy3jljYb0nfNR8mXvMzCLUfC/zb/ACCCKBn9v421K9LWkw== dependencies: - "@fishjam-cloud/ts-client" "0.30.0-rc.0" + "@fishjam-cloud/ts-client" "0.30.0-rc.1" events "3.3.0" lodash.isequal "4.5.0" -"@fishjam-cloud/react-native-client@0.30.0-rc.0": - version "0.30.0-rc.0" - resolved "https://registry.yarnpkg.com/@fishjam-cloud/react-native-client/-/react-native-client-0.30.0-rc.0.tgz#08c4822e5fb5a30e527c0d3cccfe7b8718ec3e87" - integrity sha512-Bw/2pTM8qMD/N3lfAiUNBP+QrVqQnWmb2fY5DoLlPbaDbRG8xdfgjCqHZbI5iCO9cljzq/sPml8AHac9D+Kngw== +"@fishjam-cloud/react-native-client@0.30.0-rc.1": + version "0.30.0-rc.1" + resolved "https://registry.yarnpkg.com/@fishjam-cloud/react-native-client/-/react-native-client-0.30.0-rc.1.tgz#ea7074507e75b1cd0d4ae838191c89f2d5b7b3f3" + integrity sha512-F73gd/yGwPrunY7HKUnv06SwHPaXUCNVlb5Czr8Cp9cevdtNNRCf+FQQ6DvaeJj987l8fXmulWgZf6Wez2GXIA== dependencies: - "@fishjam-cloud/react-client" "0.30.0-rc.0" + "@fishjam-cloud/react-client" "0.30.0-rc.1" "@fishjam-cloud/react-native-webrtc" "0.30.0-rc.0" fast-text-encoding "1.0.6" react-native-get-random-values "1.11.0" @@ -1272,10 +1272,10 @@ base64-js "1.5.1" debug "4.3.4" -"@fishjam-cloud/ts-client@0.30.0-rc.0": - version "0.30.0-rc.0" - resolved "https://registry.yarnpkg.com/@fishjam-cloud/ts-client/-/ts-client-0.30.0-rc.0.tgz#8855aa3bcc68cf568368f8baa6be77f0af40c55c" - integrity sha512-PppKJ7SUv7+AG5Mo6o1xq8FtFYBWhFoNkSxDERrfb7ZWN6hYHBk7ErOTS7NHz2+dy487fphllniDCJ1nG+2Pdg== +"@fishjam-cloud/ts-client@0.30.0-rc.1": + version "0.30.0-rc.1" + resolved "https://registry.yarnpkg.com/@fishjam-cloud/ts-client/-/ts-client-0.30.0-rc.1.tgz#35995832397fcdac54e405ee1551e042735f66db" + integrity sha512-haSP4YJ+VnenyGw1Lz+POOWoYy5AIoEINXTl+KI6y6pC3CI/jbZqBEGFv8aqKkGpKe/dEQ8RyL8loAn53Hy9dw== dependencies: "@binbat/whip-whep" "^1.1.1-sdp-trickle-throw" "@bufbuild/protobuf" "^2.2.3" From 2277751f0521f55677d9a6f4e43118d8c317f873 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Gadomski?= Date: Thu, 6 Aug 2026 14:27:08 +0200 Subject: [PATCH 6/7] Update unrelated readmes --- mobile-react-native/blur-example/README.md | 12 ++++----- mobile-react-native/fishjam-chat/README.md | 26 ++++--------------- .../minimal-react-native/README.md | 12 ++++----- mobile-react-native/text-chat/README.md | 25 ++++-------------- mobile-react-native/video-player/README.md | 12 ++++----- 5 files changed, 25 insertions(+), 62 deletions(-) diff --git a/mobile-react-native/blur-example/README.md b/mobile-react-native/blur-example/README.md index 7ffb212..afe6836 100644 --- a/mobile-react-native/blur-example/README.md +++ b/mobile-react-native/blur-example/README.md @@ -21,16 +21,15 @@ A mobile video chat demo showcasing **real-time camera background blur** using t 1. **Clone the repository:** ```sh - git clone https://github.com/fishjam-cloud/web-client-sdk.git - cd web-client-sdk + git clone https://github.com/fishjam-cloud/examples.git + cd examples/mobile-react-native/blur-example ``` -2. **Install dependencies and build project:** +2. **Install dependencies:** ```sh yarn - yarn build ``` 3. **Set up environment variables:** - - Create a `.env` file in the `examples/mobile-client/blur-example` directory: + - Create a `.env` file in this directory: ```sh cp .env.example .env ``` @@ -41,7 +40,6 @@ A mobile video chat demo showcasing **real-time camera background blur** using t 4. **Prebuild native files:** ```sh - cd examples/mobile-client/blur-example npx expo prebuild --clean ``` > [!NOTE] @@ -84,7 +82,7 @@ A mobile video chat demo showcasing **real-time camera background blur** using t ## License -This example is provided under the Apache License 2.0. See [LICENSE](../../../LICENSE) for details. +This example is provided under the Apache License 2.0. --- diff --git a/mobile-react-native/fishjam-chat/README.md b/mobile-react-native/fishjam-chat/README.md index 2a0ffbf..ae4de5f 100644 --- a/mobile-react-native/fishjam-chat/README.md +++ b/mobile-react-native/fishjam-chat/README.md @@ -2,7 +2,7 @@ ## Prerequisites -Copy `.env.example` to `.env` in the `examples/mobile-client/fishjam-chat` directory and fill in the required value: +Copy `.env.example` to `.env` in this directory and fill in the required value: - `EXPO_PUBLIC_FISHJAM_ID` - Fishjam ID for production environment @@ -25,15 +25,14 @@ The app has 2 tabs showing different ways to connect to Fishjam video calls: 1. Clone the repository: ``` -git clone https://github.com/fishjam-cloud/web-client-sdk.git -cd web-client-sdk +git clone https://github.com/fishjam-cloud/examples.git +cd examples/mobile-react-native/fishjam-chat ``` -2. Install dependencies and build project: +2. Install dependencies: ```sh yarn -yarn build ``` > [!IMPORTANT] @@ -48,10 +47,9 @@ yarn build > - ScreenBroadcastExtension: `com.yourcompany.yourapp.ScreenBroadcastExtension` > - App group: `group.com.yourcompany.yourapp` -3. Prebuild native files in example directory: +3. Prebuild native files: ```sh -cd examples/mobile-client/fishjam-chat npx expo prebuild --clean ``` @@ -64,17 +62,3 @@ npx expo prebuild --clean yarn ios yarn android ``` - -## Development - -1. Whenever you make changes in the `packages` directory, make sure to build the app in the root directory (not in `examples/mobile-client/fishjam-chat`). This ensures that all related workspaces are also built: - -```sh -yarn build -``` - -2. Linter (run in the root directory): - -```sh -yarn lint -``` diff --git a/mobile-react-native/minimal-react-native/README.md b/mobile-react-native/minimal-react-native/README.md index 2373cdc..513c188 100644 --- a/mobile-react-native/minimal-react-native/README.md +++ b/mobile-react-native/minimal-react-native/README.md @@ -20,23 +20,21 @@ A fully functional video room demo built with [Fishjam Cloud](https://fishjam.io 1. **Clone the repository:** ```sh - git clone https://github.com/fishjam-cloud/web-client-sdk.git - cd web-client-sdk + git clone https://github.com/fishjam-cloud/examples.git + cd examples/mobile-react-native/minimal-react-native ``` -2. **Install dependencies and build project:** +2. **Install dependencies:** ```sh yarn - yarn build ``` 3. **Set up environment variables:** - - Create a `.env` file in the `examples/mobile-client/minimal-react-native` directory: + - Create a `.env` file in this directory: ```sh cp .env.example .env ``` - Fill in your Fishjam ID. _You can obtain it at [https://fishjam.io/app/](https://fishjam.io/app/)._ 4. **Prebuild native files:** ```sh - cd examples/mobile-client/minimal-react-native npx expo prebuild --clean ``` > [!NOTE] @@ -77,7 +75,7 @@ A fully functional video room demo built with [Fishjam Cloud](https://fishjam.io ## License -This example is provided under the Apache License 2.0. See [LICENSE](../../../LICENSE) for details. +This example is provided under the Apache License 2.0. --- diff --git a/mobile-react-native/text-chat/README.md b/mobile-react-native/text-chat/README.md index 7460386..8e6efba 100644 --- a/mobile-react-native/text-chat/README.md +++ b/mobile-react-native/text-chat/README.md @@ -22,20 +22,19 @@ A React Native mobile app demonstrating real-time text messaging using [Fishjam 1. **Clone the repository:** ```sh - git clone https://github.com/fishjam-cloud/web-client-sdk.git - cd web-client-sdk + git clone https://github.com/fishjam-cloud/examples.git + cd examples/mobile-react-native/text-chat ``` -2. **Install dependencies and build project:** +2. **Install dependencies:** ```sh yarn - yarn build ``` 3. **Set up environment variables:** - - Create a `.env` file in the `examples/mobile-client/text-chat` directory: + - Create a `.env` file in this directory: ```sh cp .env.example .env ``` @@ -43,7 +42,6 @@ A React Native mobile app demonstrating real-time text messaging using [Fishjam 4. **Prebuild native files:** ```sh - cd examples/mobile-client/text-chat npx expo prebuild --clean ``` > [!NOTE] @@ -106,22 +104,9 @@ This example demonstrates how to use Fishjam Cloud's data channel functionality - Check that both peers support data channels (most modern devices do) - Review error messages in the app's status display -## Development - -1. Whenever you make changes in the `packages` directory, make sure to build the app in the root directory (not in `examples/mobile-client/text-chat`). This ensures that all related workspaces are also built: - - ```sh - yarn build - ``` - -2. Linter (run in the root directory): - ```sh - yarn lint - ``` - ## License -This example is provided under the Apache License 2.0. See [LICENSE](../../../LICENSE) for details. +This example is provided under the Apache License 2.0. --- diff --git a/mobile-react-native/video-player/README.md b/mobile-react-native/video-player/README.md index df016f1..821d9a7 100644 --- a/mobile-react-native/video-player/README.md +++ b/mobile-react-native/video-player/README.md @@ -9,28 +9,26 @@ This example provides a minimal, working livestreaming app using Fishjam. 1. Clone the repository: ```bash - git clone https://github.com/fishjam-cloud/web-client-sdk.git - cd web-client-sdk + git clone https://github.com/fishjam-cloud/examples.git + cd examples/mobile-react-native/video-player ``` -2. Install dependencies and build project: +2. Install dependencies: ```bash yarn - yarn build ``` -3. Prebuild native files in example directory: +3. Prebuild native files: ```bash - cd examples/mobile-client/video-player npx expo prebuild --clean ``` > [!NOTE] > Be sure to run `npx expo prebuild` and not `yarn prebuild` as there's an issue with path generation for the `ios/.xcode.env.local` file -4. **Create a `.env` file** in the `examples/mobile-client/video-player` directory. +4. **Create a `.env` file** in this directory. Add your fishjam ID: From 4a4788cfb22191d39db2660d5dc8dc1b969bd7a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Gadomski?= Date: Thu, 6 Aug 2026 14:34:55 +0200 Subject: [PATCH 7/7] Fix readme still --- mobile-react-native/voip-call/server/README.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/mobile-react-native/voip-call/server/README.md b/mobile-react-native/voip-call/server/README.md index 303f7d5..7a5ac5d 100644 --- a/mobile-react-native/voip-call/server/README.md +++ b/mobile-react-native/voip-call/server/README.md @@ -9,9 +9,8 @@ deno task start # listens on :4400 ## Credentials Both services are optional — configure APNs to call iOS devices, FCM to call -Android devices, or both to call between them. On startup the server prints which -services are enabled, and `/call` answers `503` when the callee's platform has no -credentials. +Android devices, or both to call between them. `/call` answers `502` when the +callee's platform has no credentials. ## APNs certificate @@ -21,7 +20,7 @@ Apple Developer account. See Apple's guide: Drop the VoIP push certificate **and its private key, combined into one PEM**, at `./apns.pem` — it's presented to APNs as a TLS client certificate. The bundle id and -sandbox host are set at the top of `main.ts`. +sandbox host are constants in `main.ts`. ```bash # combine an exported cert + key into one PEM