From d817549f256783853d3ceb48c7ba73330e93ba70 Mon Sep 17 00:00:00 2001 From: sebsteinig Date: Tue, 6 Aug 2024 17:00:02 +0100 Subject: [PATCH 01/39] first r3f map version --- air-quality-ui/package-lock.json | 9707 ++++++++++++++++- air-quality-ui/package.json | 6 +- .../public/Maximum_Voltage_Regular.json | 1 + .../public/NaturalEarthCoastline2.jpg | Bin 0 -> 155744 bytes air-quality-ui/public/all_colormaps.png | Bin 0 -> 1436 bytes .../components/globe/SurfaceLayer.static.tsx | 144 + .../src/components/globe/SurfaceLayer.tsx | 196 + .../src/components/globe/TextureProcessor.tsx | 69 + air-quality-ui/src/components/globe/World.tsx | 30 + .../components/globe/shaders/surfaceFrag.glsl | 130 + .../components/globe/shaders/surfaceVert.glsl | 89 + .../components/summary-view/GlobalSummary.tsx | 2 + air-quality-ui/vite.config.ts | 3 +- 13 files changed, 10145 insertions(+), 232 deletions(-) create mode 100644 air-quality-ui/public/Maximum_Voltage_Regular.json create mode 100644 air-quality-ui/public/NaturalEarthCoastline2.jpg create mode 100644 air-quality-ui/public/all_colormaps.png create mode 100644 air-quality-ui/src/components/globe/SurfaceLayer.static.tsx create mode 100644 air-quality-ui/src/components/globe/SurfaceLayer.tsx create mode 100644 air-quality-ui/src/components/globe/TextureProcessor.tsx create mode 100644 air-quality-ui/src/components/globe/World.tsx create mode 100644 air-quality-ui/src/components/globe/shaders/surfaceFrag.glsl create mode 100644 air-quality-ui/src/components/globe/shaders/surfaceVert.glsl diff --git a/air-quality-ui/package-lock.json b/air-quality-ui/package-lock.json index c56bf4d6..efa21604 100644 --- a/air-quality-ui/package-lock.json +++ b/air-quality-ui/package-lock.json @@ -1,7 +1,7 @@ { "name": "air-quality-ui", "version": "0.0.0", - "lockfileVersion": 3, + "lockfileVersion": 2, "requires": true, "packages": { "": { @@ -11,6 +11,8 @@ "@emotion/react": "^11.13.0", "@emotion/styled": "^11.13.0", "@mui/x-date-pickers": "^7.12.0", + "@react-three/drei": "^9.109.2", + "@react-three/fiber": "^8.16.8", "@tanstack/react-query": "^5.40.1", "@types/echarts": "^4.9.22", "ag-grid-react": "^31.3.2", @@ -24,7 +26,9 @@ "react": "^18.2.0", "react-dom": "^18.2.0", "react-router-dom": "^6.23.1", - "react-select": "^5.8.0" + "react-select": "^5.8.0", + "three": "^0.167.1", + "vite-plugin-glsl": "^1.3.0" }, "devDependencies": { "@playwright/test": "^1.45.0", @@ -726,7 +730,6 @@ "cpu": [ "ppc64" ], - "dev": true, "optional": true, "os": [ "aix" @@ -742,7 +745,6 @@ "cpu": [ "arm" ], - "dev": true, "optional": true, "os": [ "android" @@ -758,7 +760,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "android" @@ -774,7 +775,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "android" @@ -790,7 +790,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "darwin" @@ -806,7 +805,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "darwin" @@ -822,7 +820,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "freebsd" @@ -838,7 +835,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "freebsd" @@ -854,7 +850,6 @@ "cpu": [ "arm" ], - "dev": true, "optional": true, "os": [ "linux" @@ -870,7 +865,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -886,7 +880,6 @@ "cpu": [ "ia32" ], - "dev": true, "optional": true, "os": [ "linux" @@ -902,7 +895,6 @@ "cpu": [ "loong64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -918,7 +910,6 @@ "cpu": [ "mips64el" ], - "dev": true, "optional": true, "os": [ "linux" @@ -934,7 +925,6 @@ "cpu": [ "ppc64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -950,7 +940,6 @@ "cpu": [ "riscv64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -966,7 +955,6 @@ "cpu": [ "s390x" ], - "dev": true, "optional": true, "os": [ "linux" @@ -982,7 +970,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -998,7 +985,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "netbsd" @@ -1014,7 +1000,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "openbsd" @@ -1030,7 +1015,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "sunos" @@ -1046,7 +1030,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "win32" @@ -1062,7 +1045,6 @@ "cpu": [ "ia32" ], - "dev": true, "optional": true, "os": [ "win32" @@ -1078,7 +1060,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "win32" @@ -1193,26 +1174,26 @@ } }, "node_modules/@floating-ui/core": { - "version": "1.6.5", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.5.tgz", - "integrity": "sha512-8GrTWmoFhm5BsMZOTHeGD2/0FLKLQQHvO/ZmQga4tKempYRLz8aqJGqXVuQgisnMObq2YZ2SgkwctN1LOOxcqA==", + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.6.tgz", + "integrity": "sha512-Vkvsw6EcpMHjvZZdMkSY+djMGFbt7CRssW99Ne8tar2WLnZ/l3dbxeTShbLQj+/s35h+Qb4cmnob+EzwtjrXGQ==", "dependencies": { - "@floating-ui/utils": "^0.2.5" + "@floating-ui/utils": "^0.2.6" } }, "node_modules/@floating-ui/dom": { - "version": "1.6.8", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.8.tgz", - "integrity": "sha512-kx62rP19VZ767Q653wsP1XZCGIirkE09E0QUGNYTM/ttbbQHqcGPdSfWFxUyyNLc/W6aoJRBajOSXhP6GXjC0Q==", + "version": "1.6.9", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.9.tgz", + "integrity": "sha512-zB1PcI350t4tkm3rvUhSRKa9sT7vH5CrAbQxW+VaPYJXKAO0gsg4CTueL+6Ajp7XzAQC8CW4Jj1Wgqc0sB6oUQ==", "dependencies": { "@floating-ui/core": "^1.6.0", - "@floating-ui/utils": "^0.2.5" + "@floating-ui/utils": "^0.2.6" } }, "node_modules/@floating-ui/utils": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.5.tgz", - "integrity": "sha512-sTcG+QZ6fdEUObICavU+aB3Mp8HY4n14wYHdxK4fXjPmv3PXZZeY5RaguJmGyeH/CJQhX3fqKUtS4qc1LoHwhQ==" + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.6.tgz", + "integrity": "sha512-0KI3zGxIUs1KDR/pjQPdJH4Z8nGBm0yJ5WRoRfdw1Kzeh45jkIfA0rmD0kBF6fKHH+xaH7g8y4jIXyAV5MGK3g==" }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.14", @@ -2155,6 +2136,22 @@ "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-2.0.3.tgz", "integrity": "sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==" }, + "node_modules/@mediapipe/tasks-vision": { + "version": "0.10.8", + "resolved": "https://registry.npmjs.org/@mediapipe/tasks-vision/-/tasks-vision-0.10.8.tgz", + "integrity": "sha512-Rp7ll8BHrKB3wXaRFKhrltwZl1CiXGdibPxuWXvqGnKTnv8fqa/nvftYNuSbf+pbJWKYCXdBtYTITdAUTGGh0Q==" + }, + "node_modules/@monogrid/gainmap-js": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@monogrid/gainmap-js/-/gainmap-js-3.0.5.tgz", + "integrity": "sha512-53sCTG4FaJBaAq/tcufARtVYDMDGqyBT9i7F453pWGhZ5LqubDHDWtYoHo9VhQqMcHTEexdJqSsR58y+9HVmQA==", + "dependencies": { + "promise-worker-transferable": "^1.0.4" + }, + "peerDependencies": { + "three": ">= 0.159.0" + } + }, "node_modules/@mui/core-downloads-tracker": { "version": "5.16.6", "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.16.6.tgz", @@ -2460,12 +2457,12 @@ } }, "node_modules/@playwright/test": { - "version": "1.45.3", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.45.3.tgz", - "integrity": "sha512-UKF4XsBfy+u3MFWEH44hva1Q8Da28G6RFtR2+5saw+jgAFQV5yYnB1fu68Mz7fO+5GJF3wgwAIs0UelU8TxFrA==", + "version": "1.46.0", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.46.0.tgz", + "integrity": "sha512-/QYft5VArOrGRP5pgkrfKksqsKA6CEFyGQ/gjNe6q0y4tZ1aaPfq4gIjudr1s3D+pXyrPRdsy4opKDrjBabE5w==", "dev": true, "dependencies": { - "playwright": "1.45.3" + "playwright": "1.46.0" }, "bin": { "playwright": "cli.js" @@ -2484,6 +2481,163 @@ "url": "https://opencollective.com/popperjs" } }, + "node_modules/@react-spring/animated": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@react-spring/animated/-/animated-9.6.1.tgz", + "integrity": "sha512-ls/rJBrAqiAYozjLo5EPPLLOb1LM0lNVQcXODTC1SMtS6DbuBCPaKco5svFUQFMP2dso3O+qcC4k9FsKc0KxMQ==", + "dependencies": { + "@react-spring/shared": "~9.6.1", + "@react-spring/types": "~9.6.1" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@react-spring/core": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@react-spring/core/-/core-9.6.1.tgz", + "integrity": "sha512-3HAAinAyCPessyQNNXe5W0OHzRfa8Yo5P748paPcmMowZ/4sMfaZ2ZB6e5x5khQI8NusOHj8nquoutd6FRY5WQ==", + "dependencies": { + "@react-spring/animated": "~9.6.1", + "@react-spring/rafz": "~9.6.1", + "@react-spring/shared": "~9.6.1", + "@react-spring/types": "~9.6.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/react-spring/donate" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@react-spring/rafz": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@react-spring/rafz/-/rafz-9.6.1.tgz", + "integrity": "sha512-v6qbgNRpztJFFfSE3e2W1Uz+g8KnIBs6SmzCzcVVF61GdGfGOuBrbjIcp+nUz301awVmREKi4eMQb2Ab2gGgyQ==" + }, + "node_modules/@react-spring/shared": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@react-spring/shared/-/shared-9.6.1.tgz", + "integrity": "sha512-PBFBXabxFEuF8enNLkVqMC9h5uLRBo6GQhRMQT/nRTnemVENimgRd+0ZT4yFnAQ0AxWNiJfX3qux+bW2LbG6Bw==", + "dependencies": { + "@react-spring/rafz": "~9.6.1", + "@react-spring/types": "~9.6.1" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@react-spring/three": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@react-spring/three/-/three-9.6.1.tgz", + "integrity": "sha512-Tyw2YhZPKJAX3t2FcqvpLRb71CyTe1GvT3V+i+xJzfALgpk10uPGdGaQQ5Xrzmok1340DAeg2pR/MCfaW7b8AA==", + "dependencies": { + "@react-spring/animated": "~9.6.1", + "@react-spring/core": "~9.6.1", + "@react-spring/shared": "~9.6.1", + "@react-spring/types": "~9.6.1" + }, + "peerDependencies": { + "@react-three/fiber": ">=6.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "three": ">=0.126" + } + }, + "node_modules/@react-spring/types": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@react-spring/types/-/types-9.6.1.tgz", + "integrity": "sha512-POu8Mk0hIU3lRXB3bGIGe4VHIwwDsQyoD1F394OK7STTiX9w4dG3cTLljjYswkQN+hDSHRrj4O36kuVa7KPU8Q==" + }, + "node_modules/@react-three/drei": { + "version": "9.109.2", + "resolved": "https://registry.npmjs.org/@react-three/drei/-/drei-9.109.2.tgz", + "integrity": "sha512-oUbfjiyPQeQch4Mi3jZvFKigMlc97/xvazxyjPBCGa8RP8cHZJl187eZI9Ha1WwkVaX80DfgN7bYAWXS4ywxmw==", + "dependencies": { + "@babel/runtime": "^7.11.2", + "@mediapipe/tasks-vision": "0.10.8", + "@monogrid/gainmap-js": "^3.0.5", + "@react-spring/three": "~9.6.1", + "@use-gesture/react": "^10.2.24", + "camera-controls": "^2.4.2", + "cross-env": "^7.0.3", + "detect-gpu": "^5.0.28", + "glsl-noise": "^0.0.0", + "hls.js": "1.3.5", + "maath": "^0.10.7", + "meshline": "^3.1.6", + "react-composer": "^5.0.3", + "stats-gl": "^2.0.0", + "stats.js": "^0.17.0", + "suspend-react": "^0.1.3", + "three-mesh-bvh": "^0.7.0", + "three-stdlib": "^2.29.9", + "troika-three-text": "^0.49.0", + "tunnel-rat": "^0.1.2", + "utility-types": "^3.10.0", + "uuid": "^9.0.1", + "zustand": "^3.7.1" + }, + "peerDependencies": { + "@react-three/fiber": ">=8.0", + "react": ">=18.0", + "react-dom": ">=18.0", + "three": ">=0.137" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/@react-three/fiber": { + "version": "8.16.8", + "resolved": "https://registry.npmjs.org/@react-three/fiber/-/fiber-8.16.8.tgz", + "integrity": "sha512-Lc8fjATtvQEfSd8d5iKdbpHtRm/aPMeFj7jQvp6TNHfpo8IQTW3wwcE1ZMrGGoUH+w2mnyS+0MK1NLPLnuzGkQ==", + "dependencies": { + "@babel/runtime": "^7.17.8", + "@types/react-reconciler": "^0.26.7", + "@types/webxr": "*", + "base64-js": "^1.5.1", + "buffer": "^6.0.3", + "its-fine": "^1.0.6", + "react-reconciler": "^0.27.0", + "react-use-measure": "^2.1.1", + "scheduler": "^0.21.0", + "suspend-react": "^0.1.3", + "zustand": "^3.7.1" + }, + "peerDependencies": { + "expo": ">=43.0", + "expo-asset": ">=8.4", + "expo-file-system": ">=11.0", + "expo-gl": ">=11.0", + "react": ">=18.0", + "react-dom": ">=18.0", + "react-native": ">=0.64", + "three": ">=0.133" + }, + "peerDependenciesMeta": { + "expo": { + "optional": true + }, + "expo-asset": { + "optional": true + }, + "expo-file-system": { + "optional": true + }, + "expo-gl": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, "node_modules/@remix-run/router": { "version": "1.19.0", "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.19.0.tgz", @@ -2492,209 +2646,214 @@ "node": ">=14.0.0" } }, + "node_modules/@rollup/pluginutils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", + "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.19.2.tgz", - "integrity": "sha512-OHflWINKtoCFSpm/WmuQaWW4jeX+3Qt3XQDepkkiFTsoxFc5BpF3Z5aDxFZgBqRjO6ATP5+b1iilp4kGIZVWlA==", + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.20.0.tgz", + "integrity": "sha512-TSpWzflCc4VGAUJZlPpgAJE1+V60MePDQnBd7PPkpuEmOy8i87aL6tinFGKBFKuEDikYpig72QzdT3QPYIi+oA==", "cpu": [ "arm" ], - "dev": true, "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.19.2.tgz", - "integrity": "sha512-k0OC/b14rNzMLDOE6QMBCjDRm3fQOHAL8Ldc9bxEWvMo4Ty9RY6rWmGetNTWhPo+/+FNd1lsQYRd0/1OSix36A==", + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.20.0.tgz", + "integrity": "sha512-u00Ro/nok7oGzVuh/FMYfNoGqxU5CPWz1mxV85S2w9LxHR8OoMQBuSk+3BKVIDYgkpeOET5yXkx90OYFc+ytpQ==", "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.19.2.tgz", - "integrity": "sha512-IIARRgWCNWMTeQH+kr/gFTHJccKzwEaI0YSvtqkEBPj7AshElFq89TyreKNFAGh5frLfDCbodnq+Ye3dqGKPBw==", + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.20.0.tgz", + "integrity": "sha512-uFVfvzvsdGtlSLuL0ZlvPJvl6ZmrH4CBwLGEFPe7hUmf7htGAN+aXo43R/V6LATyxlKVC/m6UsLb7jbG+LG39Q==", "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.19.2.tgz", - "integrity": "sha512-52udDMFDv54BTAdnw+KXNF45QCvcJOcYGl3vQkp4vARyrcdI/cXH8VXTEv/8QWfd6Fru8QQuw1b2uNersXOL0g==", + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.20.0.tgz", + "integrity": "sha512-xbrMDdlev53vNXexEa6l0LffojxhqDTBeL+VUxuuIXys4x6xyvbKq5XqTXBCEUA8ty8iEJblHvFaWRJTk/icAQ==", "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.19.2.tgz", - "integrity": "sha512-r+SI2t8srMPYZeoa1w0o/AfoVt9akI1ihgazGYPQGRilVAkuzMGiTtexNZkrPkQsyFrvqq/ni8f3zOnHw4hUbA==", + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.20.0.tgz", + "integrity": "sha512-jMYvxZwGmoHFBTbr12Xc6wOdc2xA5tF5F2q6t7Rcfab68TT0n+r7dgawD4qhPEvasDsVpQi+MgDzj2faOLsZjA==", "cpu": [ "arm" ], - "dev": true, "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.19.2.tgz", - "integrity": "sha512-+tYiL4QVjtI3KliKBGtUU7yhw0GMcJJuB9mLTCEauHEsqfk49gtUBXGtGP3h1LW8MbaTY6rSFIQV1XOBps1gBA==", + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.20.0.tgz", + "integrity": "sha512-1asSTl4HKuIHIB1GcdFHNNZhxAYEdqML/MW4QmPS4G0ivbEcBr1JKlFLKsIRqjSwOBkdItn3/ZDlyvZ/N6KPlw==", "cpu": [ "arm" ], - "dev": true, "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.19.2.tgz", - "integrity": "sha512-OR5DcvZiYN75mXDNQQxlQPTv4D+uNCUsmSCSY2FolLf9W5I4DSoJyg7z9Ea3TjKfhPSGgMJiey1aWvlWuBzMtg==", + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.20.0.tgz", + "integrity": "sha512-COBb8Bkx56KldOYJfMf6wKeYJrtJ9vEgBRAOkfw6Ens0tnmzPqvlpjZiLgkhg6cA3DGzCmLmmd319pmHvKWWlQ==", "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.19.2.tgz", - "integrity": "sha512-Hw3jSfWdUSauEYFBSFIte6I8m6jOj+3vifLg8EU3lreWulAUpch4JBjDMtlKosrBzkr0kwKgL9iCfjA8L3geoA==", + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.20.0.tgz", + "integrity": "sha512-+it+mBSyMslVQa8wSPvBx53fYuZK/oLTu5RJoXogjk6x7Q7sz1GNRsXWjn6SwyJm8E/oMjNVwPhmNdIjwP135Q==", "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.19.2.tgz", - "integrity": "sha512-rhjvoPBhBwVnJRq/+hi2Q3EMiVF538/o9dBuj9TVLclo9DuONqt5xfWSaE6MYiFKpo/lFPJ/iSI72rYWw5Hc7w==", + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.20.0.tgz", + "integrity": "sha512-yAMvqhPfGKsAxHN8I4+jE0CpLWD8cv4z7CK7BMmhjDuz606Q2tFKkWRY8bHR9JQXYcoLfopo5TTqzxgPUjUMfw==", "cpu": [ "ppc64" ], - "dev": true, "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.19.2.tgz", - "integrity": "sha512-EAz6vjPwHHs2qOCnpQkw4xs14XJq84I81sDRGPEjKPFVPBw7fwvtwhVjcZR6SLydCv8zNK8YGFblKWd/vRmP8g==", + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.20.0.tgz", + "integrity": "sha512-qmuxFpfmi/2SUkAw95TtNq/w/I7Gpjurx609OOOV7U4vhvUhBcftcmXwl3rqAek+ADBwSjIC4IVNLiszoj3dPA==", "cpu": [ "riscv64" ], - "dev": true, "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.19.2.tgz", - "integrity": "sha512-IJSUX1xb8k/zN9j2I7B5Re6B0NNJDJ1+soezjNojhT8DEVeDNptq2jgycCOpRhyGj0+xBn7Cq+PK7Q+nd2hxLA==", + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.20.0.tgz", + "integrity": "sha512-I0BtGXddHSHjV1mqTNkgUZLnS3WtsqebAXv11D5BZE/gfw5KoyXSAXVqyJximQXNvNzUo4GKlCK/dIwXlz+jlg==", "cpu": [ "s390x" ], - "dev": true, "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.19.2.tgz", - "integrity": "sha512-OgaToJ8jSxTpgGkZSkwKE+JQGihdcaqnyHEFOSAU45utQ+yLruE1dkonB2SDI8t375wOKgNn8pQvaWY9kPzxDQ==", + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.20.0.tgz", + "integrity": "sha512-y+eoL2I3iphUg9tN9GB6ku1FA8kOfmF4oUEWhztDJ4KXJy1agk/9+pejOuZkNFhRwHAOxMsBPLbXPd6mJiCwew==", "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.19.2.tgz", - "integrity": "sha512-5V3mPpWkB066XZZBgSd1lwozBk7tmOkKtquyCJ6T4LN3mzKENXyBwWNQn8d0Ci81hvlBw5RoFgleVpL6aScLYg==", + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.20.0.tgz", + "integrity": "sha512-hM3nhW40kBNYUkZb/r9k2FKK+/MnKglX7UYd4ZUy5DJs8/sMsIbqWK2piZtVGE3kcXVNj3B2IrUYROJMMCikNg==", "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.19.2.tgz", - "integrity": "sha512-ayVstadfLeeXI9zUPiKRVT8qF55hm7hKa+0N1V6Vj+OTNFfKSoUxyZvzVvgtBxqSb5URQ8sK6fhwxr9/MLmxdA==", + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.20.0.tgz", + "integrity": "sha512-psegMvP+Ik/Bg7QRJbv8w8PAytPA7Uo8fpFjXyCRHWm6Nt42L+JtoqH8eDQ5hRP7/XW2UiIriy1Z46jf0Oa1kA==", "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.19.2.tgz", - "integrity": "sha512-Mda7iG4fOLHNsPqjWSjANvNZYoW034yxgrndof0DwCy0D3FvTjeNo+HGE6oGWgvcLZNLlcp0hLEFcRs+UGsMLg==", + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.20.0.tgz", + "integrity": "sha512-GabekH3w4lgAJpVxkk7hUzUf2hICSQO0a/BLFA11/RMxQT92MabKAqyubzDZmMOC/hcJNlc+rrypzNzYl4Dx7A==", "cpu": [ "ia32" ], - "dev": true, "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.19.2.tgz", - "integrity": "sha512-DPi0ubYhSow/00YqmG1jWm3qt1F8aXziHc/UNy8bo9cpCacqhuWu+iSq/fp2SyEQK7iYTZ60fBU9cat3MXTjIQ==", + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.20.0.tgz", + "integrity": "sha512-aJ1EJSuTdGnM6qbVC4B5DSmozPTqIag9fSzXRNNo+humQLG89XpPgdt16Ia56ORD7s+H8Pmyx44uczDQ0yDzpg==", "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "win32" @@ -2724,20 +2883,20 @@ } }, "node_modules/@tanstack/query-core": { - "version": "5.51.17", - "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.51.17.tgz", - "integrity": "sha512-AtVNOgVrZNz4C7RzMfx7sCn1/gf0Ype4nX8UP2BOh0C2tTMszwXk98iCLRacTn5vTRNJCZxz3fgEcTJq0uv8GQ==", + "version": "5.51.21", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.51.21.tgz", + "integrity": "sha512-POQxm42IUp6n89kKWF4IZi18v3fxQWFRolvBA6phNVmA8psdfB1MvDnGacCJdS+EOX12w/CyHM62z//rHmYmvw==", "funding": { "type": "github", "url": "https://github.com/sponsors/tannerlinsley" } }, "node_modules/@tanstack/react-query": { - "version": "5.51.18", - "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.51.18.tgz", - "integrity": "sha512-l/PF3X6Coi53kEDpL2XEU0x+y3szOk/oKWSHMlyy8tyUHviaIg8tJ6O4Cc1AjLAhbyTG1a+bZobdSuLXzYTt/w==", + "version": "5.51.21", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.51.21.tgz", + "integrity": "sha512-Q/V81x3sAYgCsxjwOkfLXfrmoG+FmDhLeHH5okC/Bp8Aaw2c33lbEo/mMcMnkxUPVtB2FLpzHT0tq3c+OlZEbw==", "dependencies": { - "@tanstack/query-core": "5.51.17" + "@tanstack/query-core": "5.51.21" }, "funding": { "type": "github", @@ -2987,6 +3146,11 @@ "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", "dev": true }, + "node_modules/@tweenjs/tween.js": { + "version": "23.1.3", + "resolved": "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-23.1.3.tgz", + "integrity": "sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA==" + }, "node_modules/@types/aria-query": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", @@ -3034,6 +3198,11 @@ "@babel/types": "^7.20.7" } }, + "node_modules/@types/draco3d": { + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/@types/draco3d/-/draco3d-1.4.10.tgz", + "integrity": "sha512-AX22jp8Y7wwaBgAixaSvkoG4M/+PlAcm3Qs4OW8yT9DM4xUpWKeFhLueTAyZF39pviAdcDdeJoACapiAceqNcw==" + }, "node_modules/@types/echarts": { "version": "4.9.22", "resolved": "https://registry.npmjs.org/@types/echarts/-/echarts-4.9.22.tgz", @@ -3045,8 +3214,7 @@ "node_modules/@types/estree": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" }, "node_modules/@types/geojson": { "version": "7946.0.14", @@ -3138,6 +3306,12 @@ "parse5": "^7.0.0" } }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, "node_modules/@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", @@ -3173,6 +3347,11 @@ "undici-types": "~5.26.4" } }, + "node_modules/@types/offscreencanvas": { + "version": "2019.7.3", + "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.7.3.tgz", + "integrity": "sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==" + }, "node_modules/@types/parse-json": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", @@ -3206,6 +3385,14 @@ "@types/react": "*" } }, + "node_modules/@types/react-reconciler": { + "version": "0.26.7", + "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.26.7.tgz", + "integrity": "sha512-mBDYl8x+oyPX/VBb3E638N0B7xG+SPk/EAMcVPeexqus/5aTpTphQi0curhhshOqRrc9t6OPoJfEUkbymse/lQ==", + "dependencies": { + "@types/react": "*" + } + }, "node_modules/@types/react-transition-group": { "version": "4.4.10", "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.10.tgz", @@ -3214,12 +3401,23 @@ "@types/react": "*" } }, + "node_modules/@types/semver": { + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", + "dev": true + }, "node_modules/@types/stack-utils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", "dev": true }, + "node_modules/@types/stats.js": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@types/stats.js/-/stats.js-0.17.3.tgz", + "integrity": "sha512-pXNfAD3KHOdif9EQXZ9deK82HVNaXP5ZIF5RP2QG6OQFNTaY2YIetfrE9t528vEreGQvEPRDDc8muaoYeK0SxQ==" + }, "node_modules/@types/supercluster": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/@types/supercluster/-/supercluster-7.1.3.tgz", @@ -3228,12 +3426,30 @@ "@types/geojson": "*" } }, + "node_modules/@types/three": { + "version": "0.167.1", + "resolved": "https://registry.npmjs.org/@types/three/-/three-0.167.1.tgz", + "integrity": "sha512-OCd2Uv/8/4TbmSaIRFawrCOnDMLdpaa+QGJdhlUBmdfbHjLY8k6uFc0tde2/UvcaHQ6NtLl28onj/vJfofV+Tg==", + "peer": true, + "dependencies": { + "@tweenjs/tween.js": "~23.1.2", + "@types/stats.js": "*", + "@types/webxr": "*", + "fflate": "~0.8.2", + "meshoptimizer": "~0.18.1" + } + }, "node_modules/@types/tough-cookie": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", "dev": true }, + "node_modules/@types/webxr": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.19.tgz", + "integrity": "sha512-4hxA+NwohSgImdTSlPXEqDqqFktNgmTXQ05ff1uWam05tNGroCMp4G+4XVl6qWm1p7GQ/9oD41kAYsSssF6Mzw==" + }, "node_modules/@types/yargs": { "version": "17.0.32", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", @@ -3253,23 +3469,25 @@ "integrity": "sha512-1jZ9bJn2BsfmYFPBHtl5o3uV+ILejAtGrDcYSpT4qaVKEI/0YY+arw3XHU04Ebd8Nca3SQ7uNcLaqiL+tTFVMg==" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.18.0.tgz", - "integrity": "sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.2.0.tgz", + "integrity": "sha512-mdekAHOqS9UjlmyF/LSs6AIEvfceV749GFxoBAjwAv0nkevfKHWQFDMcBZWUiIC5ft6ePWivXoS36aKQ0Cy3sw==", "dev": true, "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "7.18.0", - "@typescript-eslint/type-utils": "7.18.0", - "@typescript-eslint/utils": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0", + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "7.2.0", + "@typescript-eslint/type-utils": "7.2.0", + "@typescript-eslint/utils": "7.2.0", + "@typescript-eslint/visitor-keys": "7.2.0", + "debug": "^4.3.4", "graphemer": "^1.4.0", - "ignore": "^5.3.1", + "ignore": "^5.2.4", "natural-compare": "^1.4.0", - "ts-api-utils": "^1.3.0" + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -3286,19 +3504,19 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.18.0.tgz", - "integrity": "sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.2.0.tgz", + "integrity": "sha512-5FKsVcHTk6TafQKQbuIVkXq58Fnbkd2wDL4LB7AURN7RUOu1utVP+G8+6u3ZhEroW3DF6hyo3ZEXxgKgp4KeCg==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "7.18.0", - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/typescript-estree": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0", + "@typescript-eslint/scope-manager": "7.2.0", + "@typescript-eslint/types": "7.2.0", + "@typescript-eslint/typescript-estree": "7.2.0", + "@typescript-eslint/visitor-keys": "7.2.0", "debug": "^4.3.4" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -3314,16 +3532,16 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz", - "integrity": "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.2.0.tgz", + "integrity": "sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0" + "@typescript-eslint/types": "7.2.0", + "@typescript-eslint/visitor-keys": "7.2.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -3331,18 +3549,18 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz", - "integrity": "sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.2.0.tgz", + "integrity": "sha512-xHi51adBHo9O9330J8GQYQwrKBqbIPJGZZVQTHHmy200hvkLZFWJIFtAG/7IYTWUyun6DE6w5InDReePJYJlJA==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "7.18.0", - "@typescript-eslint/utils": "7.18.0", + "@typescript-eslint/typescript-estree": "7.2.0", + "@typescript-eslint/utils": "7.2.0", "debug": "^4.3.4", - "ts-api-utils": "^1.3.0" + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -3358,12 +3576,12 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz", - "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.2.0.tgz", + "integrity": "sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA==", "dev": true, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -3371,22 +3589,22 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz", - "integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.2.0.tgz", + "integrity": "sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0", + "@typescript-eslint/types": "7.2.0", + "@typescript-eslint/visitor-keys": "7.2.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -3399,18 +3617,21 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.18.0.tgz", - "integrity": "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.2.0.tgz", + "integrity": "sha512-YfHpnMAGb1Eekpm3XRK8hcMwGLGsnT6L+7b2XyRv6ouDuJU1tZir1GS2i0+VXRatMwSI1/UfcyPe53ADkU+IuA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "7.18.0", - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/typescript-estree": "7.18.0" + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "7.2.0", + "@typescript-eslint/types": "7.2.0", + "@typescript-eslint/typescript-estree": "7.2.0", + "semver": "^7.5.4" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -3421,16 +3642,16 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz", - "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.2.0.tgz", + "integrity": "sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.18.0", - "eslint-visitor-keys": "^3.4.3" + "@typescript-eslint/types": "7.2.0", + "eslint-visitor-keys": "^3.4.1" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -3443,6 +3664,22 @@ "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", "dev": true }, + "node_modules/@use-gesture/core": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/@use-gesture/core/-/core-10.3.1.tgz", + "integrity": "sha512-WcINiDt8WjqBdUXye25anHiNxPc0VOrlT8F6LLkU6cycrOGUDyY/yyFmsg3k8i5OLvv25llc0QC45GhR/C8llw==" + }, + "node_modules/@use-gesture/react": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/@use-gesture/react/-/react-10.3.1.tgz", + "integrity": "sha512-Yy19y6O2GJq8f7CHf7L0nxL8bf4PZCPaVOCgJrusOeFHY1LvHgYXnmnXg6N5iwAnbgbZCDjo60SiM6IPJi9C5g==", + "dependencies": { + "@use-gesture/core": "10.3.1" + }, + "peerDependencies": { + "react": ">= 16.8.0" + } + }, "node_modules/@vitejs/plugin-react": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.1.tgz", @@ -3999,6 +4236,33 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bidi-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz", + "integrity": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==", + "dependencies": { + "require-from-string": "^2.0.2" + } + }, "node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", @@ -4073,6 +4337,29 @@ "node-int64": "^0.4.0" } }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -4132,10 +4419,18 @@ "node": ">=6" } }, + "node_modules/camera-controls": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/camera-controls/-/camera-controls-2.8.5.tgz", + "integrity": "sha512-7VTwRk7Nu1nRKsY7bEt9HVBfKt8DETvzyYhLN4OW26OByBayMDB5fUaNcPI+z++vG23RH5yqn6ZRhZcgLQy2rA==", + "peerDependencies": { + "three": ">=0.126.1" + } + }, "node_modules/caniuse-lite": { - "version": "1.0.30001646", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001646.tgz", - "integrity": "sha512-dRg00gudiBDDTmUhClSdv3hqRfpbOnU28IpI1T6PBTLWa+kOj0681C8uML3PifYfREuBrVjDGhL3adYpBT6spw==", + "version": "1.0.30001649", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001649.tgz", + "integrity": "sha512-fJegqZZ0ZX8HOWr6rcafGr72+xcgJKI9oWfDW5DrD7ExUtgZC7a7R7ZYmZqplh7XDocFdGeIFn7roAxhOeYrPQ==", "dev": true, "funding": [ { @@ -4388,11 +4683,27 @@ "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", "dev": true }, + "node_modules/cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "bin": { + "cross-env": "src/bin/cross-env.js", + "cross-env-shell": "src/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=10.14", + "npm": ">=6", + "yarn": ">=1" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -4502,6 +4813,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/debounce": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", + "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==" + }, "node_modules/debug": { "version": "4.3.6", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", @@ -4605,6 +4921,14 @@ "node": ">=6" } }, + "node_modules/detect-gpu": { + "version": "5.0.42", + "resolved": "https://registry.npmjs.org/detect-gpu/-/detect-gpu-5.0.42.tgz", + "integrity": "sha512-Vdhe87ZNhxIS+OGesy9DOx8P3YBbCBapoomGR9kH26HuDAZ6c0FohsrK47j9efL972kLCaD22EbNUYHVLkqx/w==", + "dependencies": { + "webgl-constants": "^1.1.1" + } + }, "node_modules/detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", @@ -4684,6 +5008,11 @@ "node": ">=12" } }, + "node_modules/draco3d": { + "version": "1.5.7", + "resolved": "https://registry.npmjs.org/draco3d/-/draco3d-1.5.7.tgz", + "integrity": "sha512-m6WCKt/erDXcw+70IJXnG7M3awwQPAsZvJGX5zY7beBqpELw6RDGkYVU0W43AFxye4pDZ5i2Lbyc/NNGqwjUVQ==" + }, "node_modules/earcut": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/earcut/-/earcut-3.0.0.tgz", @@ -4727,9 +5056,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.4.tgz", - "integrity": "sha512-orzA81VqLyIGUEA77YkVA1D+N+nNfl2isJVjjmOyrlxuooZ19ynb+dOlaDTqd/idKRS9lDCSBmtzM+kyCsMnkA==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.5.tgz", + "integrity": "sha512-QR7/A7ZkMS8tZuoftC/jfqNkZLQO779SSW3YuZHP4eXpj3EffGLFcB/Xu9AAZQzLccTiCV+EmUo3ha4mQ9wnlA==", "dev": true }, "node_modules/emittery": { @@ -4907,7 +5236,6 @@ "version": "0.21.5", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", - "dev": true, "hasInstallScript": true, "bin": { "esbuild": "bin/esbuild" @@ -5449,6 +5777,11 @@ "node": ">=4.0" } }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -5586,6 +5919,11 @@ "bser": "2.1.1" } }, + "node_modules/fflate": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", + "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==" + }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -5705,7 +6043,6 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, "hasInstallScript": true, "optional": true, "os": [ @@ -5965,6 +6302,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/glsl-noise": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/glsl-noise/-/glsl-noise-0.0.0.tgz", + "integrity": "sha512-b/ZCF6amfAUb7dJM/MxRs7AetQEahYzJ8PtgfrmEdtw6uyGOr+ZSGtgjFm6mfsBkxJ4d2W7kg+Nlqzqvn3Bc0w==" + }, "node_modules/gopd": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", @@ -6073,6 +6415,11 @@ "node": ">= 0.4" } }, + "node_modules/hls.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/hls.js/-/hls.js-1.3.5.tgz", + "integrity": "sha512-uybAvKS6uDe0MnWNEPnO0krWVr+8m2R0hJ/viql8H3MVK+itq8gGQuIYoFHL3rECkIpNH98Lw8YuuWMKZxp3Ew==" + }, "node_modules/hoist-non-react-statics": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", @@ -6192,6 +6539,11 @@ "node": ">= 4" } }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" + }, "node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -6525,6 +6877,11 @@ "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", "dev": true }, + "node_modules/is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" + }, "node_modules/is-regex": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", @@ -6740,6 +7097,25 @@ "node": ">=8" } }, + "node_modules/its-fine": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/its-fine/-/its-fine-1.2.5.tgz", + "integrity": "sha512-fXtDA0X0t0eBYAGLVM5YsgJGsJ5jEmqZEPrGbzdf5awjv0xE7nqv3TVnvtUF060Tkes15DbDAKW/I48vsb6SyA==", + "dependencies": { + "@types/react-reconciler": "^0.28.0" + }, + "peerDependencies": { + "react": ">=18.0" + } + }, + "node_modules/its-fine/node_modules/@types/react-reconciler": { + "version": "0.28.8", + "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.28.8.tgz", + "integrity": "sha512-SN9c4kxXZonFhbX4hJrZy37yw9e7EIxcpHCxQv5JUS18wDE5ovkQKlqQEkufdJCCMfuI9BnjUJvhYeJ9x5Ra7g==", + "dependencies": { + "@types/react": "*" + } + }, "node_modules/jake": { "version": "10.9.2", "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", @@ -8809,6 +9185,14 @@ "node": ">= 0.8.0" } }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dependencies": { + "immediate": "~3.0.5" + } + }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -8868,9 +9252,9 @@ } }, "node_modules/luxon": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.4.tgz", - "integrity": "sha512-zobTr7akeGHnv7eBOXcRgMeCP6+uyYsczwmeRCauvpvaAltgNyTbLH/+VaEAPUeWBT+1GuNmz4wC/6jtQzbbVA==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.5.0.tgz", + "integrity": "sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ==", "engines": { "node": ">=12" } @@ -8884,6 +9268,15 @@ "lz-string": "bin/bin.js" } }, + "node_modules/maath": { + "version": "0.10.8", + "resolved": "https://registry.npmjs.org/maath/-/maath-0.10.8.tgz", + "integrity": "sha512-tRvbDF0Pgqz+9XUa4jjfgAQ8/aPKmQdWXilFu2tMy4GWj4NOsx99HlULO4IeREfbO3a0sA145DZYyvXPkybm0g==", + "peerDependencies": { + "@types/three": ">=0.134.0", + "three": ">=0.134.0" + } + }, "node_modules/make-dir": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", @@ -8974,6 +9367,19 @@ "node": ">= 8" } }, + "node_modules/meshline": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/meshline/-/meshline-3.3.1.tgz", + "integrity": "sha512-/TQj+JdZkeSUOl5Mk2J7eLcYTLiQm2IDzmlSvYm7ov15anEcDJ92GHqqazxTSreeNgfnYu24kiEvvv0WlbCdFQ==", + "peerDependencies": { + "three": ">=0.137" + } + }, + "node_modules/meshoptimizer": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/meshoptimizer/-/meshoptimizer-0.18.1.tgz", + "integrity": "sha512-ZhoIoL7TNV4s5B6+rx5mC//fw8/POGyNxS/DZyCJeiZ12ScLfVwRE/GfsxwiTkMYYD5DmK2/JXnEVXqL4rF+Sw==" + }, "node_modules/micromatch": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", @@ -9027,9 +9433,9 @@ } }, "node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -9063,7 +9469,6 @@ "version": "3.3.7", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "dev": true, "funding": [ { "type": "github", @@ -9360,7 +9765,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, "engines": { "node": ">=8" } @@ -9480,12 +9884,12 @@ } }, "node_modules/playwright": { - "version": "1.45.3", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.45.3.tgz", - "integrity": "sha512-QhVaS+lpluxCaioejDZ95l4Y4jSFCsBvl2UZkpeXlzxmqS+aABr5c82YmfMHrL6x27nvrvykJAFpkzT2eWdJww==", + "version": "1.46.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.46.0.tgz", + "integrity": "sha512-XYJ5WvfefWONh1uPAUAi0H2xXV5S3vrtcnXe6uAOgdGi3aSpqOSXX08IAjXW34xitfuOJsvXU5anXZxPSEQiJw==", "dev": true, "dependencies": { - "playwright-core": "1.45.3" + "playwright-core": "1.46.0" }, "bin": { "playwright": "cli.js" @@ -9498,9 +9902,9 @@ } }, "node_modules/playwright-core": { - "version": "1.45.3", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.45.3.tgz", - "integrity": "sha512-+ym0jNbcjikaOwwSZycFbwkWgfruWvYlJfThKYAlImbxUgdWFO2oW70ojPm4OpE4t6TAo2FY/smM+hpVTtkhDA==", + "version": "1.46.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.46.0.tgz", + "integrity": "sha512-9Y/d5UIwuJk8t3+lhmMSAJyNP1BUC/DqP3cQJDQQL/oWqAiuPTLgy7Q5dzglmTLwcBRdetzgNM/gni7ckfTr6A==", "dev": true, "bin": { "playwright-core": "cli.js" @@ -9533,10 +9937,9 @@ } }, "node_modules/postcss": { - "version": "8.4.40", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.40.tgz", - "integrity": "sha512-YF2kKIUzAofPMpfH6hOi2cGnv/HrUlfucspc7pDyvv7kGdqXrfj8SCl/t8owkEgKEuu8ZcRjSOxFxVLqwChZ2Q==", - "dev": true, + "version": "8.4.41", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz", + "integrity": "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==", "funding": [ { "type": "opencollective", @@ -9632,6 +10035,15 @@ "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", "dev": true }, + "node_modules/promise-worker-transferable": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/promise-worker-transferable/-/promise-worker-transferable-1.0.4.tgz", + "integrity": "sha512-bN+0ehEnrXfxV2ZQvU2PetO0n4gqBD4ulq3MI1WOPLgr7/Mg9yRQkX5+0v1vagr74ZTsl7XtzlaYDo2EuCeYJw==", + "dependencies": { + "is-promise": "^2.1.0", + "lie": "^3.0.2" + } + }, "node_modules/prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", @@ -9738,9 +10150,20 @@ "node": ">=0.10.0" } }, - "node_modules/react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "node_modules/react-composer": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/react-composer/-/react-composer-5.0.3.tgz", + "integrity": "sha512-1uWd07EME6XZvMfapwZmc7NgCZqDemcvicRi3wMJzXsQLvZ3L7fTHVyPy1bZdnWXM4iPjYuNE+uJ41MLKeTtnA==", + "dependencies": { + "prop-types": "^15.6.0" + }, + "peerDependencies": { + "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "dependencies": { "loose-envify": "^1.1.0", @@ -9750,11 +10173,34 @@ "react": "^18.3.1" } }, + "node_modules/react-dom/node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, "node_modules/react-is": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" }, + "node_modules/react-reconciler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.27.0.tgz", + "integrity": "sha512-HmMDKciQjYmBRGuuhIaKA1ba/7a+UsM5FzOZsMO2JYHt9Jh8reCb7j1eDC95NOyUlKM9KRyvdx0flBuDvYSBoA==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.21.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "peerDependencies": { + "react": "^18.0.0" + } + }, "node_modules/react-refresh": { "version": "0.14.2", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", @@ -9829,6 +10275,18 @@ "react-dom": ">=16.6.0" } }, + "node_modules/react-use-measure": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/react-use-measure/-/react-use-measure-2.1.1.tgz", + "integrity": "sha512-nocZhN26cproIiIduswYpV5y5lQpSQS1y/4KuvUCjSKmw7ZWIS/+g3aFnX3WdBkyuGUtTLif3UTqnLLhbDoQig==", + "dependencies": { + "debounce": "^1.2.1" + }, + "peerDependencies": { + "react": ">=16.13", + "react-dom": ">=16.13" + } + }, "node_modules/redent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", @@ -9874,6 +10332,14 @@ "node": ">=0.10.0" } }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", @@ -9969,10 +10435,9 @@ } }, "node_modules/rollup": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.19.2.tgz", - "integrity": "sha512-6/jgnN1svF9PjNYJ4ya3l+cqutg49vOZ4rVgsDKxdl+5gpGPnByFXWGyfH9YGx9i3nfBwSu1Iyu6vGwFFA0BdQ==", - "dev": true, + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.20.0.tgz", + "integrity": "sha512-6rbWBChcnSGzIlXeIdNIZTopKYad8ZG8ajhl78lGRLsI2rX8IkaotQhVas2Ma+GPxJav19wrSzvRvuiv0YKzWw==", "dependencies": { "@types/estree": "1.0.5" }, @@ -9984,22 +10449,22 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.19.2", - "@rollup/rollup-android-arm64": "4.19.2", - "@rollup/rollup-darwin-arm64": "4.19.2", - "@rollup/rollup-darwin-x64": "4.19.2", - "@rollup/rollup-linux-arm-gnueabihf": "4.19.2", - "@rollup/rollup-linux-arm-musleabihf": "4.19.2", - "@rollup/rollup-linux-arm64-gnu": "4.19.2", - "@rollup/rollup-linux-arm64-musl": "4.19.2", - "@rollup/rollup-linux-powerpc64le-gnu": "4.19.2", - "@rollup/rollup-linux-riscv64-gnu": "4.19.2", - "@rollup/rollup-linux-s390x-gnu": "4.19.2", - "@rollup/rollup-linux-x64-gnu": "4.19.2", - "@rollup/rollup-linux-x64-musl": "4.19.2", - "@rollup/rollup-win32-arm64-msvc": "4.19.2", - "@rollup/rollup-win32-ia32-msvc": "4.19.2", - "@rollup/rollup-win32-x64-msvc": "4.19.2", + "@rollup/rollup-android-arm-eabi": "4.20.0", + "@rollup/rollup-android-arm64": "4.20.0", + "@rollup/rollup-darwin-arm64": "4.20.0", + "@rollup/rollup-darwin-x64": "4.20.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.20.0", + "@rollup/rollup-linux-arm-musleabihf": "4.20.0", + "@rollup/rollup-linux-arm64-gnu": "4.20.0", + "@rollup/rollup-linux-arm64-musl": "4.20.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.20.0", + "@rollup/rollup-linux-riscv64-gnu": "4.20.0", + "@rollup/rollup-linux-s390x-gnu": "4.20.0", + "@rollup/rollup-linux-x64-gnu": "4.20.0", + "@rollup/rollup-linux-x64-musl": "4.20.0", + "@rollup/rollup-win32-arm64-msvc": "4.20.0", + "@rollup/rollup-win32-ia32-msvc": "4.20.0", + "@rollup/rollup-win32-x64-msvc": "4.20.0", "fsevents": "~2.3.2" } }, @@ -10085,9 +10550,9 @@ } }, "node_modules/scheduler": { - "version": "0.23.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", - "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.21.0.tgz", + "integrity": "sha512-1r87x5fz9MXqswA2ERLo0EbOAU74DpIUO090gIasYTqlVoJeMcl+Z1Rg7WHz+qtPujhS/hGIt9kxZOYBV3faRQ==", "dependencies": { "loose-envify": "^1.1.0" } @@ -10154,7 +10619,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, "dependencies": { "shebang-regex": "^3.0.0" }, @@ -10166,7 +10630,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, "engines": { "node": ">=8" } @@ -10259,7 +10722,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -10344,6 +10806,31 @@ "node": ">=8" } }, + "node_modules/stats-gl": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/stats-gl/-/stats-gl-2.2.8.tgz", + "integrity": "sha512-94G5nZvduDmzxBS7K0lYnynYwreZpkknD8g5dZmU6mpwIhy3caCrjAm11Qm1cbyx7mqix7Fp00RkbsonzKWnoQ==", + "dependencies": { + "@types/three": "^0.163.0" + } + }, + "node_modules/stats-gl/node_modules/@types/three": { + "version": "0.163.0", + "resolved": "https://registry.npmjs.org/@types/three/-/three-0.163.0.tgz", + "integrity": "sha512-uIdDhsXRpQiBUkflBS/i1l3JX14fW6Ot9csed60nfbZNXHDTRsnV2xnTVwXcgbvTiboAR4IW+t+lTL5f1rqIqA==", + "dependencies": { + "@tweenjs/tween.js": "~23.1.1", + "@types/stats.js": "*", + "@types/webxr": "*", + "fflate": "~0.8.2", + "meshoptimizer": "~0.18.1" + } + }, + "node_modules/stats.js": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/stats.js/-/stats.js-0.17.0.tgz", + "integrity": "sha512-hNKz8phvYLPEcRkeG1rsGmV5ChMjKDAWU7/OJJdDErPBNChQXxCo3WZurGpnWc6gZhAzEPFad1aVgyOANH1sMw==" + }, "node_modules/string-length": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", @@ -10509,6 +10996,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/suspend-react": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/suspend-react/-/suspend-react-0.1.3.tgz", + "integrity": "sha512-aqldKgX9aZqpoDp3e8/BZ8Dm7x1pJl+qI3ZKxDN0i/IQTWUwBx/ManmlVJ3wowqbno6c2bmiIfs+Um6LbsjJyQ==", + "peerDependencies": { + "react": ">=17.0" + } + }, "node_modules/symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", @@ -10579,6 +11074,45 @@ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, + "node_modules/three": { + "version": "0.167.1", + "resolved": "https://registry.npmjs.org/three/-/three-0.167.1.tgz", + "integrity": "sha512-gYTLJA/UQip6J/tJvl91YYqlZF47+D/kxiWrbTon35ZHlXEN0VOo+Qke2walF1/x92v55H6enomymg4Dak52kw==" + }, + "node_modules/three-mesh-bvh": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/three-mesh-bvh/-/three-mesh-bvh-0.7.6.tgz", + "integrity": "sha512-rCjsnxEqR9r1/C/lCqzGLS67NDty/S/eT6rAJfDvsanrIctTWdNoR4ZOGWewCB13h1QkVo2BpmC0wakj1+0m8A==", + "peerDependencies": { + "three": ">= 0.151.0" + } + }, + "node_modules/three-stdlib": { + "version": "2.32.1", + "resolved": "https://registry.npmjs.org/three-stdlib/-/three-stdlib-2.32.1.tgz", + "integrity": "sha512-ZgxxLAwtEaKkvfGP+hkW4s6IaDzif47evTdBPwVvdvLsOul3M6l0D4vO4/fzFguXT6FdoBlaTLhteOcn3uDzPg==", + "dependencies": { + "@types/draco3d": "^1.4.0", + "@types/offscreencanvas": "^2019.6.4", + "@types/webxr": "^0.5.2", + "draco3d": "^1.4.1", + "fflate": "^0.6.9", + "potpack": "^1.0.1" + }, + "peerDependencies": { + "three": ">=0.128.0" + } + }, + "node_modules/three-stdlib/node_modules/fflate": { + "version": "0.6.10", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.6.10.tgz", + "integrity": "sha512-IQrh3lEPM93wVCEczc9SaAOvkmcoQn/G8Bo1e8ZPlY3X3bnAxWaBdvTdvM1hP62iZp0BXWDy4vTAy4fF0+Dlpg==" + }, + "node_modules/three-stdlib/node_modules/potpack": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/potpack/-/potpack-1.0.2.tgz", + "integrity": "sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ==" + }, "node_modules/tinyqueue": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-3.0.0.tgz", @@ -10637,6 +11171,33 @@ "node": ">=12" } }, + "node_modules/troika-three-text": { + "version": "0.49.1", + "resolved": "https://registry.npmjs.org/troika-three-text/-/troika-three-text-0.49.1.tgz", + "integrity": "sha512-lXGWxgjJP9kw4i4Wh+0k0Q/7cRfS6iOME4knKht/KozPu9GcFA9NnNpRvehIhrUawq9B0ZRw+0oiFHgRO+4Wig==", + "dependencies": { + "bidi-js": "^1.0.2", + "troika-three-utils": "^0.49.0", + "troika-worker-utils": "^0.49.0", + "webgl-sdf-generator": "1.1.1" + }, + "peerDependencies": { + "three": ">=0.125.0" + } + }, + "node_modules/troika-three-utils": { + "version": "0.49.0", + "resolved": "https://registry.npmjs.org/troika-three-utils/-/troika-three-utils-0.49.0.tgz", + "integrity": "sha512-umitFL4cT+Fm/uONmaQEq4oZlyRHWwVClaS6ZrdcueRvwc2w+cpNQ47LlJKJswpqtMFWbEhOLy0TekmcPZOdYA==", + "peerDependencies": { + "three": ">=0.125.0" + } + }, + "node_modules/troika-worker-utils": { + "version": "0.49.0", + "resolved": "https://registry.npmjs.org/troika-worker-utils/-/troika-worker-utils-0.49.0.tgz", + "integrity": "sha512-1xZHoJrG0HFfCvT/iyN41DvI/nRykiBtHqFkGaGgJwq5iXfIZFBiPPEHFpPpgyKM3Oo5ITHXP5wM2TNQszYdVg==" + }, "node_modules/ts-api-utils": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", @@ -10787,6 +11348,41 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" }, + "node_modules/tunnel-rat": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/tunnel-rat/-/tunnel-rat-0.1.2.tgz", + "integrity": "sha512-lR5VHmkPhzdhrM092lI2nACsLO4QubF0/yoOhzX7c+wIpbN1GjHNzCc91QlpxBi+cnx8vVJ+Ur6vL5cEoQPFpQ==", + "dependencies": { + "zustand": "^4.3.2" + } + }, + "node_modules/tunnel-rat/node_modules/zustand": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.4.tgz", + "integrity": "sha512-/BPMyLKJPtFEvVL0E9E9BTUM63MNyhPGlvxk1XjrfWTUlV+BR8jufjsovHzrtR6YNcBEcL7cMHovL1n9xHawEg==", + "dependencies": { + "use-sync-external-store": "1.2.0" + }, + "engines": { + "node": ">=12.7.0" + }, + "peerDependencies": { + "@types/react": ">=16.8", + "immer": ">=9.0.6", + "react": ">=16.8" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "immer": { + "optional": true + }, + "react": { + "optional": true + } + } + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -11024,6 +11620,14 @@ } } }, + "node_modules/use-sync-external-store": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", + "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/util": { "version": "0.12.5", "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", @@ -11037,6 +11641,26 @@ "which-typed-array": "^1.1.2" } }, + "node_modules/utility-types": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz", + "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", @@ -11067,7 +11691,6 @@ "version": "5.3.5", "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.5.tgz", "integrity": "sha512-MdjglKR6AQXQb9JGiS7Rc2wC6uMjcm7Go/NHNO63EwiJXfuk9PgqiP/n5IDJCziMkfw9n4Ubp7lttNwz+8ZVKA==", - "dev": true, "dependencies": { "esbuild": "^0.21.3", "postcss": "^8.4.39", @@ -11118,6 +11741,21 @@ } } }, + "node_modules/vite-plugin-glsl": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/vite-plugin-glsl/-/vite-plugin-glsl-1.3.0.tgz", + "integrity": "sha512-SzEoLet9Bp5VSozjrhUiSc3xX1+u7rCTjXAsq4qWM3u8UjilI76A9ucX/T+CRGQCe25j50GSY+9mKSGUVPET1w==", + "dependencies": { + "@rollup/pluginutils": "^5.1.0" + }, + "engines": { + "node": ">= 16.15.1", + "npm": ">= 8.11.0" + }, + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" + } + }, "node_modules/vt-pbf": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/vt-pbf/-/vt-pbf-3.1.3.tgz", @@ -11149,6 +11787,16 @@ "makeerror": "1.0.12" } }, + "node_modules/webgl-constants": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/webgl-constants/-/webgl-constants-1.1.1.tgz", + "integrity": "sha512-LkBXKjU5r9vAW7Gcu3T5u+5cvSvh5WwINdr0C+9jpzVB41cjQAP5ePArDtk/WHYdVj0GefCgM73BA7FlIiNtdg==" + }, + "node_modules/webgl-sdf-generator": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/webgl-sdf-generator/-/webgl-sdf-generator-1.1.1.tgz", + "integrity": "sha512-9Z0JcMTFxeE+b2x1LJTdnaT8rT8aEp7MVxkNwoycNmJWwPdzoXzMh0BjJSh/AEFP+KPYZUli814h8bJZFIZ2jA==" + }, "node_modules/webidl-conversions": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", @@ -11196,7 +11844,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, "dependencies": { "isexe": "^2.0.0" }, @@ -11434,6 +12081,8606 @@ "dependencies": { "tslib": "2.3.0" } + }, + "node_modules/zustand": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-3.7.2.tgz", + "integrity": "sha512-PIJDIZKtokhof+9+60cpockVOq05sJzHCriyvaLBmEJixseQ1a5Kdov6fWZfWOu5SK9c+FhH1jU0tntLxRJYMA==", + "engines": { + "node": ">=12.7.0" + }, + "peerDependencies": { + "react": ">=16.8" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + } + } + } + }, + "dependencies": { + "@adobe/css-tools": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.0.tgz", + "integrity": "sha512-Ff9+ksdQQB3rMncgqDK78uLznstjyfIf2Arnh22pW8kBpLs6rpKDwgnZT46hin5Hl1WzazzK64DOrhSwYpS7bQ==", + "dev": true + }, + "@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "@babel/code-frame": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "requires": { + "@babel/highlight": "^7.24.7", + "picocolors": "^1.0.0" + } + }, + "@babel/compat-data": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.2.tgz", + "integrity": "sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==", + "dev": true + }, + "@babel/core": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", + "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.25.0", + "@babel/helper-compilation-targets": "^7.25.2", + "@babel/helper-module-transforms": "^7.25.2", + "@babel/helpers": "^7.25.0", + "@babel/parser": "^7.25.0", + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.2", + "@babel/types": "^7.25.2", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "dependencies": { + "convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.0.tgz", + "integrity": "sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==", + "requires": { + "@babel/types": "^7.25.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", + "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.25.2", + "@babel/helper-validator-option": "^7.24.8", + "browserslist": "^4.23.1", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "@babel/helper-module-imports": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", + "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", + "requires": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + } + }, + "@babel/helper-module-transforms": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", + "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7", + "@babel/traverse": "^7.25.2" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", + "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", + "dev": true + }, + "@babel/helper-simple-access": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", + "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", + "dev": true, + "requires": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + } + }, + "@babel/helper-string-parser": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", + "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==" + }, + "@babel/helper-validator-identifier": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==" + }, + "@babel/helper-validator-option": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", + "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", + "dev": true + }, + "@babel/helpers": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.0.tgz", + "integrity": "sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==", + "dev": true, + "requires": { + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.0" + } + }, + "@babel/highlight": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", + "requires": { + "@babel/helper-validator-identifier": "^7.24.7", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + } + }, + "@babel/parser": { + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.3.tgz", + "integrity": "sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==", + "requires": { + "@babel/types": "^7.25.2" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz", + "integrity": "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.24.7" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-typescript": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz", + "integrity": "sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.24.7" + } + }, + "@babel/plugin-transform-react-jsx-self": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.7.tgz", + "integrity": "sha512-fOPQYbGSgH0HUp4UJO4sMBFjY6DuWq+2i8rixyUMb3CdGixs/gccURvYOAhajBdKDoGajFr3mUq5rH3phtkGzw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.24.7" + } + }, + "@babel/plugin-transform-react-jsx-source": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.24.7.tgz", + "integrity": "sha512-J2z+MWzZHVOemyLweMqngXrgGC42jQ//R0KdxqkIz/OrbVIIlhFI3WigZ5fO+nwFvBlncr4MGapd8vTyc7RPNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.24.7" + } + }, + "@babel/runtime": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz", + "integrity": "sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==", + "requires": { + "regenerator-runtime": "^0.14.0" + } + }, + "@babel/template": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", + "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", + "requires": { + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.25.0", + "@babel/types": "^7.25.0" + } + }, + "@babel/traverse": { + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.3.tgz", + "integrity": "sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==", + "requires": { + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.25.0", + "@babel/parser": "^7.25.3", + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.2", + "debug": "^4.3.1", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.2.tgz", + "integrity": "sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==", + "requires": { + "@babel/helper-string-parser": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", + "to-fast-properties": "^2.0.0" + } + }, + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "dependencies": { + "@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + } + } + }, + "@emotion/babel-plugin": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.12.0.tgz", + "integrity": "sha512-y2WQb+oP8Jqvvclh8Q55gLUyb7UFvgv7eJfsj7td5TToBrIUtPay2kMrZi4xjq9qw2vD0ZR5fSho0yqoFgX7Rw==", + "requires": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/serialize": "^1.2.0", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + } + }, + "@emotion/cache": { + "version": "11.13.1", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.13.1.tgz", + "integrity": "sha512-iqouYkuEblRcXmylXIwwOodiEK5Ifl7JcX7o6V4jI3iW4mLXX3dmt5xwBtIkJiQEXFAI+pC8X0i67yiPkH9Ucw==", + "requires": { + "@emotion/memoize": "^0.9.0", + "@emotion/sheet": "^1.4.0", + "@emotion/utils": "^1.4.0", + "@emotion/weak-memoize": "^0.4.0", + "stylis": "4.2.0" + } + }, + "@emotion/hash": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz", + "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==" + }, + "@emotion/is-prop-valid": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.3.0.tgz", + "integrity": "sha512-SHetuSLvJDzuNbOdtPVbq6yMMMlLoW5Q94uDqJZqy50gcmAjxFkVqmzqSGEFq9gT2iMuIeKV1PXVWmvUhuZLlQ==", + "requires": { + "@emotion/memoize": "^0.9.0" + } + }, + "@emotion/memoize": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", + "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==" + }, + "@emotion/react": { + "version": "11.13.0", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.13.0.tgz", + "integrity": "sha512-WkL+bw1REC2VNV1goQyfxjx1GYJkcc23CRQkXX+vZNLINyfI7o+uUn/rTGPt/xJ3bJHd5GcljgnxHf4wRw5VWQ==", + "requires": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.12.0", + "@emotion/cache": "^11.13.0", + "@emotion/serialize": "^1.3.0", + "@emotion/use-insertion-effect-with-fallbacks": "^1.1.0", + "@emotion/utils": "^1.4.0", + "@emotion/weak-memoize": "^0.4.0", + "hoist-non-react-statics": "^3.3.1" + } + }, + "@emotion/serialize": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.0.tgz", + "integrity": "sha512-jACuBa9SlYajnpIVXB+XOXnfJHyckDfe6fOpORIM6yhBDlqGuExvDdZYHDQGoDf3bZXGv7tNr+LpLjJqiEQ6EA==", + "requires": { + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/unitless": "^0.9.0", + "@emotion/utils": "^1.4.0", + "csstype": "^3.0.2" + } + }, + "@emotion/sheet": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz", + "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==" + }, + "@emotion/styled": { + "version": "11.13.0", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.13.0.tgz", + "integrity": "sha512-tkzkY7nQhW/zC4hztlwucpT8QEZ6eUzpXDRhww/Eej4tFfO0FxQYWRyg/c5CCXa4d/f174kqeXYjuQRnhzf6dA==", + "requires": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.12.0", + "@emotion/is-prop-valid": "^1.3.0", + "@emotion/serialize": "^1.3.0", + "@emotion/use-insertion-effect-with-fallbacks": "^1.1.0", + "@emotion/utils": "^1.4.0" + } + }, + "@emotion/unitless": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.9.0.tgz", + "integrity": "sha512-TP6GgNZtmtFaFcsOgExdnfxLLpRDla4Q66tnenA9CktvVSdNKDvMVuUah4QvWPIpNjrWsGg3qeGo9a43QooGZQ==" + }, + "@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.1.0.tgz", + "integrity": "sha512-+wBOcIV5snwGgI2ya3u99D7/FJquOIniQT1IKyDsBmEgwvpxMNeS65Oib7OnE2d2aY+3BU4OiH+0Wchf8yk3Hw==", + "requires": {} + }, + "@emotion/utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.0.tgz", + "integrity": "sha512-spEnrA1b6hDR/C68lC2M7m6ALPUHZC0lIY7jAS/B/9DuuO1ZP04eov8SMv/6fwRd8pzmsn2AuJEznRREWlQrlQ==" + }, + "@emotion/weak-memoize": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz", + "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==" + }, + "@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "optional": true + }, + "@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "optional": true + }, + "@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^3.3.0" + } + }, + "@eslint-community/regexpp": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", + "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", + "dev": true + }, + "@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + } + } + }, + "@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "dev": true + }, + "@floating-ui/core": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.6.tgz", + "integrity": "sha512-Vkvsw6EcpMHjvZZdMkSY+djMGFbt7CRssW99Ne8tar2WLnZ/l3dbxeTShbLQj+/s35h+Qb4cmnob+EzwtjrXGQ==", + "requires": { + "@floating-ui/utils": "^0.2.6" + } + }, + "@floating-ui/dom": { + "version": "1.6.9", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.9.tgz", + "integrity": "sha512-zB1PcI350t4tkm3rvUhSRKa9sT7vH5CrAbQxW+VaPYJXKAO0gsg4CTueL+6Ajp7XzAQC8CW4Jj1Wgqc0sB6oUQ==", + "requires": { + "@floating-ui/core": "^1.6.0", + "@floating-ui/utils": "^0.2.6" + } + }, + "@floating-ui/utils": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.6.tgz", + "integrity": "sha512-0KI3zGxIUs1KDR/pjQPdJH4Z8nGBm0yJ5WRoRfdw1Kzeh45jkIfA0rmD0kBF6fKHH+xaH7g8y4jIXyAV5MGK3g==" + }, + "@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true + }, + "@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "dev": true + }, + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } + } + }, + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true + }, + "@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dev": true, + "requires": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dev": true, + "requires": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "requires": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + } + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dev": true, + "requires": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + } + }, + "@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dev": true, + "requires": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + } + }, + "@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dev": true, + "requires": { + "jest-get-type": "^29.6.3" + } + }, + "@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "dev": true, + "requires": { + "@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/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "dev": true, + "requires": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + } + }, + "@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "dev": true, + "requires": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "requires": { + "@sinclair/typebox": "^0.27.8" + } + }, + "@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + } + }, + "@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "dev": true, + "requires": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + } + }, + "@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "dev": true, + "requires": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + } + }, + "@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, + "requires": { + "@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" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "requires": { + "@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" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "requires": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==" + }, + "@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==" + }, + "@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" + }, + "@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "requires": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "@mapbox/geojson-rewind": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@mapbox/geojson-rewind/-/geojson-rewind-0.5.2.tgz", + "integrity": "sha512-tJaT+RbYGJYStt7wI3cq4Nl4SXxG8W7JDG5DMJu97V25RnbNg3QtQtf+KD+VLjNpWKYsRvXDNmNrBgEETr1ifA==", + "requires": { + "get-stream": "^6.0.1", + "minimist": "^1.2.6" + } + }, + "@mapbox/jsonlint-lines-primitives": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.2.tgz", + "integrity": "sha512-rY0o9A5ECsTQRVhv7tL/OyDpGAoUB4tTvLiW1DSzQGq4bvTPhNw1VpSNjDJc5GFZ2XuyOtSWSVN05qOtcD71qQ==" + }, + "@mapbox/point-geometry": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz", + "integrity": "sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ==" + }, + "@mapbox/tiny-sdf": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@mapbox/tiny-sdf/-/tiny-sdf-2.0.6.tgz", + "integrity": "sha512-qMqa27TLw+ZQz5Jk+RcwZGH7BQf5G/TrutJhspsca/3SHwmgKQ1iq+d3Jxz5oysPVYTGP6aXxCo5Lk9Er6YBAA==" + }, + "@mapbox/unitbezier": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-0.0.1.tgz", + "integrity": "sha512-nMkuDXFv60aBr9soUG5q+GvZYL+2KZHVvsqFCzqnkGEf46U2fvmytHaEVc1/YZbiLn8X+eR3QzX1+dwDO1lxlw==" + }, + "@mapbox/vector-tile": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@mapbox/vector-tile/-/vector-tile-1.3.1.tgz", + "integrity": "sha512-MCEddb8u44/xfQ3oD+Srl/tNcQoqTw3goGk2oLsrFxOTc3dUp+kAnby3PvAeeBYSMSjSPD1nd1AJA6W49WnoUw==", + "requires": { + "@mapbox/point-geometry": "~0.1.0" + } + }, + "@mapbox/whoots-js": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@mapbox/whoots-js/-/whoots-js-3.1.0.tgz", + "integrity": "sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q==" + }, + "@maplibre/maplibre-gl-style-spec": { + "version": "20.3.0", + "resolved": "https://registry.npmjs.org/@maplibre/maplibre-gl-style-spec/-/maplibre-gl-style-spec-20.3.0.tgz", + "integrity": "sha512-eSiQ3E5LUSxAOY9ABXGyfNhout2iEa6mUxKeaQ9nJ8NL1NuaQYU7zKqzx/LEYcXe1neT4uYAgM1wYZj3fTSXtA==", + "requires": { + "@mapbox/jsonlint-lines-primitives": "~2.0.2", + "@mapbox/unitbezier": "^0.0.1", + "json-stringify-pretty-compact": "^4.0.0", + "minimist": "^1.2.8", + "quickselect": "^2.0.0", + "rw": "^1.3.3", + "sort-object": "^3.0.3", + "tinyqueue": "^2.0.3" + }, + "dependencies": { + "quickselect": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-2.0.0.tgz", + "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==" + }, + "tinyqueue": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-2.0.3.tgz", + "integrity": "sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==" + } + } + }, + "@mediapipe/tasks-vision": { + "version": "0.10.8", + "resolved": "https://registry.npmjs.org/@mediapipe/tasks-vision/-/tasks-vision-0.10.8.tgz", + "integrity": "sha512-Rp7ll8BHrKB3wXaRFKhrltwZl1CiXGdibPxuWXvqGnKTnv8fqa/nvftYNuSbf+pbJWKYCXdBtYTITdAUTGGh0Q==" + }, + "@monogrid/gainmap-js": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@monogrid/gainmap-js/-/gainmap-js-3.0.5.tgz", + "integrity": "sha512-53sCTG4FaJBaAq/tcufARtVYDMDGqyBT9i7F453pWGhZ5LqubDHDWtYoHo9VhQqMcHTEexdJqSsR58y+9HVmQA==", + "requires": { + "promise-worker-transferable": "^1.0.4" + } + }, + "@mui/core-downloads-tracker": { + "version": "5.16.6", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.16.6.tgz", + "integrity": "sha512-kytg6LheUG42V8H/o/Ptz3olSO5kUXW9zF0ox18VnblX6bO2yif1FPItgc3ey1t5ansb1+gbe7SatntqusQupg==", + "peer": true + }, + "@mui/material": { + "version": "5.16.6", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.16.6.tgz", + "integrity": "sha512-0LUIKBOIjiFfzzFNxXZBRAyr9UQfmTAFzbt6ziOU2FDXhorNN2o3N9/32mNJbCA8zJo2FqFU6d3dtoqUDyIEfA==", + "peer": true, + "requires": { + "@babel/runtime": "^7.23.9", + "@mui/core-downloads-tracker": "^5.16.6", + "@mui/system": "^5.16.6", + "@mui/types": "^7.2.15", + "@mui/utils": "^5.16.6", + "@popperjs/core": "^2.11.8", + "@types/react-transition-group": "^4.4.10", + "clsx": "^2.1.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1", + "react-is": "^18.3.1", + "react-transition-group": "^4.4.5" + } + }, + "@mui/private-theming": { + "version": "5.16.6", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.16.6.tgz", + "integrity": "sha512-rAk+Rh8Clg7Cd7shZhyt2HGTTE5wYKNSJ5sspf28Fqm/PZ69Er9o6KX25g03/FG2dfpg5GCwZh/xOojiTfm3hw==", + "requires": { + "@babel/runtime": "^7.23.9", + "@mui/utils": "^5.16.6", + "prop-types": "^15.8.1" + } + }, + "@mui/styled-engine": { + "version": "5.16.6", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.16.6.tgz", + "integrity": "sha512-zaThmS67ZmtHSWToTiHslbI8jwrmITcN93LQaR2lKArbvS7Z3iLkwRoiikNWutx9MBs8Q6okKvbZq1RQYB3v7g==", + "requires": { + "@babel/runtime": "^7.23.9", + "@emotion/cache": "^11.11.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" + } + }, + "@mui/system": { + "version": "5.16.6", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.16.6.tgz", + "integrity": "sha512-5xgyJjBIMPw8HIaZpfbGAaFYPwImQn7Nyh+wwKWhvkoIeDosQ1ZMVrbTclefi7G8hNmqhip04duYwYpbBFnBgw==", + "requires": { + "@babel/runtime": "^7.23.9", + "@mui/private-theming": "^5.16.6", + "@mui/styled-engine": "^5.16.6", + "@mui/types": "^7.2.15", + "@mui/utils": "^5.16.6", + "clsx": "^2.1.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" + } + }, + "@mui/types": { + "version": "7.2.15", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.15.tgz", + "integrity": "sha512-nbo7yPhtKJkdf9kcVOF8JZHPZTmqXjJ/tI0bdWgHg5tp9AnIN4Y7f7wm9T+0SyGYJk76+GYZ8Q5XaTYAsUHN0Q==", + "requires": {} + }, + "@mui/utils": { + "version": "5.16.6", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.16.6.tgz", + "integrity": "sha512-tWiQqlhxAt3KENNiSRL+DIn9H5xNVK6Jjf70x3PnfQPz1MPBdh7yyIcAyVBT9xiw7hP3SomRhPR7hzBMBCjqEA==", + "requires": { + "@babel/runtime": "^7.23.9", + "@mui/types": "^7.2.15", + "@types/prop-types": "^15.7.12", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "react-is": "^18.3.1" + } + }, + "@mui/x-date-pickers": { + "version": "7.12.0", + "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-7.12.0.tgz", + "integrity": "sha512-WU5C7QNfSpJ9cP8vl2sY7q35NW+0TUMgEy+sl98fcPhLckq3cgV1wnVxoZnQZ3BxVQAtx+7ag/MpefU03vJcVw==", + "requires": { + "@babel/runtime": "^7.25.0", + "@mui/system": "^5.16.5", + "@mui/utils": "^5.16.5", + "@types/react-transition-group": "^4.4.10", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "react-transition-group": "^4.4.5" + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@pkgr/core": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", + "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", + "dev": true + }, + "@playwright/test": { + "version": "1.46.0", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.46.0.tgz", + "integrity": "sha512-/QYft5VArOrGRP5pgkrfKksqsKA6CEFyGQ/gjNe6q0y4tZ1aaPfq4gIjudr1s3D+pXyrPRdsy4opKDrjBabE5w==", + "dev": true, + "requires": { + "playwright": "1.46.0" + } + }, + "@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "peer": true + }, + "@react-spring/animated": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@react-spring/animated/-/animated-9.6.1.tgz", + "integrity": "sha512-ls/rJBrAqiAYozjLo5EPPLLOb1LM0lNVQcXODTC1SMtS6DbuBCPaKco5svFUQFMP2dso3O+qcC4k9FsKc0KxMQ==", + "requires": { + "@react-spring/shared": "~9.6.1", + "@react-spring/types": "~9.6.1" + } + }, + "@react-spring/core": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@react-spring/core/-/core-9.6.1.tgz", + "integrity": "sha512-3HAAinAyCPessyQNNXe5W0OHzRfa8Yo5P748paPcmMowZ/4sMfaZ2ZB6e5x5khQI8NusOHj8nquoutd6FRY5WQ==", + "requires": { + "@react-spring/animated": "~9.6.1", + "@react-spring/rafz": "~9.6.1", + "@react-spring/shared": "~9.6.1", + "@react-spring/types": "~9.6.1" + } + }, + "@react-spring/rafz": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@react-spring/rafz/-/rafz-9.6.1.tgz", + "integrity": "sha512-v6qbgNRpztJFFfSE3e2W1Uz+g8KnIBs6SmzCzcVVF61GdGfGOuBrbjIcp+nUz301awVmREKi4eMQb2Ab2gGgyQ==" + }, + "@react-spring/shared": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@react-spring/shared/-/shared-9.6.1.tgz", + "integrity": "sha512-PBFBXabxFEuF8enNLkVqMC9h5uLRBo6GQhRMQT/nRTnemVENimgRd+0ZT4yFnAQ0AxWNiJfX3qux+bW2LbG6Bw==", + "requires": { + "@react-spring/rafz": "~9.6.1", + "@react-spring/types": "~9.6.1" + } + }, + "@react-spring/three": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@react-spring/three/-/three-9.6.1.tgz", + "integrity": "sha512-Tyw2YhZPKJAX3t2FcqvpLRb71CyTe1GvT3V+i+xJzfALgpk10uPGdGaQQ5Xrzmok1340DAeg2pR/MCfaW7b8AA==", + "requires": { + "@react-spring/animated": "~9.6.1", + "@react-spring/core": "~9.6.1", + "@react-spring/shared": "~9.6.1", + "@react-spring/types": "~9.6.1" + } + }, + "@react-spring/types": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@react-spring/types/-/types-9.6.1.tgz", + "integrity": "sha512-POu8Mk0hIU3lRXB3bGIGe4VHIwwDsQyoD1F394OK7STTiX9w4dG3cTLljjYswkQN+hDSHRrj4O36kuVa7KPU8Q==" + }, + "@react-three/drei": { + "version": "9.109.2", + "resolved": "https://registry.npmjs.org/@react-three/drei/-/drei-9.109.2.tgz", + "integrity": "sha512-oUbfjiyPQeQch4Mi3jZvFKigMlc97/xvazxyjPBCGa8RP8cHZJl187eZI9Ha1WwkVaX80DfgN7bYAWXS4ywxmw==", + "requires": { + "@babel/runtime": "^7.11.2", + "@mediapipe/tasks-vision": "0.10.8", + "@monogrid/gainmap-js": "^3.0.5", + "@react-spring/three": "~9.6.1", + "@use-gesture/react": "^10.2.24", + "camera-controls": "^2.4.2", + "cross-env": "^7.0.3", + "detect-gpu": "^5.0.28", + "glsl-noise": "^0.0.0", + "hls.js": "1.3.5", + "maath": "^0.10.7", + "meshline": "^3.1.6", + "react-composer": "^5.0.3", + "stats-gl": "^2.0.0", + "stats.js": "^0.17.0", + "suspend-react": "^0.1.3", + "three-mesh-bvh": "^0.7.0", + "three-stdlib": "^2.29.9", + "troika-three-text": "^0.49.0", + "tunnel-rat": "^0.1.2", + "utility-types": "^3.10.0", + "uuid": "^9.0.1", + "zustand": "^3.7.1" + } + }, + "@react-three/fiber": { + "version": "8.16.8", + "resolved": "https://registry.npmjs.org/@react-three/fiber/-/fiber-8.16.8.tgz", + "integrity": "sha512-Lc8fjATtvQEfSd8d5iKdbpHtRm/aPMeFj7jQvp6TNHfpo8IQTW3wwcE1ZMrGGoUH+w2mnyS+0MK1NLPLnuzGkQ==", + "requires": { + "@babel/runtime": "^7.17.8", + "@types/react-reconciler": "^0.26.7", + "@types/webxr": "*", + "base64-js": "^1.5.1", + "buffer": "^6.0.3", + "its-fine": "^1.0.6", + "react-reconciler": "^0.27.0", + "react-use-measure": "^2.1.1", + "scheduler": "^0.21.0", + "suspend-react": "^0.1.3", + "zustand": "^3.7.1" + } + }, + "@remix-run/router": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.19.0.tgz", + "integrity": "sha512-zDICCLKEwbVYTS6TjYaWtHXxkdoUvD/QXvyVZjGCsWz5vyH7aFeONlPffPdW+Y/t6KT0MgXb2Mfjun9YpWN1dA==" + }, + "@rollup/pluginutils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", + "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", + "requires": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + } + }, + "@rollup/rollup-android-arm-eabi": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.20.0.tgz", + "integrity": "sha512-TSpWzflCc4VGAUJZlPpgAJE1+V60MePDQnBd7PPkpuEmOy8i87aL6tinFGKBFKuEDikYpig72QzdT3QPYIi+oA==", + "optional": true + }, + "@rollup/rollup-android-arm64": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.20.0.tgz", + "integrity": "sha512-u00Ro/nok7oGzVuh/FMYfNoGqxU5CPWz1mxV85S2w9LxHR8OoMQBuSk+3BKVIDYgkpeOET5yXkx90OYFc+ytpQ==", + "optional": true + }, + "@rollup/rollup-darwin-arm64": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.20.0.tgz", + "integrity": "sha512-uFVfvzvsdGtlSLuL0ZlvPJvl6ZmrH4CBwLGEFPe7hUmf7htGAN+aXo43R/V6LATyxlKVC/m6UsLb7jbG+LG39Q==", + "optional": true + }, + "@rollup/rollup-darwin-x64": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.20.0.tgz", + "integrity": "sha512-xbrMDdlev53vNXexEa6l0LffojxhqDTBeL+VUxuuIXys4x6xyvbKq5XqTXBCEUA8ty8iEJblHvFaWRJTk/icAQ==", + "optional": true + }, + "@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.20.0.tgz", + "integrity": "sha512-jMYvxZwGmoHFBTbr12Xc6wOdc2xA5tF5F2q6t7Rcfab68TT0n+r7dgawD4qhPEvasDsVpQi+MgDzj2faOLsZjA==", + "optional": true + }, + "@rollup/rollup-linux-arm-musleabihf": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.20.0.tgz", + "integrity": "sha512-1asSTl4HKuIHIB1GcdFHNNZhxAYEdqML/MW4QmPS4G0ivbEcBr1JKlFLKsIRqjSwOBkdItn3/ZDlyvZ/N6KPlw==", + "optional": true + }, + "@rollup/rollup-linux-arm64-gnu": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.20.0.tgz", + "integrity": "sha512-COBb8Bkx56KldOYJfMf6wKeYJrtJ9vEgBRAOkfw6Ens0tnmzPqvlpjZiLgkhg6cA3DGzCmLmmd319pmHvKWWlQ==", + "optional": true + }, + "@rollup/rollup-linux-arm64-musl": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.20.0.tgz", + "integrity": "sha512-+it+mBSyMslVQa8wSPvBx53fYuZK/oLTu5RJoXogjk6x7Q7sz1GNRsXWjn6SwyJm8E/oMjNVwPhmNdIjwP135Q==", + "optional": true + }, + "@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.20.0.tgz", + "integrity": "sha512-yAMvqhPfGKsAxHN8I4+jE0CpLWD8cv4z7CK7BMmhjDuz606Q2tFKkWRY8bHR9JQXYcoLfopo5TTqzxgPUjUMfw==", + "optional": true + }, + "@rollup/rollup-linux-riscv64-gnu": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.20.0.tgz", + "integrity": "sha512-qmuxFpfmi/2SUkAw95TtNq/w/I7Gpjurx609OOOV7U4vhvUhBcftcmXwl3rqAek+ADBwSjIC4IVNLiszoj3dPA==", + "optional": true + }, + "@rollup/rollup-linux-s390x-gnu": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.20.0.tgz", + "integrity": "sha512-I0BtGXddHSHjV1mqTNkgUZLnS3WtsqebAXv11D5BZE/gfw5KoyXSAXVqyJximQXNvNzUo4GKlCK/dIwXlz+jlg==", + "optional": true + }, + "@rollup/rollup-linux-x64-gnu": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.20.0.tgz", + "integrity": "sha512-y+eoL2I3iphUg9tN9GB6ku1FA8kOfmF4oUEWhztDJ4KXJy1agk/9+pejOuZkNFhRwHAOxMsBPLbXPd6mJiCwew==", + "optional": true + }, + "@rollup/rollup-linux-x64-musl": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.20.0.tgz", + "integrity": "sha512-hM3nhW40kBNYUkZb/r9k2FKK+/MnKglX7UYd4ZUy5DJs8/sMsIbqWK2piZtVGE3kcXVNj3B2IrUYROJMMCikNg==", + "optional": true + }, + "@rollup/rollup-win32-arm64-msvc": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.20.0.tgz", + "integrity": "sha512-psegMvP+Ik/Bg7QRJbv8w8PAytPA7Uo8fpFjXyCRHWm6Nt42L+JtoqH8eDQ5hRP7/XW2UiIriy1Z46jf0Oa1kA==", + "optional": true + }, + "@rollup/rollup-win32-ia32-msvc": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.20.0.tgz", + "integrity": "sha512-GabekH3w4lgAJpVxkk7hUzUf2hICSQO0a/BLFA11/RMxQT92MabKAqyubzDZmMOC/hcJNlc+rrypzNzYl4Dx7A==", + "optional": true + }, + "@rollup/rollup-win32-x64-msvc": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.20.0.tgz", + "integrity": "sha512-aJ1EJSuTdGnM6qbVC4B5DSmozPTqIag9fSzXRNNo+humQLG89XpPgdt16Ia56ORD7s+H8Pmyx44uczDQ0yDzpg==", + "optional": true + }, + "@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==" + }, + "@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "requires": { + "@sinonjs/commons": "^3.0.0" + } + }, + "@tanstack/query-core": { + "version": "5.51.21", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.51.21.tgz", + "integrity": "sha512-POQxm42IUp6n89kKWF4IZi18v3fxQWFRolvBA6phNVmA8psdfB1MvDnGacCJdS+EOX12w/CyHM62z//rHmYmvw==" + }, + "@tanstack/react-query": { + "version": "5.51.21", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.51.21.tgz", + "integrity": "sha512-Q/V81x3sAYgCsxjwOkfLXfrmoG+FmDhLeHH5okC/Bp8Aaw2c33lbEo/mMcMnkxUPVtB2FLpzHT0tq3c+OlZEbw==", + "requires": { + "@tanstack/query-core": "5.51.21" + } + }, + "@testing-library/dom": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", + "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.3.0", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "dom-accessibility-api": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@testing-library/jest-dom": { + "version": "6.4.8", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.4.8.tgz", + "integrity": "sha512-JD0G+Zc38f5MBHA4NgxQMR5XtO5Jx9g86jqturNTt2WUfRmLDIY7iKkWHDCCTiDuFMre6nxAD5wHw9W5kI4rGw==", + "dev": true, + "requires": { + "@adobe/css-tools": "^4.4.0", + "@babel/runtime": "^7.9.2", + "aria-query": "^5.0.0", + "chalk": "^3.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.6.3", + "lodash": "^4.17.21", + "redent": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@testing-library/react": { + "version": "15.0.7", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-15.0.7.tgz", + "integrity": "sha512-cg0RvEdD1TIhhkm1IeYMQxrzy0MtUNfa3minv4MjbgcYzJAZ7yD0i0lwoPOTPr+INtiXFezt2o8xMSnyHhEn2Q==", + "dev": true, + "requires": { + "@babel/runtime": "^7.12.5", + "@testing-library/dom": "^10.0.0", + "@types/react-dom": "^18.0.0" + } + }, + "@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true + }, + "@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "dev": true + }, + "@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, + "@tweenjs/tween.js": { + "version": "23.1.3", + "resolved": "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-23.1.3.tgz", + "integrity": "sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA==" + }, + "@types/aria-query": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", + "dev": true + }, + "@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "requires": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "@types/babel__generator": { + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@types/babel__traverse": { + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", + "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", + "dev": true, + "requires": { + "@babel/types": "^7.20.7" + } + }, + "@types/draco3d": { + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/@types/draco3d/-/draco3d-1.4.10.tgz", + "integrity": "sha512-AX22jp8Y7wwaBgAixaSvkoG4M/+PlAcm3Qs4OW8yT9DM4xUpWKeFhLueTAyZF39pviAdcDdeJoACapiAceqNcw==" + }, + "@types/echarts": { + "version": "4.9.22", + "resolved": "https://registry.npmjs.org/@types/echarts/-/echarts-4.9.22.tgz", + "integrity": "sha512-7Fo6XdWpoi8jxkwP7BARUOM7riq8bMhmsCtSG8gzUcJmFhLo387tihoBYS/y5j7jl3PENT5RxeWZdN9RiwO7HQ==", + "requires": { + "@types/zrender": "*" + } + }, + "@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" + }, + "@types/geojson": { + "version": "7946.0.14", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.14.tgz", + "integrity": "sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg==" + }, + "@types/geojson-vt": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/@types/geojson-vt/-/geojson-vt-3.2.5.tgz", + "integrity": "sha512-qDO7wqtprzlpe8FfQ//ClPV9xiuoh2nkIgiouIptON9w5jvD/fA4szvP9GBlDVdJ5dldAl0kX/sy3URbWwLx0g==", + "requires": { + "@types/geojson": "*" + } + }, + "@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==" + }, + "@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "@types/jest": { + "version": "29.5.12", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.12.tgz", + "integrity": "sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==", + "dev": true, + "requires": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + }, + "pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "requires": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + } + } + } + }, + "@types/jsdom": { + "version": "20.0.1", + "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-20.0.1.tgz", + "integrity": "sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/tough-cookie": "*", + "parse5": "^7.0.0" + } + }, + "@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true + }, + "@types/luxon": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.4.2.tgz", + "integrity": "sha512-TifLZlFudklWlMBfhubvgqTXRzLDI5pCbGa4P8a3wPyUQSW+1xQ5eDsreP9DWHX3tjq1ke96uYG/nwundroWcA==", + "dev": true + }, + "@types/mapbox__point-geometry": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@types/mapbox__point-geometry/-/mapbox__point-geometry-0.1.4.tgz", + "integrity": "sha512-mUWlSxAmYLfwnRBmgYV86tgYmMIICX4kza8YnE/eIlywGe2XoOxlpVnXWwir92xRLjwyarqwpu2EJKD2pk0IUA==" + }, + "@types/mapbox__vector-tile": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@types/mapbox__vector-tile/-/mapbox__vector-tile-1.3.4.tgz", + "integrity": "sha512-bpd8dRn9pr6xKvuEBQup8pwQfD4VUyqO/2deGjfpe6AwC8YRlyEipvefyRJUSiCJTZuCb8Pl1ciVV5ekqJ96Bg==", + "requires": { + "@types/geojson": "*", + "@types/mapbox__point-geometry": "*", + "@types/pbf": "*" + } + }, + "@types/node": { + "version": "20.14.14", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.14.tgz", + "integrity": "sha512-d64f00982fS9YoOgJkAMolK7MN8Iq3TDdVjchbYHdEmjth/DHowx82GnoA+tVUAN+7vxfYUgAzi+JXbKNd2SDQ==", + "requires": { + "undici-types": "~5.26.4" + } + }, + "@types/offscreencanvas": { + "version": "2019.7.3", + "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.7.3.tgz", + "integrity": "sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==" + }, + "@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==" + }, + "@types/pbf": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/pbf/-/pbf-3.0.5.tgz", + "integrity": "sha512-j3pOPiEcWZ34R6a6mN07mUkM4o4Lwf6hPNt8eilOeZhTFbxFXmKhvXl9Y28jotFPaI1bpPDJsbCprUoNke6OrA==" + }, + "@types/prop-types": { + "version": "15.7.12", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", + "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==" + }, + "@types/react": { + "version": "18.3.3", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz", + "integrity": "sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==", + "requires": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "@types/react-dom": { + "version": "18.3.0", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz", + "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==", + "dev": true, + "requires": { + "@types/react": "*" + } + }, + "@types/react-reconciler": { + "version": "0.26.7", + "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.26.7.tgz", + "integrity": "sha512-mBDYl8x+oyPX/VBb3E638N0B7xG+SPk/EAMcVPeexqus/5aTpTphQi0curhhshOqRrc9t6OPoJfEUkbymse/lQ==", + "requires": { + "@types/react": "*" + } + }, + "@types/react-transition-group": { + "version": "4.4.10", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.10.tgz", + "integrity": "sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==", + "requires": { + "@types/react": "*" + } + }, + "@types/semver": { + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", + "dev": true + }, + "@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true + }, + "@types/stats.js": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@types/stats.js/-/stats.js-0.17.3.tgz", + "integrity": "sha512-pXNfAD3KHOdif9EQXZ9deK82HVNaXP5ZIF5RP2QG6OQFNTaY2YIetfrE9t528vEreGQvEPRDDc8muaoYeK0SxQ==" + }, + "@types/supercluster": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@types/supercluster/-/supercluster-7.1.3.tgz", + "integrity": "sha512-Z0pOY34GDFl3Q6hUFYf3HkTwKEE02e7QgtJppBt+beEAxnyOpJua+voGFvxINBHa06GwLFFym7gRPY2SiKIfIA==", + "requires": { + "@types/geojson": "*" + } + }, + "@types/three": { + "version": "0.167.1", + "resolved": "https://registry.npmjs.org/@types/three/-/three-0.167.1.tgz", + "integrity": "sha512-OCd2Uv/8/4TbmSaIRFawrCOnDMLdpaa+QGJdhlUBmdfbHjLY8k6uFc0tde2/UvcaHQ6NtLl28onj/vJfofV+Tg==", + "peer": true, + "requires": { + "@tweenjs/tween.js": "~23.1.2", + "@types/stats.js": "*", + "@types/webxr": "*", + "fflate": "~0.8.2", + "meshoptimizer": "~0.18.1" + } + }, + "@types/tough-cookie": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", + "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", + "dev": true + }, + "@types/webxr": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.19.tgz", + "integrity": "sha512-4hxA+NwohSgImdTSlPXEqDqqFktNgmTXQ05ff1uWam05tNGroCMp4G+4XVl6qWm1p7GQ/9oD41kAYsSssF6Mzw==" + }, + "@types/yargs": { + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==" + }, + "@types/zrender": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@types/zrender/-/zrender-4.0.6.tgz", + "integrity": "sha512-1jZ9bJn2BsfmYFPBHtl5o3uV+ILejAtGrDcYSpT4qaVKEI/0YY+arw3XHU04Ebd8Nca3SQ7uNcLaqiL+tTFVMg==" + }, + "@typescript-eslint/eslint-plugin": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.2.0.tgz", + "integrity": "sha512-mdekAHOqS9UjlmyF/LSs6AIEvfceV749GFxoBAjwAv0nkevfKHWQFDMcBZWUiIC5ft6ePWivXoS36aKQ0Cy3sw==", + "dev": true, + "requires": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "7.2.0", + "@typescript-eslint/type-utils": "7.2.0", + "@typescript-eslint/utils": "7.2.0", + "@typescript-eslint/visitor-keys": "7.2.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + } + }, + "@typescript-eslint/parser": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.2.0.tgz", + "integrity": "sha512-5FKsVcHTk6TafQKQbuIVkXq58Fnbkd2wDL4LB7AURN7RUOu1utVP+G8+6u3ZhEroW3DF6hyo3ZEXxgKgp4KeCg==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "7.2.0", + "@typescript-eslint/types": "7.2.0", + "@typescript-eslint/typescript-estree": "7.2.0", + "@typescript-eslint/visitor-keys": "7.2.0", + "debug": "^4.3.4" + } + }, + "@typescript-eslint/scope-manager": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.2.0.tgz", + "integrity": "sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "7.2.0", + "@typescript-eslint/visitor-keys": "7.2.0" + } + }, + "@typescript-eslint/type-utils": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.2.0.tgz", + "integrity": "sha512-xHi51adBHo9O9330J8GQYQwrKBqbIPJGZZVQTHHmy200hvkLZFWJIFtAG/7IYTWUyun6DE6w5InDReePJYJlJA==", + "dev": true, + "requires": { + "@typescript-eslint/typescript-estree": "7.2.0", + "@typescript-eslint/utils": "7.2.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + } + }, + "@typescript-eslint/types": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.2.0.tgz", + "integrity": "sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.2.0.tgz", + "integrity": "sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "7.2.0", + "@typescript-eslint/visitor-keys": "7.2.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + } + }, + "@typescript-eslint/utils": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.2.0.tgz", + "integrity": "sha512-YfHpnMAGb1Eekpm3XRK8hcMwGLGsnT6L+7b2XyRv6ouDuJU1tZir1GS2i0+VXRatMwSI1/UfcyPe53ADkU+IuA==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "7.2.0", + "@typescript-eslint/types": "7.2.0", + "@typescript-eslint/typescript-estree": "7.2.0", + "semver": "^7.5.4" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.2.0.tgz", + "integrity": "sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A==", + "dev": true, + "requires": { + "@typescript-eslint/types": "7.2.0", + "eslint-visitor-keys": "^3.4.1" + } + }, + "@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, + "@use-gesture/core": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/@use-gesture/core/-/core-10.3.1.tgz", + "integrity": "sha512-WcINiDt8WjqBdUXye25anHiNxPc0VOrlT8F6LLkU6cycrOGUDyY/yyFmsg3k8i5OLvv25llc0QC45GhR/C8llw==" + }, + "@use-gesture/react": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/@use-gesture/react/-/react-10.3.1.tgz", + "integrity": "sha512-Yy19y6O2GJq8f7CHf7L0nxL8bf4PZCPaVOCgJrusOeFHY1LvHgYXnmnXg6N5iwAnbgbZCDjo60SiM6IPJi9C5g==", + "requires": { + "@use-gesture/core": "10.3.1" + } + }, + "@vitejs/plugin-react": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.1.tgz", + "integrity": "sha512-m/V2syj5CuVnaxcUJOQRel/Wr31FFXRFlnOoq1TVtkCxsY5veGMTEmpWHndrhB2U8ScHtCQB1e+4hWYExQc6Lg==", + "dev": true, + "requires": { + "@babel/core": "^7.24.5", + "@babel/plugin-transform-react-jsx-self": "^7.24.5", + "@babel/plugin-transform-react-jsx-source": "^7.24.1", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.14.2" + } + }, + "abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "dev": true + }, + "acorn": { + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "dev": true + }, + "acorn-globals": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz", + "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==", + "dev": true, + "requires": { + "acorn": "^8.1.0", + "acorn-walk": "^8.0.2" + } + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "requires": {} + }, + "acorn-walk": { + "version": "8.3.3", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.3.tgz", + "integrity": "sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==", + "dev": true, + "requires": { + "acorn": "^8.11.0" + } + }, + "ag-grid-community": { + "version": "31.3.4", + "resolved": "https://registry.npmjs.org/ag-grid-community/-/ag-grid-community-31.3.4.tgz", + "integrity": "sha512-jOxQO86C6eLnk1GdP24HB6aqaouFzMWizgfUwNY5MnetiWzz9ZaAmOGSnW/XBvdjXvC5Fpk3gSbvVKKQ7h9kBw==" + }, + "ag-grid-react": { + "version": "31.3.4", + "resolved": "https://registry.npmjs.org/ag-grid-react/-/ag-grid-react-31.3.4.tgz", + "integrity": "sha512-WmPASHRFGSTxCMRStWG5bRtln0Ugsdqbb3+Y8sEyGHeLw4hXqfpqie3lT9kqCOl7wPWUjCpwmFdXzRnWPmyyeg==", + "requires": { + "ag-grid-community": "31.3.4", + "prop-types": "^15.8.1" + } + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "requires": { + "debug": "4" + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "requires": { + "type-fest": "^0.21.3" + } + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dev": true, + "requires": { + "dequal": "^2.0.3" + } + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==" + }, + "array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dev": true, + "requires": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + } + }, + "array-includes": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "is-string": "^1.0.7" + } + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "array.prototype.findlastindex": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", + "dev": true, + "requires": { + "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.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + } + }, + "array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + } + }, + "arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dev": true, + "requires": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + } + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==" + }, + "async": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "requires": { + "possible-typed-array-names": "^1.0.0" + } + }, + "babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "dev": true, + "requires": { + "@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" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "requires": { + "@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" + }, + "dependencies": { + "istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "requires": { + "@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" + } + }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "dev": true, + "requires": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + } + }, + "babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "requires": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + } + }, + "babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "requires": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@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-top-level-await": "^7.8.3" + } + }, + "babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "dev": true, + "requires": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "bidi-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz", + "integrity": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==", + "requires": { + "require-from-string": "^2.0.2" + } + }, + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "requires": { + "fill-range": "^7.1.1" + } + }, + "browserslist": { + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", + "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001646", + "electron-to-chromium": "^1.5.4", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" + } + }, + "bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "requires": { + "fast-json-stable-stringify": "2.x" + } + }, + "bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "requires": { + "node-int64": "^0.4.0" + } + }, + "buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "bytewise": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/bytewise/-/bytewise-1.1.0.tgz", + "integrity": "sha512-rHuuseJ9iQ0na6UDhnrRVDh8YnWVlU6xM3VH6q/+yHDeUH2zIhUzP+2/h3LIrhLDBtTqzWpE3p3tP/boefskKQ==", + "requires": { + "bytewise-core": "^1.2.2", + "typewise": "^1.0.3" + } + }, + "bytewise-core": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/bytewise-core/-/bytewise-core-1.2.3.tgz", + "integrity": "sha512-nZD//kc78OOxeYtRlVk8/zXqTB4gf/nlguL1ggWA8FuchMyOxcyHR4QPQZMUmA7czC+YnaBrPUCubqAWe50DaA==", + "requires": { + "typewise-core": "^1.2" + } + }, + "call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dev": true, + "requires": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "camera-controls": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/camera-controls/-/camera-controls-2.8.5.tgz", + "integrity": "sha512-7VTwRk7Nu1nRKsY7bEt9HVBfKt8DETvzyYhLN4OW26OByBayMDB5fUaNcPI+z++vG23RH5yqn6ZRhZcgLQy2rA==", + "requires": {} + }, + "caniuse-lite": { + "version": "1.0.30001649", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001649.tgz", + "integrity": "sha512-fJegqZZ0ZX8HOWr6rcafGr72+xcgJKI9oWfDW5DrD7ExUtgZC7a7R7ZYmZqplh7XDocFdGeIFn7roAxhOeYrPQ==", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" + } + } + }, + "char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true + }, + "ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==" + }, + "cjs-module-lexer": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz", + "integrity": "sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==", + "dev": true + }, + "cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + } + }, + "clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==" + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true + }, + "collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "dev": true + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + }, + "cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + } + }, + "create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "requires": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "requires": { + "cross-spawn": "^7.0.1" + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", + "dev": true + }, + "cssom": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", + "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", + "dev": true + }, + "cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "requires": { + "cssom": "~0.3.6" + }, + "dependencies": { + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + } + } + }, + "csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + }, + "data-urls": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", + "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", + "dev": true, + "requires": { + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0" + } + }, + "data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dev": true, + "requires": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + } + }, + "data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + } + }, + "data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "requires": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + } + }, + "debounce": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", + "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==" + }, + "debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "requires": { + "ms": "2.1.2" + } + }, + "decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", + "dev": true + }, + "dedent": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", + "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", + "dev": true, + "requires": {} + }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true + }, + "define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "requires": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + } + }, + "define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "requires": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true + }, + "dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true + }, + "detect-gpu": { + "version": "5.0.42", + "resolved": "https://registry.npmjs.org/detect-gpu/-/detect-gpu-5.0.42.tgz", + "integrity": "sha512-Vdhe87ZNhxIS+OGesy9DOx8P3YBbCBapoomGR9kH26HuDAZ6c0FohsrK47j9efL972kLCaD22EbNUYHVLkqx/w==", + "requires": { + "webgl-constants": "^1.1.1" + } + }, + "detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true + }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, + "diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "dom-accessibility-api": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", + "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", + "dev": true + }, + "dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "requires": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "domexception": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", + "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", + "dev": true, + "requires": { + "webidl-conversions": "^7.0.0" + } + }, + "draco3d": { + "version": "1.5.7", + "resolved": "https://registry.npmjs.org/draco3d/-/draco3d-1.5.7.tgz", + "integrity": "sha512-m6WCKt/erDXcw+70IJXnG7M3awwQPAsZvJGX5zY7beBqpELw6RDGkYVU0W43AFxye4pDZ5i2Lbyc/NNGqwjUVQ==" + }, + "earcut": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/earcut/-/earcut-3.0.0.tgz", + "integrity": "sha512-41Fs7Q/PLq1SDbqjsgcY7GA42T0jvaCNGXgGtsNdvg+Yv8eIu06bxv4/PoREkZ9nMDNwnUSG9OFB9+yv8eKhDg==" + }, + "echarts": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/echarts/-/echarts-5.5.1.tgz", + "integrity": "sha512-Fce8upazaAXUVUVsjgV6mBnGuqgO+JNDlcgF79Dksy4+wgGpQB2lmYoO4TSweFg/mZITdpGHomw/cNBJZj1icA==", + "requires": { + "tslib": "2.3.0", + "zrender": "5.6.0" + } + }, + "echarts-for-react": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/echarts-for-react/-/echarts-for-react-3.0.2.tgz", + "integrity": "sha512-DRwIiTzx8JfwPOVgGttDytBqdp5VzCSyMRIxubgU/g2n9y3VLUmF2FK7Icmg/sNVkv4+rktmrLN9w22U2yy3fA==", + "requires": { + "fast-deep-equal": "^3.1.3", + "size-sensor": "^1.0.1" + } + }, + "ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "dev": true, + "requires": { + "jake": "^10.8.5" + } + }, + "electron-to-chromium": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.5.tgz", + "integrity": "sha512-QR7/A7ZkMS8tZuoftC/jfqNkZLQO779SSW3YuZHP4eXpj3EffGLFcB/Xu9AAZQzLccTiCV+EmUo3ha4mQ9wnlA==", + "dev": true + }, + "emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "dev": true, + "requires": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.3", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.15" + } + }, + "es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.2.4" + } + }, + "es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true + }, + "es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "requires": { + "es-errors": "^1.3.0" + } + }, + "es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + } + }, + "es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dev": true, + "requires": { + "hasown": "^2.0.0" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "requires": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "dev": true + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" + }, + "escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, + "requires": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + } + } + }, + "eslint": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", + "@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" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + } + } + }, + "eslint-config-prettier": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", + "dev": true, + "requires": {} + }, + "eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "requires": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "eslint-module-utils": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", + "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", + "dev": true, + "requires": { + "debug": "^3.2.7" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "eslint-plugin-import": { + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", + "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", + "dev": true, + "requires": { + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.8.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", + "semver": "^6.3.1", + "tsconfig-paths": "^3.15.0" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "eslint-plugin-prettier": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.1.tgz", + "integrity": "sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==", + "dev": true, + "requires": { + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.9.1" + } + }, + "eslint-plugin-react-hooks": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", + "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", + "dev": true, + "requires": {} + }, + "eslint-plugin-react-refresh": { + "version": "0.4.9", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.9.tgz", + "integrity": "sha512-QK49YrBAo5CLNLseZ7sZgvgTy21E6NEw22eZqc4teZfH8pxV3yXc9XXOYfUI6JNpw7mfHNkAeWtBxrTyykB6HA==", + "dev": true, + "requires": {} + }, + "eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true + }, + "espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "requires": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true + }, + "expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dev": true, + "requires": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true + }, + "fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "requires": { + "bser": "2.1.1" + } + }, + "fflate": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", + "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==" + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dev": true, + "requires": { + "minimatch": "^5.0.1" + }, + "dependencies": { + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "requires": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true + }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "requires": { + "is-callable": "^1.1.3" + } + }, + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "optional": true + }, + "function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" + }, + "function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + } + }, + "functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true + }, + "geojson-vt": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/geojson-vt/-/geojson-vt-4.0.2.tgz", + "integrity": "sha512-AV9ROqlNqoZEIJGfm1ncNjEXfkz2hdFlZf0qkVfmkwdKa8vj7H16YUOT81rJw1rdFhyEDlN2Tds91p/glzbl5A==" + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dev": true, + "requires": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + } + }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" + }, + "get-symbol-description": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "dev": true, + "requires": { + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==" + }, + "gl-matrix": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.4.3.tgz", + "integrity": "sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "requires": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "dependencies": { + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" + }, + "globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "requires": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + } + }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + } + }, + "glsl-noise": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/glsl-noise/-/glsl-noise-0.0.0.tgz", + "integrity": "sha512-b/ZCF6amfAUb7dJM/MxRs7AetQEahYzJ8PtgfrmEdtw6uyGOr+ZSGtgjFm6mfsBkxJ4d2W7kg+Nlqzqvn3Bc0w==" + }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.3" + } + }, + "graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "harmony-reflect": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", + "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==", + "dev": true + }, + "has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" + }, + "has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "requires": { + "es-define-property": "^1.0.0" + } + }, + "has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "dev": true + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true + }, + "has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.3" + } + }, + "hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "requires": { + "function-bind": "^1.1.2" + } + }, + "hls.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/hls.js/-/hls.js-1.3.5.tgz", + "integrity": "sha512-uybAvKS6uDe0MnWNEPnO0krWVr+8m2R0hJ/viql8H3MVK+itq8gGQuIYoFHL3rECkIpNH98Lw8YuuWMKZxp3Ew==" + }, + "hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "requires": { + "react-is": "^16.7.0" + }, + "dependencies": { + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + } + } + }, + "html-encoding-sniffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "dev": true, + "requires": { + "whatwg-encoding": "^2.0.0" + } + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "requires": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + } + }, + "https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true + }, + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, + "identity-obj-proxy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", + "integrity": "sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==", + "dev": true, + "requires": { + "harmony-reflect": "^1.4.6" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, + "ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "dev": true + }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "dev": true, + "requires": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "internal-slot": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "dev": true, + "requires": { + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + } + }, + "is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "requires": { + "has-bigints": "^1.0.1" + } + }, + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true + }, + "is-core-module": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.0.tgz", + "integrity": "sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==", + "requires": { + "hasown": "^2.0.2" + } + }, + "is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dev": true, + "requires": { + "is-typed-array": "^1.1.13" + } + }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==" + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true + }, + "is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "requires": { + "isobject": "^3.0.1" + } + }, + "is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true + }, + "is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" + }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-shared-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "dev": true, + "requires": { + "call-bind": "^1.0.7" + } + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dev": true, + "requires": { + "which-typed-array": "^1.1.14" + } + }, + "is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==" + }, + "istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "dev": true, + "requires": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + } + }, + "istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "istanbul-reports": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "its-fine": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/its-fine/-/its-fine-1.2.5.tgz", + "integrity": "sha512-fXtDA0X0t0eBYAGLVM5YsgJGsJ5jEmqZEPrGbzdf5awjv0xE7nqv3TVnvtUF060Tkes15DbDAKW/I48vsb6SyA==", + "requires": { + "@types/react-reconciler": "^0.28.0" + }, + "dependencies": { + "@types/react-reconciler": { + "version": "0.28.8", + "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.28.8.tgz", + "integrity": "sha512-SN9c4kxXZonFhbX4hJrZy37yw9e7EIxcpHCxQv5JUS18wDE5ovkQKlqQEkufdJCCMfuI9BnjUJvhYeJ9x5Ra7g==", + "requires": { + "@types/react": "*" + } + } + } + }, + "jake": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", + "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", + "dev": true, + "requires": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "dev": true, + "requires": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + } + }, + "jest-changed-files": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "dev": true, + "requires": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + } + }, + "jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "dev": true, + "requires": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "requires": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + } + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "dev": true, + "requires": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "dev": true, + "requires": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "requires": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + } + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "requires": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + } + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "dev": true, + "requires": { + "detect-newline": "^3.0.0" + } + }, + "jest-each": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "requires": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "requires": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==" + } + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-environment-jsdom": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.7.0.tgz", + "integrity": "sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==", + "dev": true, + "requires": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/jsdom": "^20.0.0", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0", + "jsdom": "^20.0.0" + } + }, + "jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "dev": true, + "requires": { + "@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": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==" + }, + "jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, + "requires": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "fsevents": "^2.3.2", + "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" + } + }, + "jest-leak-detector": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "dev": true, + "requires": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + }, + "pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "requires": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + } + } + } + }, + "jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "requires": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + } + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, + "requires": { + "@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" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "requires": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + } + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "requires": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + } + }, + "jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "requires": {} + }, + "jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true + }, + "jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "dev": true, + "requires": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + } + }, + "jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "dev": true, + "requires": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "requires": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "dev": true, + "requires": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "requires": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + } + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "requires": { + "@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" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "dev": true, + "requires": { + "@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" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "requires": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + } + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "dev": true, + "requires": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "requires": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "js-sha1": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/js-sha1/-/js-sha1-0.7.0.tgz", + "integrity": "sha512-oQZ1Mo7440BfLSv9TX87VNEyU52pXPVG19F9PL3gTgNt0tVxlZ8F4O6yze3CLuLx28TxotxvlyepCNaaV0ZjMw==" + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "jsdom": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.3.tgz", + "integrity": "sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==", + "dev": true, + "requires": { + "abab": "^2.0.6", + "acorn": "^8.8.1", + "acorn-globals": "^7.0.0", + "cssom": "^0.5.0", + "cssstyle": "^2.3.0", + "data-urls": "^3.0.2", + "decimal.js": "^10.4.2", + "domexception": "^4.0.0", + "escodegen": "^2.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.2", + "parse5": "^7.1.1", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.2", + "w3c-xmlserializer": "^4.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0", + "ws": "^8.11.0", + "xml-name-validator": "^4.0.0" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" + }, + "json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "json-stringify-pretty-compact": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/json-stringify-pretty-compact/-/json-stringify-pretty-compact-4.0.0.tgz", + "integrity": "sha512-3CNZ2DnrpByG9Nqj6Xo8vqbjT4F6N+tb4Gb28ESAZjYZ5yqvmc56J+/kuIwkaAMOyblTQhUW7PxMkUb8Q36N3Q==" + }, + "json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true + }, + "kdbush": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/kdbush/-/kdbush-4.0.2.tgz", + "integrity": "sha512-WbCVYJ27Sz8zi9Q7Q0xHC+05iwkm3Znipc2XTlrnJbsHMYktW4hPhXUE8Ys1engBrvffoSCqbil1JQAa7clRpA==" + }, + "keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "requires": { + "json-buffer": "3.0.1" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + }, + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "requires": { + "immediate": "~3.0.5" + } + }, + "lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "luxon": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.5.0.tgz", + "integrity": "sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ==" + }, + "lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "dev": true + }, + "maath": { + "version": "0.10.8", + "resolved": "https://registry.npmjs.org/maath/-/maath-0.10.8.tgz", + "integrity": "sha512-tRvbDF0Pgqz+9XUa4jjfgAQ8/aPKmQdWXilFu2tMy4GWj4NOsx99HlULO4IeREfbO3a0sA145DZYyvXPkybm0g==", + "requires": {} + }, + "make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "requires": { + "semver": "^7.5.3" + } + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "requires": { + "tmpl": "1.0.5" + } + }, + "maplibre-gl": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/maplibre-gl/-/maplibre-gl-4.5.1.tgz", + "integrity": "sha512-pKFDK8ZU2atwZWC8gdPVhN7Bf5HIPgtA+IG/iQ7J6WgmqSwCSmylc5q3stahWqXfx9PYUwVNJITrp1Hw96SUiA==", + "requires": { + "@mapbox/geojson-rewind": "^0.5.2", + "@mapbox/jsonlint-lines-primitives": "^2.0.2", + "@mapbox/point-geometry": "^0.1.0", + "@mapbox/tiny-sdf": "^2.0.6", + "@mapbox/unitbezier": "^0.0.1", + "@mapbox/vector-tile": "^1.3.1", + "@mapbox/whoots-js": "^3.1.0", + "@maplibre/maplibre-gl-style-spec": "^20.3.0", + "@types/geojson": "^7946.0.14", + "@types/geojson-vt": "3.2.5", + "@types/mapbox__point-geometry": "^0.1.4", + "@types/mapbox__vector-tile": "^1.3.4", + "@types/pbf": "^3.0.5", + "@types/supercluster": "^7.1.3", + "earcut": "^3.0.0", + "geojson-vt": "^4.0.2", + "gl-matrix": "^3.4.3", + "global-prefix": "^3.0.0", + "kdbush": "^4.0.2", + "murmurhash-js": "^1.0.0", + "pbf": "^3.3.0", + "potpack": "^2.0.0", + "quickselect": "^3.0.0", + "supercluster": "^8.0.1", + "tinyqueue": "^3.0.0", + "vt-pbf": "^3.1.3" + } + }, + "memoize-one": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", + "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==" + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "meshline": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/meshline/-/meshline-3.3.1.tgz", + "integrity": "sha512-/TQj+JdZkeSUOl5Mk2J7eLcYTLiQm2IDzmlSvYm7ov15anEcDJ92GHqqazxTSreeNgfnYu24kiEvvv0WlbCdFQ==", + "requires": {} + }, + "meshoptimizer": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/meshoptimizer/-/meshoptimizer-0.18.1.tgz", + "integrity": "sha512-ZhoIoL7TNV4s5B6+rx5mC//fw8/POGyNxS/DZyCJeiZ12ScLfVwRE/GfsxwiTkMYYD5DmK2/JXnEVXqL4rF+Sw==" + }, + "micromatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", + "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "dev": true, + "requires": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + } + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "requires": { + "mime-db": "1.52.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true + }, + "minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "murmurhash-js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/murmurhash-js/-/murmurhash-js-1.0.0.tgz", + "integrity": "sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw==" + }, + "nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==" + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node-releases": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", + "dev": true + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "nwsapi": { + "version": "2.2.12", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.12.tgz", + "integrity": "sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" + }, + "object-inspect": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + } + }, + "object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + } + }, + "object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + } + }, + "object.values": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "requires": { + "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" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dev": true, + "requires": { + "entities": "^4.4.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" + }, + "pbf": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/pbf/-/pbf-3.3.0.tgz", + "integrity": "sha512-XDF38WCH3z5OV/OVa8GKUNtLAyneuzbCisx7QUCF8Q6Nutx0WnJrQe5O+kOtBlLfRNUws98Y58Lblp+NJG5T4Q==", + "requires": { + "ieee754": "^1.1.12", + "resolve-protobuf-schema": "^2.1.0" + } + }, + "picocolors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + }, + "pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + } + } + }, + "playwright": { + "version": "1.46.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.46.0.tgz", + "integrity": "sha512-XYJ5WvfefWONh1uPAUAi0H2xXV5S3vrtcnXe6uAOgdGi3aSpqOSXX08IAjXW34xitfuOJsvXU5anXZxPSEQiJw==", + "dev": true, + "requires": { + "fsevents": "2.3.2", + "playwright-core": "1.46.0" + }, + "dependencies": { + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + } + } + }, + "playwright-core": { + "version": "1.46.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.46.0.tgz", + "integrity": "sha512-9Y/d5UIwuJk8t3+lhmMSAJyNP1BUC/DqP3cQJDQQL/oWqAiuPTLgy7Q5dzglmTLwcBRdetzgNM/gni7ckfTr6A==", + "dev": true + }, + "possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true + }, + "postcss": { + "version": "8.4.41", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz", + "integrity": "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==", + "requires": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.1", + "source-map-js": "^1.2.0" + } + }, + "potpack": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/potpack/-/potpack-2.0.0.tgz", + "integrity": "sha512-Q+/tYsFU9r7xoOJ+y/ZTtdVQwTWfzjbiXBDMM/JKUux3+QPP02iUuIoeBQ+Ot6oEDlC+/PGjB/5A3K7KKb7hcw==" + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "prettier": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", + "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==" + }, + "prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "requires": { + "fast-diff": "^1.1.2" + } + }, + "pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + }, + "react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true + } + } + }, + "promise-worker-transferable": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/promise-worker-transferable/-/promise-worker-transferable-1.0.4.tgz", + "integrity": "sha512-bN+0ehEnrXfxV2ZQvU2PetO0n4gqBD4ulq3MI1WOPLgr7/Mg9yRQkX5+0v1vagr74ZTsl7XtzlaYDo2EuCeYJw==", + "requires": { + "is-promise": "^2.1.0", + "lie": "^3.0.2" + } + }, + "prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + } + }, + "prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + }, + "dependencies": { + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + } + } + }, + "protocol-buffers-schema": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz", + "integrity": "sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw==" + }, + "psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true + }, + "punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true + }, + "pure-rand": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "dev": true + }, + "querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "quickselect": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-3.0.0.tgz", + "integrity": "sha512-XdjUArbK4Bm5fLLvlm5KpTFOiOThgfWWI4axAZDWg4E/0mKdZyI9tNEfds27qCi1ze/vwTR16kvmmGhRra3c2g==" + }, + "react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "requires": { + "loose-envify": "^1.1.0" + } + }, + "react-composer": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/react-composer/-/react-composer-5.0.3.tgz", + "integrity": "sha512-1uWd07EME6XZvMfapwZmc7NgCZqDemcvicRi3wMJzXsQLvZ3L7fTHVyPy1bZdnWXM4iPjYuNE+uJ41MLKeTtnA==", + "requires": { + "prop-types": "^15.6.0" + } + }, + "react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "requires": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "dependencies": { + "scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "requires": { + "loose-envify": "^1.1.0" + } + } + } + }, + "react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" + }, + "react-reconciler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.27.0.tgz", + "integrity": "sha512-HmMDKciQjYmBRGuuhIaKA1ba/7a+UsM5FzOZsMO2JYHt9Jh8reCb7j1eDC95NOyUlKM9KRyvdx0flBuDvYSBoA==", + "requires": { + "loose-envify": "^1.1.0", + "scheduler": "^0.21.0" + } + }, + "react-refresh": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", + "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", + "dev": true + }, + "react-router": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.26.0.tgz", + "integrity": "sha512-wVQq0/iFYd3iZ9H2l3N3k4PL8EEHcb0XlU2Na8nEwmiXgIUElEH6gaJDtUQxJ+JFzmIXaQjfdpcGWaM6IoQGxg==", + "requires": { + "@remix-run/router": "1.19.0" + } + }, + "react-router-dom": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.26.0.tgz", + "integrity": "sha512-RRGUIiDtLrkX3uYcFiCIxKFWMcWQGMojpYZfcstc63A1+sSnVgILGIm9gNUA6na3Fm1QuPGSBQH2EMbAZOnMsQ==", + "requires": { + "@remix-run/router": "1.19.0", + "react-router": "6.26.0" + } + }, + "react-select": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/react-select/-/react-select-5.8.0.tgz", + "integrity": "sha512-TfjLDo58XrhP6VG5M/Mi56Us0Yt8X7xD6cDybC7yoRMUNm7BGO7qk8J0TLQOua/prb8vUOtsfnXZwfm30HGsAA==", + "requires": { + "@babel/runtime": "^7.12.0", + "@emotion/cache": "^11.4.0", + "@emotion/react": "^11.8.1", + "@floating-ui/dom": "^1.0.1", + "@types/react-transition-group": "^4.4.0", + "memoize-one": "^6.0.0", + "prop-types": "^15.6.0", + "react-transition-group": "^4.3.0", + "use-isomorphic-layout-effect": "^1.1.2" + } + }, + "react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "requires": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + } + }, + "react-use-measure": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/react-use-measure/-/react-use-measure-2.1.1.tgz", + "integrity": "sha512-nocZhN26cproIiIduswYpV5y5lQpSQS1y/4KuvUCjSKmw7ZWIS/+g3aFnX3WdBkyuGUtTLif3UTqnLLhbDoQig==", + "requires": { + "debounce": "^1.2.1" + } + }, + "redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "requires": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + } + }, + "regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + }, + "regexp.prototype.flags": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "dev": true, + "requires": { + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, + "resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "requires": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "requires": { + "resolve-from": "^5.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" + }, + "resolve-protobuf-schema": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz", + "integrity": "sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==", + "requires": { + "protocol-buffers-schema": "^3.3.1" + } + }, + "resolve.exports": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "rollup": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.20.0.tgz", + "integrity": "sha512-6rbWBChcnSGzIlXeIdNIZTopKYad8ZG8ajhl78lGRLsI2rX8IkaotQhVas2Ma+GPxJav19wrSzvRvuiv0YKzWw==", + "requires": { + "@rollup/rollup-android-arm-eabi": "4.20.0", + "@rollup/rollup-android-arm64": "4.20.0", + "@rollup/rollup-darwin-arm64": "4.20.0", + "@rollup/rollup-darwin-x64": "4.20.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.20.0", + "@rollup/rollup-linux-arm-musleabihf": "4.20.0", + "@rollup/rollup-linux-arm64-gnu": "4.20.0", + "@rollup/rollup-linux-arm64-musl": "4.20.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.20.0", + "@rollup/rollup-linux-riscv64-gnu": "4.20.0", + "@rollup/rollup-linux-s390x-gnu": "4.20.0", + "@rollup/rollup-linux-x64-gnu": "4.20.0", + "@rollup/rollup-linux-x64-musl": "4.20.0", + "@rollup/rollup-win32-arm64-msvc": "4.20.0", + "@rollup/rollup-win32-ia32-msvc": "4.20.0", + "@rollup/rollup-win32-x64-msvc": "4.20.0", + "@types/estree": "1.0.5", + "fsevents": "~2.3.2" + } + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" + }, + "safe-array-concat": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + } + }, + "safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "dev": true, + "requires": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "requires": { + "xmlchars": "^2.2.0" + } + }, + "scheduler": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.21.0.tgz", + "integrity": "sha512-1r87x5fz9MXqswA2ERLo0EbOAU74DpIUO090gIasYTqlVoJeMcl+Z1Rg7WHz+qtPujhS/hGIt9kxZOYBV3faRQ==", + "requires": { + "loose-envify": "^1.1.0" + } + }, + "semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true + }, + "set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "requires": { + "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": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "requires": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + } + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + }, + "side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + } + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "size-sensor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/size-sensor/-/size-sensor-1.0.2.tgz", + "integrity": "sha512-2NCmWxY7A9pYKGXNBfteo4hy14gWu47rg5692peVMst6lQLPKrVjhY+UTEsPI5ceFRJSl3gVgMYaUi/hKuaiKw==" + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "sort-asc": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/sort-asc/-/sort-asc-0.2.0.tgz", + "integrity": "sha512-umMGhjPeHAI6YjABoSTrFp2zaBtXBej1a0yKkuMUyjjqu6FJsTF+JYwCswWDg+zJfk/5npWUUbd33HH/WLzpaA==" + }, + "sort-desc": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/sort-desc/-/sort-desc-0.2.0.tgz", + "integrity": "sha512-NqZqyvL4VPW+RAxxXnB8gvE1kyikh8+pR+T+CXLksVRN9eiQqkQlPwqWYU0mF9Jm7UnctShlxLyAt1CaBOTL1w==" + }, + "sort-object": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sort-object/-/sort-object-3.0.3.tgz", + "integrity": "sha512-nK7WOY8jik6zaG9CRwZTaD5O7ETWDLZYMM12pqY8htll+7dYeqGfEUPcUBHOpSJg2vJOrvFIY2Dl5cX2ih1hAQ==", + "requires": { + "bytewise": "^1.1.0", + "get-value": "^2.0.2", + "is-extendable": "^0.1.1", + "sort-asc": "^0.2.0", + "sort-desc": "^0.2.0", + "union-value": "^1.0.1" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==" + }, + "source-map-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==" + }, + "source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "requires": { + "extend-shallow": "^3.0.0" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "requires": { + "escape-string-regexp": "^2.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true + } + } + }, + "stats-gl": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/stats-gl/-/stats-gl-2.2.8.tgz", + "integrity": "sha512-94G5nZvduDmzxBS7K0lYnynYwreZpkknD8g5dZmU6mpwIhy3caCrjAm11Qm1cbyx7mqix7Fp00RkbsonzKWnoQ==", + "requires": { + "@types/three": "^0.163.0" + }, + "dependencies": { + "@types/three": { + "version": "0.163.0", + "resolved": "https://registry.npmjs.org/@types/three/-/three-0.163.0.tgz", + "integrity": "sha512-uIdDhsXRpQiBUkflBS/i1l3JX14fW6Ot9csed60nfbZNXHDTRsnV2xnTVwXcgbvTiboAR4IW+t+lTL5f1rqIqA==", + "requires": { + "@tweenjs/tween.js": "~23.1.1", + "@types/stats.js": "*", + "@types/webxr": "*", + "fflate": "~0.8.2", + "meshoptimizer": "~0.18.1" + } + } + } + }, + "stats.js": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/stats.js/-/stats.js-0.17.0.tgz", + "integrity": "sha512-hNKz8phvYLPEcRkeG1rsGmV5ChMjKDAWU7/OJJdDErPBNChQXxCo3WZurGpnWc6gZhAzEPFad1aVgyOANH1sMw==" + }, + "string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "requires": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + } + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "string.prototype.trim": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" + } + }, + "string.prototype.trimend": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + } + }, + "string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, + "strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "requires": { + "min-indent": "^1.0.0" + } + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" + }, + "supercluster": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/supercluster/-/supercluster-8.0.1.tgz", + "integrity": "sha512-IiOea5kJ9iqzD2t7QJq/cREyLHTtSmUT6gQsweojg9WH2sYJqZK9SswTu6jrscO6D1G5v5vYZ9ru/eq85lXeZQ==", + "requires": { + "kdbush": "^4.0.2" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "suspend-react": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/suspend-react/-/suspend-react-0.1.3.tgz", + "integrity": "sha512-aqldKgX9aZqpoDp3e8/BZ8Dm7x1pJl+qI3ZKxDN0i/IQTWUwBx/ManmlVJ3wowqbno6c2bmiIfs+Um6LbsjJyQ==", + "requires": {} + }, + "symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, + "synckit": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.1.tgz", + "integrity": "sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==", + "dev": true, + "requires": { + "@pkgr/core": "^0.1.0", + "tslib": "^2.6.2" + }, + "dependencies": { + "tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", + "dev": true + } + } + }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "three": { + "version": "0.167.1", + "resolved": "https://registry.npmjs.org/three/-/three-0.167.1.tgz", + "integrity": "sha512-gYTLJA/UQip6J/tJvl91YYqlZF47+D/kxiWrbTon35ZHlXEN0VOo+Qke2walF1/x92v55H6enomymg4Dak52kw==" + }, + "three-mesh-bvh": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/three-mesh-bvh/-/three-mesh-bvh-0.7.6.tgz", + "integrity": "sha512-rCjsnxEqR9r1/C/lCqzGLS67NDty/S/eT6rAJfDvsanrIctTWdNoR4ZOGWewCB13h1QkVo2BpmC0wakj1+0m8A==", + "requires": {} + }, + "three-stdlib": { + "version": "2.32.1", + "resolved": "https://registry.npmjs.org/three-stdlib/-/three-stdlib-2.32.1.tgz", + "integrity": "sha512-ZgxxLAwtEaKkvfGP+hkW4s6IaDzif47evTdBPwVvdvLsOul3M6l0D4vO4/fzFguXT6FdoBlaTLhteOcn3uDzPg==", + "requires": { + "@types/draco3d": "^1.4.0", + "@types/offscreencanvas": "^2019.6.4", + "@types/webxr": "^0.5.2", + "draco3d": "^1.4.1", + "fflate": "^0.6.9", + "potpack": "^1.0.1" + }, + "dependencies": { + "fflate": { + "version": "0.6.10", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.6.10.tgz", + "integrity": "sha512-IQrh3lEPM93wVCEczc9SaAOvkmcoQn/G8Bo1e8ZPlY3X3bnAxWaBdvTdvM1hP62iZp0BXWDy4vTAy4fF0+Dlpg==" + }, + "potpack": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/potpack/-/potpack-1.0.2.tgz", + "integrity": "sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ==" + } + } + }, + "tinyqueue": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-3.0.0.tgz", + "integrity": "sha512-gRa9gwYU3ECmQYv3lslts5hxuIa90veaEcxDYuu3QGOIAEM2mOZkVHp48ANJuu1CURtRdHKUBY5Lm1tHV+sD4g==" + }, + "tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==" + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "tough-cookie": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", + "dev": true, + "requires": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + } + }, + "tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "dev": true, + "requires": { + "punycode": "^2.1.1" + } + }, + "troika-three-text": { + "version": "0.49.1", + "resolved": "https://registry.npmjs.org/troika-three-text/-/troika-three-text-0.49.1.tgz", + "integrity": "sha512-lXGWxgjJP9kw4i4Wh+0k0Q/7cRfS6iOME4knKht/KozPu9GcFA9NnNpRvehIhrUawq9B0ZRw+0oiFHgRO+4Wig==", + "requires": { + "bidi-js": "^1.0.2", + "troika-three-utils": "^0.49.0", + "troika-worker-utils": "^0.49.0", + "webgl-sdf-generator": "1.1.1" + } + }, + "troika-three-utils": { + "version": "0.49.0", + "resolved": "https://registry.npmjs.org/troika-three-utils/-/troika-three-utils-0.49.0.tgz", + "integrity": "sha512-umitFL4cT+Fm/uONmaQEq4oZlyRHWwVClaS6ZrdcueRvwc2w+cpNQ47LlJKJswpqtMFWbEhOLy0TekmcPZOdYA==", + "requires": {} + }, + "troika-worker-utils": { + "version": "0.49.0", + "resolved": "https://registry.npmjs.org/troika-worker-utils/-/troika-worker-utils-0.49.0.tgz", + "integrity": "sha512-1xZHoJrG0HFfCvT/iyN41DvI/nRykiBtHqFkGaGgJwq5iXfIZFBiPPEHFpPpgyKM3Oo5ITHXP5wM2TNQszYdVg==" + }, + "ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "dev": true, + "requires": {} + }, + "ts-jest": { + "version": "29.2.4", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.2.4.tgz", + "integrity": "sha512-3d6tgDyhCI29HlpwIq87sNuI+3Q6GLTTCeYRHCs7vDz+/3GCMwEtV9jezLyl4ZtnBgx00I7hm8PCP8cTksMGrw==", + "dev": true, + "requires": { + "bs-logger": "0.x", + "ejs": "^3.1.10", + "fast-json-stable-stringify": "2.x", + "jest-util": "^29.0.0", + "json5": "^2.2.3", + "lodash.memoize": "4.x", + "make-error": "1.x", + "semver": "^7.5.3", + "yargs-parser": "^21.0.1" + } + }, + "ts-jest-mock-import-meta": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ts-jest-mock-import-meta/-/ts-jest-mock-import-meta-1.2.0.tgz", + "integrity": "sha512-r2+TH6d8LHBXqLTXjJh1KfTZoMvGV0hdn9gwickNVcwS2Co2/mewGjj0XDVEPLg5MVfZVHUFQ9O09anURA3KCw==", + "dev": true, + "requires": {} + }, + "ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, + "requires": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + } + }, + "tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "requires": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true + } + } + }, + "tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + }, + "tunnel-rat": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/tunnel-rat/-/tunnel-rat-0.1.2.tgz", + "integrity": "sha512-lR5VHmkPhzdhrM092lI2nACsLO4QubF0/yoOhzX7c+wIpbN1GjHNzCc91QlpxBi+cnx8vVJ+Ur6vL5cEoQPFpQ==", + "requires": { + "zustand": "^4.3.2" + }, + "dependencies": { + "zustand": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.4.tgz", + "integrity": "sha512-/BPMyLKJPtFEvVL0E9E9BTUM63MNyhPGlvxk1XjrfWTUlV+BR8jufjsovHzrtR6YNcBEcL7cMHovL1n9xHawEg==", + "requires": { + "use-sync-external-store": "1.2.0" + } + } + } + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true + }, + "typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + } + }, + "typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + } + }, + "typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + } + }, + "typed-array-length": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + } + }, + "typescript": { + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", + "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", + "dev": true + }, + "typewise": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typewise/-/typewise-1.0.3.tgz", + "integrity": "sha512-aXofE06xGhaQSPzt8hlTY+/YWQhm9P0jYUp1f2XtmW/3Bk0qzXcyFWAtPoo2uTGQj1ZwbDuSyuxicq+aDo8lCQ==", + "requires": { + "typewise-core": "^1.2.0" + } + }, + "typewise-core": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/typewise-core/-/typewise-core-1.2.0.tgz", + "integrity": "sha512-2SCC/WLzj2SbUwzFOzqMCkz5amXLlxtJqDKTICqg30x+2DZxcfZN2MvQZmGfXWKNWaKK9pBPsvkcwv8bF/gxKg==" + }, + "unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + } + }, + "undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true + }, + "update-browserslist-db": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", + "dev": true, + "requires": { + "escalade": "^3.1.2", + "picocolors": "^1.0.1" + } + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "use-isomorphic-layout-effect": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz", + "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==", + "requires": {} + }, + "use-sync-external-store": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", + "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", + "requires": {} + }, + "util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, + "utility-types": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz", + "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==" + }, + "uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==" + }, + "v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "v8-to-istanbul": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "dependencies": { + "convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + } + } + }, + "vite": { + "version": "5.3.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.5.tgz", + "integrity": "sha512-MdjglKR6AQXQb9JGiS7Rc2wC6uMjcm7Go/NHNO63EwiJXfuk9PgqiP/n5IDJCziMkfw9n4Ubp7lttNwz+8ZVKA==", + "requires": { + "esbuild": "^0.21.3", + "fsevents": "~2.3.3", + "postcss": "^8.4.39", + "rollup": "^4.13.0" + } + }, + "vite-plugin-glsl": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/vite-plugin-glsl/-/vite-plugin-glsl-1.3.0.tgz", + "integrity": "sha512-SzEoLet9Bp5VSozjrhUiSc3xX1+u7rCTjXAsq4qWM3u8UjilI76A9ucX/T+CRGQCe25j50GSY+9mKSGUVPET1w==", + "requires": { + "@rollup/pluginutils": "^5.1.0" + } + }, + "vt-pbf": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/vt-pbf/-/vt-pbf-3.1.3.tgz", + "integrity": "sha512-2LzDFzt0mZKZ9IpVF2r69G9bXaP2Q2sArJCmcCgvfTdCCZzSyz4aCLoQyUilu37Ll56tCblIZrXFIjNUpGIlmA==", + "requires": { + "@mapbox/point-geometry": "0.1.0", + "@mapbox/vector-tile": "^1.3.1", + "pbf": "^3.2.1" + } + }, + "w3c-xmlserializer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", + "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", + "dev": true, + "requires": { + "xml-name-validator": "^4.0.0" + } + }, + "walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "requires": { + "makeerror": "1.0.12" + } + }, + "webgl-constants": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/webgl-constants/-/webgl-constants-1.1.1.tgz", + "integrity": "sha512-LkBXKjU5r9vAW7Gcu3T5u+5cvSvh5WwINdr0C+9jpzVB41cjQAP5ePArDtk/WHYdVj0GefCgM73BA7FlIiNtdg==" + }, + "webgl-sdf-generator": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/webgl-sdf-generator/-/webgl-sdf-generator-1.1.1.tgz", + "integrity": "sha512-9Z0JcMTFxeE+b2x1LJTdnaT8rT8aEp7MVxkNwoycNmJWwPdzoXzMh0BjJSh/AEFP+KPYZUli814h8bJZFIZ2jA==" + }, + "webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true + }, + "whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "dev": true, + "requires": { + "iconv-lite": "0.6.3" + } + }, + "whatwg-mimetype": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "dev": true + }, + "whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "dev": true, + "requires": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "requires": { + "isexe": "^2.0.0" + } + }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "which-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" + } + }, + "word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + } + }, + "ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "dev": true, + "requires": {} + }, + "xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true + }, + "xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" + }, + "yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "requires": { + "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" + } + }, + "yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true + }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true + }, + "zrender": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/zrender/-/zrender-5.6.0.tgz", + "integrity": "sha512-uzgraf4njmmHAbEUxMJ8Oxg+P3fT04O+9p7gY+wJRVxo8Ge+KmYv0WJev945EH4wFuc4OY2NLXz46FZrWS9xJg==", + "requires": { + "tslib": "2.3.0" + } + }, + "zustand": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-3.7.2.tgz", + "integrity": "sha512-PIJDIZKtokhof+9+60cpockVOq05sJzHCriyvaLBmEJixseQ1a5Kdov6fWZfWOu5SK9c+FhH1jU0tntLxRJYMA==", + "requires": {} } } } diff --git a/air-quality-ui/package.json b/air-quality-ui/package.json index d4b93753..aa83bbd7 100644 --- a/air-quality-ui/package.json +++ b/air-quality-ui/package.json @@ -17,6 +17,8 @@ "@emotion/react": "^11.13.0", "@emotion/styled": "^11.13.0", "@mui/x-date-pickers": "^7.12.0", + "@react-three/drei": "^9.109.2", + "@react-three/fiber": "^8.16.8", "@tanstack/react-query": "^5.40.1", "@types/echarts": "^4.9.22", "ag-grid-react": "^31.3.2", @@ -30,7 +32,9 @@ "react": "^18.2.0", "react-dom": "^18.2.0", "react-router-dom": "^6.23.1", - "react-select": "^5.8.0" + "react-select": "^5.8.0", + "three": "^0.167.1", + "vite-plugin-glsl": "^1.3.0" }, "devDependencies": { "@playwright/test": "^1.45.0", diff --git a/air-quality-ui/public/Maximum_Voltage_Regular.json b/air-quality-ui/public/Maximum_Voltage_Regular.json new file mode 100644 index 00000000..ac076524 --- /dev/null +++ b/air-quality-ui/public/Maximum_Voltage_Regular.json @@ -0,0 +1 @@ +{"glyphs":{"0":{"ha":949,"x_min":0,"x_max":949,"o":"m 475 0 q 139 139 278 0 q 0 475 0 278 q 139 810 0 671 q 475 949 278 949 q 810 810 671 949 q 949 475 949 671 q 810 139 949 278 q 475 0 671 0 m 475 271 q 618 331 559 271 q 678 475 678 391 q 618 618 678 559 q 475 678 559 678 q 331 618 391 678 q 271 475 271 559 q 331 331 271 391 q 475 271 391 271 z "},"1":{"ha":407,"x_min":68,"x_max":340,"o":"m 340 949 l 340 0 l 68 0 l 68 949 l 340 949 z "},"2":{"ha":882,"x_min":68,"x_max":882,"o":"m 814 0 l 68 0 l 68 311 q 475 610 68 610 l 543 610 q 610 638 610 610 q 543 678 610 678 l 136 678 l 136 949 l 475 949 q 882 638 882 949 q 475 339 882 339 q 339 311 339 339 l 339 271 l 814 271 l 814 0 z "},"3":{"ha":882,"x_min":68,"x_max":814,"o":"m 271 339 l 271 610 l 475 610 q 543 644 543 610 q 475 678 543 678 l 68 678 l 68 949 l 475 949 q 814 644 814 949 q 746 475 814 534 q 814 305 814 416 q 475 0 814 0 l 68 0 l 68 271 l 475 271 q 543 305 543 271 q 475 339 543 339 l 271 339 z "},"4":{"ha":882,"x_min":0,"x_max":882,"o":"m 746 339 l 746 0 l 475 0 l 475 339 l 0 339 l 136 949 l 407 949 l 339 610 l 475 610 l 475 949 l 746 949 l 746 610 l 882 610 l 882 339 l 746 339 z "},"5":{"ha":882,"x_min":68,"x_max":882,"o":"m 136 0 l 136 271 l 543 271 q 610 305 610 271 q 543 339 610 339 l 68 339 l 68 949 l 814 949 l 814 678 l 339 678 l 339 610 l 610 610 q 882 311 882 610 q 610 0 882 0 l 136 0 z "},"6":{"ha":882,"x_min":63,"x_max":877,"o":"m 402 678 q 334 610 334 678 l 538 610 q 877 305 877 610 q 538 0 877 0 l 402 0 q 63 305 63 0 l 63 644 q 402 949 63 949 l 814 949 l 814 678 l 402 678 m 538 271 q 606 305 606 271 q 538 339 606 339 l 402 339 q 334 305 334 339 q 402 271 334 271 l 538 271 z "},"7":{"ha":886,"x_min":136,"x_max":850,"o":"m 443 678 l 136 678 l 136 949 l 850 949 l 475 0 l 172 0 l 443 678 z "},"8":{"ha":949,"x_min":68,"x_max":882,"o":"m 543 610 q 610 644 610 610 q 543 678 610 678 l 407 678 q 339 644 339 678 q 407 610 339 610 l 543 610 m 543 949 q 882 644 882 949 q 814 475 882 534 q 882 305 882 416 q 543 0 882 0 l 407 0 q 68 305 68 0 q 136 475 68 416 q 68 644 68 534 q 407 949 68 949 l 543 949 m 543 271 q 610 305 610 271 l 610 307 q 545 339 610 339 l 409 339 q 339 305 341 339 q 407 271 339 271 l 543 271 z "},"9":{"ha":949,"x_min":68,"x_max":882,"o":"m 543 271 q 610 339 610 271 l 407 339 q 68 644 68 339 q 407 949 68 949 l 543 949 q 882 644 882 949 l 882 305 q 543 0 882 0 l 131 0 l 131 271 l 543 271 m 407 678 q 339 644 339 678 q 407 610 339 610 l 543 610 q 610 644 610 610 q 543 678 610 678 l 407 678 z "},"\u0000":{"ha":0,"x_min":0,"x_max":0,"o":""},"\u001d":{"ha":0,"x_min":0,"x_max":0,"o":""}," ":{"ha":543,"x_min":0,"x_max":0,"o":""}," ":{"ha":543,"x_min":0,"x_max":0,"o":""},"!":{"ha":543,"x_min":102,"x_max":441,"o":"m 136 339 l 102 949 l 441 949 l 408 339 l 136 339 m 136 0 l 136 271 l 408 271 l 408 0 l 136 0 z "},"\"":{"ha":625,"x_min":8,"x_max":618,"o":"m 279 949 l 245 543 l 42 543 l 8 949 l 279 949 m 618 949 l 585 543 l 381 543 l 347 949 l 618 949 z "},"#":{"ha":1085,"x_min":68,"x_max":1017,"o":"m 203 407 l 203 543 l 68 543 l 68 814 l 203 814 l 203 949 l 475 949 l 475 814 l 610 814 l 610 949 l 882 949 l 882 814 l 1017 814 l 1017 543 l 882 543 l 882 407 l 1017 407 l 1017 136 l 882 136 l 882 0 l 610 0 l 610 136 l 475 136 l 475 0 l 203 0 l 203 136 l 68 136 l 68 407 l 203 407 m 475 543 l 475 407 l 610 407 l 610 543 l 475 543 z "},"$":{"ha":814,"x_min":-1,"x_max":813,"o":"m 339 949 l 339 1085 l 475 1085 l 475 949 l 678 949 l 679 678 l 338 678 q 271 647 271 678 q 338 610 271 610 l 474 610 q 813 308 813 610 q 475 0 813 0 l 475 -136 l 339 -136 l 339 0 l 56 0 l 56 271 l 474 271 q 542 308 542 271 q 474 339 542 339 l 338 339 q -1 647 -1 339 q 338 949 -1 949 l 339 949 z "},"%":{"ha":919,"x_min":24,"x_max":906,"o":"m 906 949 l 330 0 l 24 0 l 603 949 l 906 949 m 296 610 l 24 610 l 24 882 l 296 882 l 296 610 m 906 68 l 635 68 l 635 339 l 906 339 l 906 68 z "},"&":{"ha":949,"x_min":68,"x_max":949,"o":"m 543 610 q 610 644 610 610 q 543 678 610 678 l 407 678 q 339 644 339 678 q 407 610 339 610 l 543 610 m 543 271 q 610 305 610 271 l 610 307 q 545 339 610 339 l 409 339 q 339 305 341 339 q 407 271 339 271 l 543 271 m 407 0 q 68 305 68 0 q 136 475 68 416 q 68 644 68 534 q 407 949 68 949 l 543 949 q 882 644 882 949 q 814 475 882 534 q 882 305 882 416 q 880 271 882 288 l 949 271 l 949 0 l 407 0 z "},"'":{"ha":287,"x_min":8,"x_max":279,"o":"m 279 949 l 245 543 l 42 543 l 8 949 l 279 949 z "},"(":{"ha":543,"x_min":68,"x_max":543,"o":"m 68 610 q 543 1085 68 1085 l 543 814 q 339 610 339 814 l 339 339 q 543 136 339 136 l 543 -136 q 68 339 68 -136 l 68 610 z "},")":{"ha":543,"x_min":68,"x_max":543,"o":"m 543 339 q 68 -136 543 -136 l 68 136 q 271 339 271 136 l 271 610 q 68 814 271 814 l 68 1085 q 543 610 543 1085 l 543 339 z "},"*":{"ha":678,"x_min":0,"x_max":678,"o":"m 407 775 l 530 899 l 626 804 l 502 678 l 678 678 l 678 543 l 502 543 l 626 417 l 530 321 l 407 446 l 407 271 l 271 271 l 271 446 l 149 321 l 52 417 l 176 543 l 0 543 l 0 678 l 176 678 l 52 804 l 149 899 l 271 775 l 271 949 l 407 949 l 407 775 z "},"+":{"ha":678,"x_min":0,"x_max":678,"o":"m 475 610 l 678 610 l 678 339 l 475 339 l 475 136 l 203 136 l 203 339 l 0 339 l 0 610 l 203 610 l 203 814 l 475 814 l 475 610 z "},",":{"ha":407,"x_min":-68,"x_max":339,"o":"m 339 136 l -68 -271 l 68 136 l 339 136 z "},"-":{"ha":543,"x_min":0,"x_max":543,"o":"m 543 610 l 543 339 l 0 339 l 0 610 l 543 610 z "},"­":{"ha":543,"x_min":0,"x_max":543,"o":"m 543 610 l 543 339 l 0 339 l 0 610 l 543 610 z "},".":{"ha":407,"x_min":68,"x_max":339,"o":"m 339 0 l 68 0 l 68 271 l 339 271 l 339 0 z "},"/":{"ha":678,"x_min":-104,"x_max":787,"o":"m 787 1085 l 179 -136 l -104 -136 l 512 1085 l 787 1085 z "},":":{"ha":407,"x_min":68,"x_max":339,"o":"m 339 543 l 68 543 l 68 814 l 339 814 l 339 543 m 339 136 l 68 136 l 68 407 l 339 407 l 339 136 z "},";":{"ha":407,"x_min":-68,"x_max":339,"o":"m 339 814 l 339 543 l 68 543 l 68 814 l 339 814 m 339 271 l -68 -271 l 68 271 l 339 271 z "},";":{"ha":407,"x_min":-68,"x_max":339,"o":"m 339 814 l 339 543 l 68 543 l 68 814 l 339 814 m 339 271 l -68 -271 l 68 271 l 339 271 z "},"<":{"ha":745,"x_min":0,"x_max":746,"o":"m 0 610 l 746 949 l 746 678 l 271 475 l 746 271 l 746 0 l 0 339 l 0 610 z "},"=":{"ha":746,"x_min":68,"x_max":678,"o":"m 678 814 l 678 543 l 68 543 l 68 814 l 678 814 m 678 407 l 678 136 l 68 136 l 68 407 l 678 407 z "},">":{"ha":814,"x_min":68,"x_max":814,"o":"m 814 339 l 68 0 l 68 271 l 543 475 l 68 678 l 68 949 l 814 610 l 814 339 z "},"?":{"ha":781,"x_min":68,"x_max":778,"o":"m 168 610 l 405 610 q 473 638 473 610 q 405 678 473 678 l 68 678 l 68 949 l 371 949 q 778 638 778 949 q 439 409 778 427 l 439 339 l 168 339 l 168 610 m 439 0 l 168 0 l 168 271 l 439 271 l 439 0 z "},"@":{"ha":949,"x_min":0,"x_max":956,"o":"m 488 288 q 352 243 435 243 q 239 288 275 243 q 213 365 213 319 q 218 409 213 385 q 345 625 243 531 q 566 719 447 719 q 733 667 627 719 q 644 469 657 507 q 625 404 631 431 q 623 388 623 395 q 632 374 623 374 q 728 437 682 374 q 792 587 774 500 q 804 663 804 629 q 769 757 804 722 q 614 813 713 813 q 328 694 456 813 q 163 395 201 576 q 155 323 155 357 q 190 206 155 254 q 350 135 242 135 q 467 155 407 135 q 581 222 528 174 l 643 111 q 478 28 570 57 q 309 0 387 0 q 58 106 141 0 q 0 286 0 180 q 11 382 0 331 q 244 786 62 624 q 655 948 426 948 q 900 857 820 948 q 956 695 956 792 q 946 607 956 654 q 818 358 916 467 q 597 250 720 250 q 488 288 514 250 m 537 601 q 441 543 490 601 q 377 416 392 484 q 375 397 375 406 q 398 372 375 372 q 459 399 430 372 q 508 473 488 426 q 556 595 527 519 q 537 601 551 601 z "},"A":{"ha":780,"x_min":-197,"x_max":882,"o":"m 407 1289 l 882 0 l 291 0 l 394 271 l 519 271 l 407 610 l 68 -271 l -197 -271 l 253 903 l 407 1289 z "},"B":{"ha":882,"x_min":-68,"x_max":882,"o":"m 407 610 l 475 610 q 543 661 543 610 q 475 712 543 712 l 340 712 l 340 271 l 543 271 q 611 339 611 271 q 543 407 611 407 l 407 407 l 407 610 m 475 949 q 764 814 679 949 q 802 690 802 752 q 747 543 802 616 q 882 339 882 475 q 543 0 882 0 l 68 0 l 68 814 l -68 949 l 475 949 z "},"C":{"ha":814,"x_min":0,"x_max":746,"o":"m 475 949 l 746 949 l 746 678 l 475 678 q 331 618 391 678 q 271 475 271 559 q 331 331 271 391 q 475 271 391 271 l 746 271 l 746 0 l 475 0 q 139 139 278 0 q 0 475 0 278 q 139 810 0 671 q 475 949 278 949 z "},"D":{"ha":882,"x_min":1,"x_max":882,"o":"m 340 271 l 408 271 q 551 331 492 271 q 611 475 611 391 q 551 618 611 559 q 408 678 492 678 l 340 678 l 340 271 m 408 949 q 743 810 604 949 q 882 475 882 671 q 743 139 882 278 q 408 0 604 0 l 68 0 l 68 882 l 1 949 l 408 949 z "},"E":{"ha":814,"x_min":-68,"x_max":746,"o":"m 407 610 l 746 610 l 746 339 l 407 339 l 407 610 m 746 949 l 746 678 l 340 678 l 340 271 l 746 271 l 746 0 l 68 0 l 68 814 l -68 949 l 746 949 z "},"F":{"ha":814,"x_min":-68,"x_max":746,"o":"m 407 610 l 746 610 l 746 339 l 407 339 l 407 610 m 746 949 l 746 678 l 340 678 l 339 -271 l 68 -271 l 68 814 l -68 949 l 746 949 z "},"G":{"ha":814,"x_min":0,"x_max":746,"o":"m 475 271 l 475 610 l 746 610 l 746 -271 l 475 -271 l 475 0 q 139 139 278 0 q 0 475 0 278 q 139 810 0 671 q 475 949 278 949 l 746 949 l 746 678 l 475 678 q 331 618 391 678 q 271 475 271 559 q 331 331 271 391 q 475 271 391 271 z "},"H":{"ha":1017,"x_min":-68,"x_max":950,"o":"m 950 949 l 950 0 l 679 0 l 679 339 l 340 339 l 340 0 l 68 0 l 68 814 l -68 949 l 340 949 l 340 610 l 679 610 l 678 814 l 543 949 l 950 949 z "},"I":{"ha":407,"x_min":68,"x_max":340,"o":"m 340 949 l 340 0 l 68 0 l 68 949 l 340 949 z "},"J":{"ha":543,"x_min":0,"x_max":473,"o":"m 473 949 l 473 475 q 0 0 473 0 l 0 271 l 66 271 q 201 475 201 271 l 201 804 l 68 949 l 473 949 z "},"K":{"ha":949,"x_min":-68,"x_max":1086,"o":"m 340 949 l 340 509 l 641 949 l 950 949 l 610 434 l 1086 -271 l 781 -271 l 340 351 l 340 0 l 68 0 l 68 813 l -68 949 l 340 949 z "},"L":{"ha":610,"x_min":-68,"x_max":610,"o":"m 340 949 l 340 271 l 610 271 l 610 0 l 68 0 l 68 814 l -68 949 l 340 949 z "},"M":{"ha":1221,"x_min":68,"x_max":1154,"o":"m 68 1103 l 610 339 l 1153 1085 l 1154 0 l 882 0 l 882 271 l 611 -136 l 339 271 l 340 0 l 68 0 l 68 882 l 68 1103 z "},"N":{"ha":1017,"x_min":68,"x_max":949,"o":"m 949 949 l 949 -136 l 339 407 l 339 0 l 68 0 l 68 1085 l 678 509 l 678 814 l 543 949 l 949 949 z "},"O":{"ha":949,"x_min":0,"x_max":949,"o":"m 475 0 q 139 139 278 0 q 0 475 0 278 q 139 810 0 671 q 475 949 278 949 q 810 810 671 949 q 949 475 949 671 q 810 139 949 278 q 475 0 671 0 m 475 271 q 618 331 559 271 q 678 475 678 391 q 618 618 678 559 q 475 678 559 678 q 331 618 391 678 q 271 475 271 559 q 331 331 271 391 q 475 271 391 271 z "},"P":{"ha":882,"x_min":-68,"x_max":881,"o":"m 542 949 q 881 610 881 949 q 542 271 881 271 l 406 271 l 406 543 l 542 543 q 610 610 610 543 q 542 678 610 678 l 338 678 l 339 -271 l 68 -271 l 67 814 l -68 949 l 542 949 z "},"Q":{"ha":949,"x_min":0,"x_max":1153,"o":"m 618 331 q 648 361 618 331 q 678 475 678 391 q 618 618 678 559 q 475 678 559 678 q 331 618 391 678 q 271 475 271 559 q 331 331 271 391 q 475 271 391 271 q 618 331 559 271 m 650 32 q 475 0 569 0 q 139 139 278 0 q 0 475 0 278 q 139 810 0 671 q 475 949 278 949 q 810 810 671 949 q 949 475 949 671 q 861 197 949 318 l 1153 -271 l 846 -271 l 650 32 z "},"R":{"ha":882,"x_min":-68,"x_max":1084,"o":"m 542 949 q 881 610 881 949 q 745 304 881 339 l 1084 -271 l 782 -271 l 406 300 l 405 543 l 542 543 q 610 610 610 543 q 542 678 610 678 l 338 678 l 338 0 l 67 0 l 67 814 l -68 949 l 542 949 z "},"S":{"ha":814,"x_min":-1,"x_max":813,"o":"m 338 339 q -1 647 -1 339 q 338 949 -1 949 l 678 949 l 679 678 l 338 678 q 271 647 271 678 q 338 610 271 610 l 474 610 q 813 308 813 610 q 474 0 813 0 l 56 0 l 56 271 l 474 271 q 542 308 542 271 q 474 339 542 339 l 338 339 z "},"T":{"ha":678,"x_min":-3,"x_max":678,"o":"m -3 949 l 678 949 l 678 678 l 475 678 l 475 -271 l 203 -271 l 203 678 l 0 678 l -3 949 z "},"U":{"ha":949,"x_min":-68,"x_max":882,"o":"m 339 949 l 339 475 q 475 271 339 271 q 610 475 610 271 l 610 814 l 475 949 l 882 949 l 882 475 q 475 0 882 0 q 68 475 68 0 l 68 814 l -68 949 l 339 949 z "},"V":{"ha":882,"x_min":-35,"x_max":920,"o":"m 920 949 l 446 -271 l -35 949 l 242 949 l 446 407 l 620 872 l 543 949 l 920 949 z "},"W":{"ha":1289,"x_min":-30,"x_max":1329,"o":"m 1329 949 l 893 -271 l 647 300 l 407 -271 l -30 949 l 244 949 l 448 407 l 651 1017 l 854 407 l 1028 871 l 949 949 l 1329 949 z "},"X":{"ha":867,"x_min":-32,"x_max":918,"o":"m 291 475 l -32 949 l 275 949 l 441 703 l 610 949 l 918 949 l 599 473 l 918 0 l 616 0 l 439 245 l 278 0 l -32 0 l 291 475 z "},"Y":{"ha":832,"x_min":-68,"x_max":882,"o":"m 269 441 l -68 949 l 239 949 l 405 703 l 574 949 l 882 949 l 541 441 l 541 -271 l 269 -271 l 269 441 z "},"Z":{"ha":882,"x_min":-64,"x_max":954,"o":"m 814 0 l -64 0 l 445 678 l 132 678 l 136 949 l 954 949 l 479 271 l 814 271 l 814 0 z "},"[":{"ha":543,"x_min":68,"x_max":543,"o":"m 543 1085 l 543 814 l 339 814 l 339 136 l 543 136 l 543 -136 l 68 -136 l 68 1085 l 543 1085 z "},"\\":{"ha":949,"x_min":34,"x_max":926,"o":"m 309 1085 l 926 -136 l 642 -136 l 34 1085 l 309 1085 z "},"]":{"ha":543,"x_min":68,"x_max":543,"o":"m 543 1085 l 543 -136 l 68 -136 l 68 136 l 271 136 l 271 814 l 68 814 l 68 1085 l 543 1085 z "},"^":{"ha":746,"x_min":34,"x_max":712,"o":"m 576 949 l 712 610 l 441 610 l 373 780 l 305 610 l 34 610 l 170 949 l 576 949 z "},"_":{"ha":882,"x_min":68,"x_max":814,"o":"m 814 271 l 814 0 l 68 0 l 68 271 l 814 271 z "},"`":{"ha":475,"x_min":34,"x_max":441,"o":"m 34 1356 l 305 1356 l 441 1017 l 170 1017 l 34 1356 z "},"a":{"ha":780,"x_min":-197,"x_max":882,"o":"m 407 1289 l 882 0 l 291 0 l 394 271 l 519 271 l 407 610 l 68 -271 l -197 -271 l 253 903 l 407 1289 z "},"b":{"ha":882,"x_min":-68,"x_max":882,"o":"m 407 610 l 475 610 q 543 661 543 610 q 475 712 543 712 l 340 712 l 340 271 l 543 271 q 611 339 611 271 q 543 407 611 407 l 407 407 l 407 610 m 475 949 q 764 814 679 949 q 802 690 802 752 q 747 543 802 616 q 882 339 882 475 q 543 0 882 0 l 68 0 l 68 814 l -68 949 l 475 949 z "},"c":{"ha":814,"x_min":0,"x_max":746,"o":"m 475 949 l 746 949 l 746 678 l 475 678 q 331 618 391 678 q 271 475 271 559 q 331 331 271 391 q 475 271 391 271 l 746 271 l 746 0 l 475 0 q 139 139 278 0 q 0 475 0 278 q 139 810 0 671 q 475 949 278 949 z "},"d":{"ha":882,"x_min":1,"x_max":882,"o":"m 340 271 l 408 271 q 551 331 492 271 q 611 475 611 391 q 551 618 611 559 q 408 678 492 678 l 340 678 l 340 271 m 408 949 q 743 810 604 949 q 882 475 882 671 q 743 139 882 278 q 408 0 604 0 l 68 0 l 68 882 l 1 949 l 408 949 z "},"e":{"ha":814,"x_min":-68,"x_max":746,"o":"m 407 610 l 746 610 l 746 339 l 407 339 l 407 610 m 746 949 l 746 678 l 340 678 l 340 271 l 746 271 l 746 0 l 68 0 l 68 814 l -68 949 l 746 949 z "},"f":{"ha":814,"x_min":-68,"x_max":746,"o":"m 407 610 l 746 610 l 746 339 l 407 339 l 407 610 m 746 949 l 746 678 l 340 678 l 339 -271 l 68 -271 l 68 814 l -68 949 l 746 949 z "},"g":{"ha":814,"x_min":0,"x_max":746,"o":"m 475 271 l 475 610 l 746 610 l 746 -271 l 475 -271 l 475 0 q 139 139 278 0 q 0 475 0 278 q 139 810 0 671 q 475 949 278 949 l 746 949 l 746 678 l 475 678 q 331 618 391 678 q 271 475 271 559 q 331 331 271 391 q 475 271 391 271 z "},"h":{"ha":1017,"x_min":-68,"x_max":950,"o":"m 950 949 l 950 0 l 679 0 l 679 339 l 340 339 l 340 0 l 68 0 l 68 814 l -68 949 l 340 949 l 340 610 l 679 610 l 678 814 l 543 949 l 950 949 z "},"i":{"ha":407,"x_min":68,"x_max":340,"o":"m 340 949 l 340 0 l 68 0 l 68 949 l 340 949 z "},"j":{"ha":543,"x_min":0,"x_max":473,"o":"m 473 949 l 473 475 q 0 0 473 0 l 0 271 l 66 271 q 201 475 201 271 l 201 804 l 68 949 l 473 949 z "},"k":{"ha":949,"x_min":-68,"x_max":1086,"o":"m 340 949 l 340 509 l 641 949 l 950 949 l 610 434 l 1086 -271 l 781 -271 l 340 351 l 340 0 l 68 0 l 68 813 l -68 949 l 340 949 z "},"l":{"ha":610,"x_min":-68,"x_max":610,"o":"m 340 949 l 340 271 l 610 271 l 610 0 l 68 0 l 68 814 l -68 949 l 340 949 z "},"m":{"ha":1221,"x_min":68,"x_max":1154,"o":"m 68 1103 l 610 339 l 1153 1085 l 1154 0 l 882 0 l 882 271 l 611 -136 l 339 271 l 340 0 l 68 0 l 68 882 l 68 1103 z "},"n":{"ha":1017,"x_min":68,"x_max":949,"o":"m 949 949 l 949 -136 l 339 407 l 339 0 l 68 0 l 68 1085 l 678 509 l 678 814 l 543 949 l 949 949 z "},"o":{"ha":949,"x_min":0,"x_max":949,"o":"m 475 0 q 139 139 278 0 q 0 475 0 278 q 139 810 0 671 q 475 949 278 949 q 810 810 671 949 q 949 475 949 671 q 810 139 949 278 q 475 0 671 0 m 475 271 q 618 331 559 271 q 678 475 678 391 q 618 618 678 559 q 475 678 559 678 q 331 618 391 678 q 271 475 271 559 q 331 331 271 391 q 475 271 391 271 z "},"p":{"ha":882,"x_min":-68,"x_max":881,"o":"m 542 949 q 881 610 881 949 q 542 271 881 271 l 406 271 l 406 543 l 542 543 q 610 610 610 543 q 542 678 610 678 l 338 678 l 339 -271 l 68 -271 l 67 814 l -68 949 l 542 949 z "},"q":{"ha":949,"x_min":0,"x_max":1153,"o":"m 618 331 q 648 361 618 331 q 678 475 678 391 q 618 618 678 559 q 475 678 559 678 q 331 618 391 678 q 271 475 271 559 q 331 331 271 391 q 475 271 391 271 q 618 331 559 271 m 650 32 q 475 0 569 0 q 139 139 278 0 q 0 475 0 278 q 139 810 0 671 q 475 949 278 949 q 810 810 671 949 q 949 475 949 671 q 861 197 949 318 l 1153 -271 l 846 -271 l 650 32 z "},"r":{"ha":882,"x_min":-68,"x_max":1084,"o":"m 907 29 l 1084 -271 l 782 -271 l 585 28 l 907 29 m 585 28 l 406 300 l 405 543 l 542 543 q 610 610 610 543 q 542 678 610 678 l 338 678 l 338 0 l 67 0 l 67 814 l -68 949 l 542 949 q 881 610 881 949 q 745 304 881 339 l 907 29 l 585 28 z "},"s":{"ha":814,"x_min":-1,"x_max":813,"o":"m 338 339 q -1 647 -1 339 q 338 949 -1 949 l 678 949 l 679 678 l 338 678 q 271 647 271 678 q 338 610 271 610 l 474 610 q 813 308 813 610 q 474 0 813 0 l 56 0 l 56 271 l 474 271 q 542 308 542 271 q 474 339 542 339 l 338 339 z "},"t":{"ha":678,"x_min":-3,"x_max":678,"o":"m -3 949 l 678 949 l 678 678 l 475 678 l 475 -271 l 203 -271 l 203 678 l 0 678 l -3 949 z "},"u":{"ha":949,"x_min":-68,"x_max":882,"o":"m 339 949 l 339 475 q 475 271 339 271 q 610 475 610 271 l 610 814 l 475 949 l 882 949 l 882 475 q 475 0 882 0 q 68 475 68 0 l 68 814 l -68 949 l 339 949 z "},"v":{"ha":882,"x_min":-35,"x_max":920,"o":"m 920 949 l 446 -271 l -35 949 l 242 949 l 446 407 l 620 872 l 543 949 l 920 949 z "},"w":{"ha":1289,"x_min":-30,"x_max":1329,"o":"m 1329 949 l 893 -271 l 647 300 l 407 -271 l -30 949 l 244 949 l 448 407 l 651 1017 l 854 407 l 1028 871 l 949 949 l 1329 949 z "},"x":{"ha":867,"x_min":-32,"x_max":918,"o":"m 291 475 l -32 949 l 275 949 l 441 703 l 610 949 l 918 949 l 599 473 l 918 0 l 616 0 l 439 245 l 278 0 l -32 0 l 291 475 z "},"y":{"ha":832,"x_min":-68,"x_max":882,"o":"m 269 441 l -68 949 l 239 949 l 405 703 l 574 949 l 882 949 l 541 441 l 541 -271 l 269 -271 l 269 441 z "},"z":{"ha":882,"x_min":-64,"x_max":954,"o":"m 814 0 l -64 0 l 445 678 l 132 678 l 136 949 l 954 949 l 479 271 l 814 271 l 814 0 z "},"{":{"ha":678,"x_min":68,"x_max":678,"o":"m 203 610 q 678 1085 203 1085 l 678 814 q 475 610 475 814 l 475 339 q 678 136 475 136 l 678 -136 q 203 339 203 -136 l 68 339 l 68 610 l 203 610 z "},"|":{"ha":407,"x_min":68,"x_max":339,"o":"m 339 1085 l 339 -136 l 68 -136 l 68 1085 l 339 1085 z "},"}":{"ha":678,"x_min":68,"x_max":678,"o":"m 543 339 q 68 -136 543 -136 l 68 136 q 271 339 271 136 l 271 610 q 68 814 271 814 l 68 1085 q 543 610 543 1085 l 678 610 l 678 339 l 543 339 z "},"~":{"ha":746,"x_min":68,"x_max":746,"o":"m 68 294 l 68 565 q 254 599 170 599 q 407 565 339 599 q 505 543 452 543 q 746 633 610 543 l 746 361 q 505 271 610 271 q 407 294 452 271 q 254 328 339 328 q 68 294 170 328 z "},"¡":{"ha":407,"x_min":34,"x_max":373,"o":"m 339 610 l 373 0 l 34 0 l 68 610 l 339 610 m 339 678 l 68 678 l 68 949 l 339 949 l 339 678 z "},"¢":{"ha":968,"x_min":68,"x_max":968,"o":"m 475 945 l 475 1085 l 610 1085 l 610 945 q 878 810 764 925 q 968 689 935 754 l 726 564 q 686 618 711 593 q 543 678 627 678 q 399 618 458 678 q 339 475 339 559 q 399 331 339 391 q 543 271 458 271 q 686 331 627 271 q 715 367 703 348 l 945 221 q 878 139 917 178 q 610 4 764 24 l 610 -136 l 475 -136 l 475 4 q 207 139 321 24 q 68 475 68 278 q 207 810 68 671 q 475 945 321 925 z "},"£":{"ha":882,"x_min":68,"x_max":882,"o":"m 656 610 l 655 610 q 543 678 621 678 q 431 610 465 678 l 610 610 l 610 339 l 407 339 l 407 270 l 882 270 l 882 0 l 136 0 l 136 339 l 68 339 l 68 610 l 145 610 q 543 949 199 949 q 844 836 741 949 l 712 678 l 656 610 z "},"¤":{"ha":916,"x_min":34,"x_max":882,"o":"m 576 374 q 600 398 576 374 q 625 492 625 422 q 576 610 625 561 q 458 659 527 659 q 340 610 389 659 q 291 492 291 561 q 340 374 291 422 q 458 325 389 325 q 576 374 527 325 m 258 156 l 140 8 l 34 93 l 155 245 q 68 492 68 351 q 145 726 68 625 l 34 865 l 140 949 l 244 819 q 458 882 338 882 q 671 819 578 882 l 776 949 l 882 865 l 770 726 q 848 492 848 625 q 760 245 848 351 l 882 93 l 776 8 l 658 156 q 458 102 569 102 q 258 156 347 102 z "},"¥":{"ha":1017,"x_min":34,"x_max":983,"o":"m 373 203 l 373 271 l 203 271 l 203 407 l 373 407 l 34 949 l 323 949 l 509 678 l 694 949 l 983 949 l 644 407 l 814 407 l 814 271 l 644 271 l 644 203 l 814 203 l 814 68 l 644 68 l 644 0 l 373 0 l 373 68 l 203 68 l 203 203 l 373 203 z "},"¦":{"ha":407,"x_min":68,"x_max":339,"o":"m 68 509 l 68 1085 l 339 1085 l 339 509 l 68 509 m 339 441 l 339 -136 l 68 -136 l 68 441 l 339 441 z "},"§":{"ha":814,"x_min":-1,"x_max":813,"o":"m 338 339 q -1 647 -1 339 q 338 949 -1 949 l 678 949 l 679 678 l 338 678 q 271 647 271 678 q 338 610 271 610 l 474 610 q 813 308 813 610 q 474 0 813 0 l 56 0 l 56 271 l 474 271 q 542 308 542 271 q 474 339 542 339 l 338 339 z "},"¨":{"ha":678,"x_min":34,"x_max":644,"o":"m 305 1017 l 34 1017 l 34 1289 l 305 1289 l 305 1017 m 644 1017 l 373 1017 l 373 1289 l 644 1289 l 644 1017 z "},"©":{"ha":926,"x_min":-7,"x_max":942,"o":"m 467 0 q 132 139 271 0 q -7 475 -7 278 q 132 810 -7 671 q 467 949 271 949 q 803 810 664 949 q 942 475 942 671 q 803 139 942 278 q 467 0 664 0 m 469 136 q 708 234 609 136 q 806 473 806 333 q 708 712 806 613 q 469 810 609 810 q 230 712 329 810 q 132 473 132 613 q 230 234 132 333 q 469 136 329 136 m 484 712 l 603 712 l 620 576 l 484 576 q 412 547 442 576 q 382 475 382 517 q 412 403 382 433 q 484 373 442 373 l 603 373 l 620 237 l 484 237 q 316 307 386 237 q 247 475 247 376 q 316 643 247 573 q 484 712 386 712 z "},"«":{"ha":1526,"x_min":34,"x_max":1492,"o":"m 34 610 l 780 949 l 780 678 l 305 475 l 780 271 l 780 0 l 34 339 l 34 610 m 746 610 l 1492 949 l 1492 678 l 1017 475 l 1492 271 l 1492 0 l 746 339 l 746 610 z "},"®":{"ha":1017,"x_min":34,"x_max":983,"o":"m 509 0 q 173 139 312 0 q 34 475 34 278 q 173 810 34 671 q 509 949 312 949 q 844 810 705 949 q 983 475 983 671 q 844 139 983 278 q 509 0 705 0 m 511 136 q 749 234 650 136 q 848 473 848 333 q 749 712 848 613 q 511 810 650 810 q 272 712 370 810 q 173 473 173 613 q 272 234 173 333 q 511 136 370 136 m 457 577 l 457 509 l 559 509 q 593 543 593 509 q 559 577 593 577 l 457 577 m 479 373 l 457 373 l 457 237 l 321 237 l 321 713 l 559 713 q 729 543 729 713 q 626 381 729 410 l 729 237 l 576 237 l 479 373 z "},"¯":{"ha":610,"x_min":34,"x_max":576,"o":"m 576 1289 l 576 1017 l 34 1017 l 34 1289 l 576 1289 z "},"°":{"ha":339,"x_min":34,"x_max":305,"o":"m 305 1017 l 34 1017 l 34 1289 l 305 1289 l 305 1017 z "},"±":{"ha":746,"x_min":34,"x_max":712,"o":"m 509 610 l 712 610 l 712 339 l 509 339 l 509 136 l 237 136 l 237 339 l 34 339 l 34 610 l 237 610 l 237 814 l 509 814 l 509 610 m 712 -203 l 34 -203 l 34 68 l 712 68 l 712 -203 z "},"´":{"ha":475,"x_min":34,"x_max":441,"o":"m 305 1017 l 34 1017 l 170 1356 l 441 1356 l 305 1017 z "},"µ":{"ha":882,"x_min":34,"x_max":848,"o":"m 305 475 q 441 271 305 271 q 576 475 576 271 l 576 949 l 848 949 l 848 475 q 441 0 848 0 q 305 16 366 0 l 305 -203 l 34 -203 l 34 949 l 305 949 l 305 475 z "},"¶":{"ha":882,"x_min":34,"x_max":848,"o":"m 848 949 l 848 678 l 780 678 l 780 -203 l 509 -203 l 509 678 l 373 678 l 373 -203 l 102 -203 l 102 441 l 34 441 l 34 949 l 848 949 z "},"»":{"ha":1526,"x_min":34,"x_max":1492,"o":"m 1492 610 l 1492 339 l 746 0 l 746 271 l 1221 475 l 746 678 l 746 949 l 1492 610 m 780 610 l 780 339 l 34 0 l 34 271 l 509 475 l 34 678 l 34 949 l 780 610 z "},"¼":{"ha":1085,"x_min":34,"x_max":1051,"o":"m 271 947 l 271 475 l 136 475 l 136 812 l 102 812 l 119 947 l 271 947 m 916 949 l 340 0 l 34 0 l 612 949 l 916 949 m 983 170 l 983 0 l 848 0 l 848 170 l 610 170 l 678 475 l 814 475 l 780 305 l 848 305 l 848 475 l 983 475 l 983 305 l 1034 305 l 1051 170 l 983 170 z "},"½":{"ha":1085,"x_min":34,"x_max":1051,"o":"m 271 947 l 271 475 l 136 475 l 136 812 l 102 812 l 119 947 l 271 947 m 916 949 l 340 0 l 34 0 l 612 949 l 916 949 m 848 475 q 1051 319 1051 475 q 848 170 1051 170 q 780 156 780 170 l 780 136 l 1034 136 l 1051 0 l 644 0 l 644 156 q 848 305 644 305 l 882 305 q 916 319 916 305 q 882 339 916 339 l 678 339 l 661 475 l 848 475 z "},"¾":{"ha":1153,"x_min":34,"x_max":1119,"o":"m 983 949 l 408 0 l 102 0 l 680 949 l 983 949 m 1051 170 l 1051 0 l 916 0 l 916 170 l 678 170 l 746 475 l 882 475 l 848 305 l 916 305 l 916 475 l 1051 475 l 1051 305 l 1102 305 l 1119 170 l 1051 170 m 136 643 l 136 779 l 238 779 q 273 796 273 779 q 238 813 273 813 l 51 813 l 34 949 l 238 949 q 408 796 408 949 q 374 711 408 741 q 408 626 408 682 q 238 473 408 473 l 51 473 l 34 609 l 238 609 q 273 626 273 609 q 238 643 273 643 l 136 643 z "},"¿":{"ha":882,"x_min":68,"x_max":814,"o":"m 203 339 l 203 610 l 475 610 l 475 541 q 814 311 814 522 q 407 0 814 0 l 68 0 l 68 271 l 441 271 q 509 311 509 271 q 441 339 509 339 l 203 339 m 475 949 l 475 678 l 203 678 l 203 949 l 475 949 z "},"À":{"ha":780,"x_min":-197,"x_max":882,"o":"m 452 1165 l 882 0 l 291 0 l 394 271 l 519 271 l 407 610 l 68 -271 l -197 -271 l 253 903 l 357 1165 l 314 1165 l 246 1369 l 450 1369 l 517 1165 l 452 1165 z "},"Á":{"ha":780,"x_min":-197,"x_max":882,"o":"m 457 1153 l 882 0 l 291 0 l 394 271 l 519 271 l 407 610 l 68 -271 l -197 -271 l 253 903 l 353 1153 l 293 1153 l 361 1356 l 564 1356 l 496 1153 l 457 1153 z "},"Â":{"ha":780,"x_min":-197,"x_max":882,"o":"m 482 1085 l 882 0 l 291 0 l 394 271 l 519 271 l 407 610 l 68 -271 l -197 -271 l 253 903 l 326 1085 l 136 1085 l 407 1356 l 678 1085 l 482 1085 z "},"Ã":{"ha":780,"x_min":-197,"x_max":882,"o":"m 465 1132 l 882 0 l 291 0 l 394 271 l 519 271 l 407 610 l 68 -271 l -197 -271 l 253 903 l 358 1167 q 285 1176 324 1176 q 136 1149 217 1176 l 136 1369 q 285 1396 217 1396 q 407 1369 353 1396 q 486 1351 444 1351 q 678 1424 570 1351 l 678 1204 q 486 1131 570 1131 q 465 1132 475 1131 z "},"Ä":{"ha":780,"x_min":-197,"x_max":882,"o":"m 407 1289 l 882 0 l 291 0 l 394 271 l 519 271 l 407 610 l 68 -271 l -197 -271 l 253 903 l 407 1289 m 237 1153 q 165 1183 195 1153 q 136 1255 136 1213 q 165 1326 136 1297 q 237 1356 195 1356 q 309 1326 279 1356 q 339 1255 339 1297 q 309 1183 339 1213 q 237 1153 279 1153 m 576 1153 q 505 1183 534 1153 q 475 1255 475 1213 q 505 1326 475 1297 q 576 1356 534 1356 q 648 1326 618 1356 q 678 1255 678 1297 q 648 1183 678 1213 q 576 1153 618 1153 z "},"Å":{"ha":780,"x_min":-197,"x_max":882,"o":"m 407 1121 q 455 1141 435 1121 q 475 1189 475 1161 q 455 1237 475 1217 q 407 1257 435 1257 q 359 1237 379 1257 q 339 1189 339 1217 q 359 1141 339 1161 q 407 1121 379 1121 m 497 1043 l 882 0 l 291 0 l 394 271 l 519 271 l 407 610 l 68 -271 l -197 -271 l 253 903 l 311 1047 q 287 1067 298 1055 q 237 1187 237 1116 q 287 1307 237 1257 q 407 1356 336 1356 q 527 1307 477 1356 q 576 1187 576 1257 q 527 1067 576 1116 q 497 1043 513 1053 z "},"Æ":{"ha":1289,"x_min":-197,"x_max":1221,"o":"m 514 949 l 1221 949 l 1221 678 l 814 678 l 814 271 l 1221 271 l 1221 0 l 291 0 l 394 271 l 519 271 l 407 610 l 68 -271 l -197 -271 l 253 903 l 407 1289 l 514 949 m 882 610 l 1221 610 l 1221 339 l 882 339 l 882 610 z "},"Ç":{"ha":814,"x_min":0,"x_max":746,"o":"m 441 1 q 139 139 266 12 q 0 475 0 278 q 139 810 0 671 q 475 949 278 949 l 746 949 l 746 678 l 475 678 q 331 618 391 678 q 271 475 271 559 q 331 331 271 391 q 475 271 391 271 l 746 271 l 746 0 l 509 0 l 509 -24 q 644 -126 644 -24 q 509 -228 644 -228 l 407 -228 l 407 -160 l 475 -160 q 559 -143 543 -160 q 568 -126 568 -134 q 555 -105 568 -117 q 441 -92 543 -92 l 441 1 z "},"È":{"ha":814,"x_min":-68,"x_max":746,"o":"m 407 610 l 746 610 l 746 339 l 407 339 l 407 610 m 746 949 l 746 678 l 340 678 l 340 271 l 746 271 l 746 0 l 68 0 l 68 814 l -68 949 l 746 949 m 305 1017 l 237 1221 l 441 1221 l 509 1017 l 305 1017 z "},"É":{"ha":814,"x_min":-68,"x_max":746,"o":"m 407 610 l 746 610 l 746 339 l 407 339 l 407 610 m 746 949 l 746 678 l 340 678 l 340 271 l 746 271 l 746 0 l 68 0 l 68 814 l -68 949 l 746 949 m 509 1017 l 305 1017 l 373 1221 l 576 1221 l 509 1017 z "},"Ê":{"ha":814,"x_min":-68,"x_max":746,"o":"m 407 610 l 746 610 l 746 339 l 407 339 l 407 610 m 746 949 l 746 678 l 340 678 l 340 271 l 746 271 l 746 0 l 68 0 l 68 814 l -68 949 l 746 949 m 407 1289 l 678 1017 l 475 1017 l 407 1085 l 339 1017 l 136 1017 l 407 1289 z "},"Ë":{"ha":814,"x_min":-68,"x_max":746,"o":"m 407 610 l 746 610 l 746 339 l 407 339 l 407 610 m 746 949 l 746 678 l 340 678 l 340 271 l 746 271 l 746 0 l 68 0 l 68 814 l -68 949 l 746 949 m 274 1017 q 202 1047 232 1017 q 172 1119 172 1077 q 202 1191 172 1161 q 274 1221 232 1221 q 346 1191 316 1221 q 376 1119 376 1161 q 346 1047 376 1077 q 274 1017 316 1017 m 545 1017 q 473 1047 503 1017 q 444 1119 444 1077 q 473 1191 444 1161 q 545 1221 503 1221 q 617 1191 587 1221 q 647 1119 647 1161 q 617 1047 647 1077 q 545 1017 587 1017 z "},"Ì":{"ha":407,"x_min":68,"x_max":340,"o":"m 340 949 l 340 0 l 68 0 l 68 949 l 340 949 m 136 1017 l 68 1221 l 271 1221 l 339 1017 l 136 1017 z "},"Í":{"ha":407,"x_min":68,"x_max":340,"o":"m 340 949 l 340 0 l 68 0 l 68 949 l 340 949 m 271 1017 l 68 1017 l 136 1221 l 339 1221 l 271 1017 z "},"Î":{"ha":407,"x_min":-68,"x_max":475,"o":"m 340 949 l 340 0 l 68 0 l 68 949 l 340 949 m 203 1289 l 475 1017 l 271 1017 l 203 1085 l 136 1017 l -68 1017 l 203 1289 z "},"Ï":{"ha":407,"x_min":-35,"x_max":440,"o":"m 340 949 l 340 0 l 68 0 l 68 949 l 340 949 m 67 1017 q -5 1047 25 1017 q -35 1119 -35 1077 q -5 1191 -35 1161 q 67 1221 25 1221 q 139 1191 109 1221 q 169 1119 169 1161 q 139 1047 169 1077 q 67 1017 109 1017 m 338 1017 q 267 1047 296 1017 q 237 1119 237 1077 q 267 1191 237 1161 q 338 1221 296 1221 q 410 1191 380 1221 q 440 1119 440 1161 q 410 1047 440 1077 q 338 1017 380 1017 z "},"Ð":{"ha":882,"x_min":-68,"x_max":882,"o":"m 68 543 l 68 882 l 1 949 l 408 949 q 743 810 604 949 q 882 475 882 671 q 743 139 882 278 q 408 0 604 0 l 68 0 l 68 407 l -68 407 l -68 543 l 68 543 m 340 543 l 475 543 l 475 407 l 340 407 l 340 271 l 408 271 q 551 331 492 271 q 611 475 611 391 q 551 618 611 559 q 408 678 492 678 l 340 678 l 340 543 z "},"Ñ":{"ha":1017,"x_min":68,"x_max":949,"o":"m 949 949 l 949 -136 l 339 407 l 339 0 l 68 0 l 68 1085 l 678 509 l 678 814 l 543 949 l 949 949 m 235 1036 l 235 1256 q 384 1283 316 1283 q 506 1256 452 1283 q 585 1238 543 1238 q 777 1311 669 1238 l 777 1090 q 585 1017 669 1017 q 506 1036 543 1017 q 384 1063 452 1063 q 235 1036 316 1063 z "},"Ò":{"ha":949,"x_min":0,"x_max":949,"o":"m 475 0 q 139 139 278 0 q 0 475 0 278 q 139 810 0 671 q 475 949 278 949 q 810 810 671 949 q 949 475 949 671 q 810 139 949 278 q 475 0 671 0 m 475 271 q 618 331 559 271 q 678 475 678 391 q 618 618 678 559 q 475 678 559 678 q 331 618 391 678 q 271 475 271 559 q 331 331 271 391 q 475 271 391 271 m 407 1017 l 339 1221 l 543 1221 l 610 1017 l 407 1017 z "},"Ó":{"ha":949,"x_min":0,"x_max":949,"o":"m 475 0 q 139 139 278 0 q 0 475 0 278 q 139 810 0 671 q 475 949 278 949 q 810 810 671 949 q 949 475 949 671 q 810 139 949 278 q 475 0 671 0 m 475 271 q 618 331 559 271 q 678 475 678 391 q 618 618 678 559 q 475 678 559 678 q 331 618 391 678 q 271 475 271 559 q 331 331 271 391 q 475 271 391 271 m 543 1017 l 339 1017 l 407 1221 l 610 1221 l 543 1017 z "},"Ô":{"ha":949,"x_min":0,"x_max":949,"o":"m 475 0 q 139 139 278 0 q 0 475 0 278 q 139 810 0 671 q 475 949 278 949 q 810 810 671 949 q 949 475 949 671 q 810 139 949 278 q 475 0 671 0 m 475 271 q 618 331 559 271 q 678 475 678 391 q 618 618 678 559 q 475 678 559 678 q 331 618 391 678 q 271 475 271 559 q 331 331 271 391 q 475 271 391 271 m 475 1289 l 746 1017 l 543 1017 l 475 1085 l 407 1017 l 203 1017 l 475 1289 z "},"Õ":{"ha":949,"x_min":0,"x_max":949,"o":"m 475 0 q 139 139 278 0 q 0 475 0 278 q 139 810 0 671 q 475 949 278 949 q 810 810 671 949 q 949 475 949 671 q 810 139 949 278 q 475 0 671 0 m 475 271 q 618 331 559 271 q 678 475 678 391 q 618 618 678 559 q 475 678 559 678 q 331 618 391 678 q 271 475 271 559 q 331 331 271 391 q 475 271 391 271 m 203 1013 l 203 1234 q 353 1261 285 1261 q 475 1234 420 1261 q 553 1215 511 1215 q 746 1289 637 1215 l 746 1068 q 553 995 637 995 q 475 1013 511 995 q 353 1040 420 1040 q 203 1013 285 1040 z "},"Ö":{"ha":949,"x_min":0,"x_max":949,"o":"m 618 331 q 648 361 618 331 q 678 475 678 391 q 618 618 678 559 q 475 678 559 678 q 331 618 391 678 q 271 475 271 559 q 331 331 271 391 q 475 271 391 271 q 618 331 559 271 m 475 0 q 139 139 278 0 q 0 475 0 278 q 139 810 0 671 q 475 949 278 949 q 810 810 671 949 q 949 475 949 671 q 810 139 949 278 q 475 0 671 0 m 340 1017 q 269 1047 298 1017 q 239 1119 239 1077 q 269 1191 239 1161 q 340 1221 298 1221 q 412 1191 382 1221 q 442 1119 442 1161 q 412 1047 442 1077 q 340 1017 382 1017 m 612 1017 q 540 1047 570 1017 q 510 1119 510 1077 q 540 1191 510 1161 q 612 1221 570 1221 q 684 1191 654 1221 q 713 1119 713 1161 q 684 1047 713 1077 q 612 1017 654 1017 z "},"×":{"ha":826,"x_min":34,"x_max":792,"o":"m 405 245 l 341 136 l 34 136 l 257 475 l 35 814 l 341 814 l 407 703 l 482 813 l 792 814 l 565 473 l 792 136 l 477 136 l 405 245 z "},"Ø":{"ha":951,"x_min":-3,"x_max":946,"o":"m 435 675 q 328 618 374 665 q 268 475 268 559 q 288 385 268 425 l 435 675 m 514 275 q 615 331 571 287 q 675 475 675 391 q 656 561 675 522 l 514 275 m 789 827 q 807 810 798 819 q 946 475 946 671 q 807 139 946 278 q 471 0 668 0 q 380 8 425 0 l 309 -136 l 26 -136 l 155 121 q 136 139 145 130 q -3 475 -3 278 q 136 810 -3 671 q 471 949 275 949 q 569 940 522 949 l 642 1085 l 918 1085 l 789 827 z "},"Ù":{"ha":949,"x_min":-68,"x_max":882,"o":"m 339 949 l 339 475 q 475 271 339 271 q 610 475 610 271 l 610 814 l 475 949 l 882 949 l 882 475 q 475 0 882 0 q 68 475 68 0 l 68 814 l -68 949 l 339 949 m 339 1017 l 271 1221 l 475 1221 l 543 1017 l 339 1017 z "},"Ú":{"ha":949,"x_min":-68,"x_max":882,"o":"m 339 949 l 339 475 q 475 271 339 271 q 610 475 610 271 l 610 814 l 475 949 l 882 949 l 882 475 q 475 0 882 0 q 68 475 68 0 l 68 814 l -68 949 l 339 949 m 543 1017 l 339 1017 l 407 1221 l 610 1221 l 543 1017 z "},"Û":{"ha":949,"x_min":-68,"x_max":882,"o":"m 339 949 l 339 475 q 475 271 339 271 q 610 475 610 271 l 610 814 l 475 949 l 882 949 l 882 475 q 475 0 882 0 q 68 475 68 0 l 68 814 l -68 949 l 339 949 m 475 1289 l 746 1017 l 543 1017 l 475 1085 l 407 1017 l 203 1017 l 475 1289 z "},"Ü":{"ha":949,"x_min":-68,"x_max":882,"o":"m 339 949 l 339 475 q 475 271 339 271 q 610 475 610 271 l 610 814 l 475 949 l 882 949 l 882 475 q 475 0 882 0 q 68 475 68 0 l 68 814 l -68 949 l 339 949 m 339 1017 q 267 1047 297 1017 q 237 1119 237 1077 q 267 1191 237 1161 q 339 1221 297 1221 q 411 1191 381 1221 q 441 1119 441 1161 q 411 1047 441 1077 q 339 1017 381 1017 m 610 1017 q 538 1047 568 1017 q 509 1119 509 1077 q 538 1191 509 1161 q 610 1221 568 1221 q 682 1191 652 1221 q 712 1119 712 1161 q 682 1047 712 1077 q 610 1017 652 1017 z "},"Ý":{"ha":832,"x_min":-68,"x_max":882,"o":"m 269 441 l -68 949 l 239 949 l 405 703 l 574 949 l 882 949 l 541 441 l 541 -271 l 269 -271 l 269 441 m 499 1017 l 296 1017 l 363 1221 l 567 1221 l 499 1017 z "},"Þ":{"ha":883,"x_min":73,"x_max":887,"o":"m 345 916 l 548 916 q 887 543 887 916 q 548 170 887 170 l 345 170 l 345 0 l 73 0 l 73 1051 l 345 1051 l 345 916 m 345 441 l 548 441 q 616 543 616 441 q 548 644 616 644 l 345 644 l 345 441 z "},"ß":{"ha":881,"x_min":73,"x_max":887,"o":"m 480 610 q 548 661 548 610 q 480 712 548 712 l 345 712 l 345 610 l 480 610 m 345 0 l 73 0 l 73 949 l 480 949 q 768 814 684 949 q 807 690 807 752 q 751 543 807 616 q 887 339 887 475 q 548 0 887 0 l 412 0 l 412 271 l 548 271 q 616 339 616 271 q 548 407 616 407 l 345 407 l 345 0 z "},"à":{"ha":780,"x_min":-197,"x_max":882,"o":"m 452 1165 l 882 0 l 291 0 l 394 271 l 519 271 l 407 610 l 68 -271 l -197 -271 l 253 903 l 357 1165 l 314 1165 l 246 1369 l 450 1369 l 517 1165 l 452 1165 z "},"á":{"ha":780,"x_min":-197,"x_max":882,"o":"m 457 1153 l 882 0 l 291 0 l 394 271 l 519 271 l 407 610 l 68 -271 l -197 -271 l 253 903 l 353 1153 l 293 1153 l 361 1356 l 564 1356 l 496 1153 l 457 1153 z "},"â":{"ha":780,"x_min":-197,"x_max":882,"o":"m 482 1085 l 882 0 l 291 0 l 394 271 l 519 271 l 407 610 l 68 -271 l -197 -271 l 253 903 l 326 1085 l 136 1085 l 407 1356 l 678 1085 l 482 1085 z "},"ã":{"ha":780,"x_min":-197,"x_max":882,"o":"m 465 1132 l 882 0 l 291 0 l 394 271 l 519 271 l 407 610 l 68 -271 l -197 -271 l 253 903 l 358 1167 q 285 1176 324 1176 q 136 1149 217 1176 l 136 1369 q 285 1396 217 1396 q 407 1369 353 1396 q 486 1351 444 1351 q 678 1424 570 1351 l 678 1204 q 486 1131 570 1131 q 465 1132 475 1131 z "},"ä":{"ha":780,"x_min":-197,"x_max":882,"o":"m 407 1289 l 882 0 l 291 0 l 394 271 l 519 271 l 407 610 l 68 -271 l -197 -271 l 253 903 l 407 1289 m 237 1153 q 165 1183 195 1153 q 136 1255 136 1213 q 165 1326 136 1297 q 237 1356 195 1356 q 309 1326 279 1356 q 339 1255 339 1297 q 309 1183 339 1213 q 237 1153 279 1153 m 576 1153 q 505 1183 534 1153 q 475 1255 475 1213 q 505 1326 475 1297 q 576 1356 534 1356 q 648 1326 618 1356 q 678 1255 678 1297 q 648 1183 678 1213 q 576 1153 618 1153 z "},"å":{"ha":780,"x_min":-197,"x_max":882,"o":"m 407 1121 q 455 1141 435 1121 q 475 1189 475 1161 q 455 1237 475 1217 q 407 1257 435 1257 q 359 1237 379 1257 q 339 1189 339 1217 q 359 1141 339 1161 q 407 1121 379 1121 m 497 1043 l 882 0 l 291 0 l 394 271 l 519 271 l 407 610 l 68 -271 l -197 -271 l 253 903 l 311 1047 q 287 1067 298 1055 q 237 1187 237 1116 q 287 1307 237 1257 q 407 1356 336 1356 q 527 1307 477 1356 q 576 1187 576 1257 q 527 1067 576 1116 q 497 1043 513 1053 z "},"æ":{"ha":1289,"x_min":-197,"x_max":1221,"o":"m 514 949 l 1221 949 l 1221 678 l 814 678 l 814 271 l 1221 271 l 1221 0 l 291 0 l 394 271 l 519 271 l 407 610 l 68 -271 l -197 -271 l 253 903 l 407 1289 l 514 949 m 882 610 l 1221 610 l 1221 339 l 882 339 l 882 610 z "},"ç":{"ha":814,"x_min":0,"x_max":746,"o":"m 441 1 q 139 139 266 12 q 0 475 0 278 q 139 810 0 671 q 475 949 278 949 l 746 949 l 746 678 l 475 678 q 331 618 391 678 q 271 475 271 559 q 331 331 271 391 q 475 271 391 271 l 746 271 l 746 0 l 509 0 l 509 -24 q 644 -126 644 -24 q 509 -228 644 -228 l 407 -228 l 407 -160 l 475 -160 q 559 -143 543 -160 q 568 -126 568 -134 q 555 -105 568 -117 q 441 -92 543 -92 l 441 1 z "},"è":{"ha":814,"x_min":-68,"x_max":746,"o":"m 407 610 l 746 610 l 746 339 l 407 339 l 407 610 m 746 949 l 746 678 l 340 678 l 340 271 l 746 271 l 746 0 l 68 0 l 68 814 l -68 949 l 746 949 m 305 1017 l 237 1221 l 441 1221 l 509 1017 l 305 1017 z "},"é":{"ha":814,"x_min":-68,"x_max":746,"o":"m 407 610 l 746 610 l 746 339 l 407 339 l 407 610 m 746 949 l 746 678 l 340 678 l 340 271 l 746 271 l 746 0 l 68 0 l 68 814 l -68 949 l 746 949 m 509 1017 l 305 1017 l 373 1221 l 576 1221 l 509 1017 z "},"ê":{"ha":814,"x_min":-68,"x_max":746,"o":"m 407 610 l 746 610 l 746 339 l 407 339 l 407 610 m 746 949 l 746 678 l 340 678 l 340 271 l 746 271 l 746 0 l 68 0 l 68 814 l -68 949 l 746 949 m 407 1289 l 678 1017 l 475 1017 l 407 1085 l 339 1017 l 136 1017 l 407 1289 z "},"ë":{"ha":814,"x_min":-68,"x_max":746,"o":"m 407 610 l 746 610 l 746 339 l 407 339 l 407 610 m 746 949 l 746 678 l 340 678 l 340 271 l 746 271 l 746 0 l 68 0 l 68 814 l -68 949 l 746 949 m 274 1017 q 202 1047 232 1017 q 172 1119 172 1077 q 202 1191 172 1161 q 274 1221 232 1221 q 346 1191 316 1221 q 376 1119 376 1161 q 346 1047 376 1077 q 274 1017 316 1017 m 545 1017 q 473 1047 503 1017 q 444 1119 444 1077 q 473 1191 444 1161 q 545 1221 503 1221 q 617 1191 587 1221 q 647 1119 647 1161 q 617 1047 647 1077 q 545 1017 587 1017 z "},"ì":{"ha":407,"x_min":68,"x_max":340,"o":"m 340 949 l 340 0 l 68 0 l 68 949 l 340 949 m 136 1017 l 68 1221 l 271 1221 l 339 1017 l 136 1017 z "},"í":{"ha":407,"x_min":68,"x_max":340,"o":"m 340 949 l 340 0 l 68 0 l 68 949 l 340 949 m 271 1017 l 68 1017 l 136 1221 l 339 1221 l 271 1017 z "},"î":{"ha":407,"x_min":-68,"x_max":475,"o":"m 340 949 l 340 0 l 68 0 l 68 949 l 340 949 m 203 1289 l 475 1017 l 271 1017 l 203 1085 l 136 1017 l -68 1017 l 203 1289 z "},"ï":{"ha":407,"x_min":-35,"x_max":440,"o":"m 340 949 l 340 0 l 68 0 l 68 949 l 340 949 m 67 1017 q -5 1047 25 1017 q -35 1119 -35 1077 q -5 1191 -35 1161 q 67 1221 25 1221 q 139 1191 109 1221 q 169 1119 169 1161 q 139 1047 169 1077 q 67 1017 109 1017 m 338 1017 q 267 1047 296 1017 q 237 1119 237 1077 q 267 1191 237 1161 q 338 1221 296 1221 q 410 1191 380 1221 q 440 1119 440 1161 q 410 1047 440 1077 q 338 1017 380 1017 z "},"ð":{"ha":949,"x_min":0,"x_max":949,"o":"m 678 475 q 618 618 678 559 q 475 678 559 678 q 331 618 391 678 q 271 475 271 559 q 331 331 271 391 q 475 271 391 271 q 618 331 559 271 q 678 475 678 391 m 503 1144 l 834 787 l 833 786 q 949 475 949 654 q 810 139 949 278 q 475 0 671 0 q 139 139 278 0 q 0 475 0 278 q 139 810 0 671 q 337 930 227 898 l 296 976 l 197 897 l 79 1032 l 178 1111 l 115 1178 l 315 1343 l 379 1278 l 473 1352 l 604 1225 l 503 1144 z "},"ñ":{"ha":1017,"x_min":68,"x_max":949,"o":"m 949 949 l 949 -136 l 339 407 l 339 0 l 68 0 l 68 1085 l 678 509 l 678 814 l 543 949 l 949 949 m 235 1036 l 235 1256 q 384 1283 316 1283 q 506 1256 452 1283 q 585 1238 543 1238 q 777 1311 669 1238 l 777 1090 q 585 1017 669 1017 q 506 1036 543 1017 q 384 1063 452 1063 q 235 1036 316 1063 z "},"ò":{"ha":949,"x_min":0,"x_max":949,"o":"m 475 0 q 139 139 278 0 q 0 475 0 278 q 139 810 0 671 q 475 949 278 949 q 810 810 671 949 q 949 475 949 671 q 810 139 949 278 q 475 0 671 0 m 475 271 q 618 331 559 271 q 678 475 678 391 q 618 618 678 559 q 475 678 559 678 q 331 618 391 678 q 271 475 271 559 q 331 331 271 391 q 475 271 391 271 m 407 1017 l 339 1221 l 543 1221 l 610 1017 l 407 1017 z "},"ó":{"ha":949,"x_min":0,"x_max":949,"o":"m 475 0 q 139 139 278 0 q 0 475 0 278 q 139 810 0 671 q 475 949 278 949 q 810 810 671 949 q 949 475 949 671 q 810 139 949 278 q 475 0 671 0 m 475 271 q 618 331 559 271 q 678 475 678 391 q 618 618 678 559 q 475 678 559 678 q 331 618 391 678 q 271 475 271 559 q 331 331 271 391 q 475 271 391 271 m 543 1017 l 339 1017 l 407 1221 l 610 1221 l 543 1017 z "},"ô":{"ha":949,"x_min":0,"x_max":949,"o":"m 475 0 q 139 139 278 0 q 0 475 0 278 q 139 810 0 671 q 475 949 278 949 q 810 810 671 949 q 949 475 949 671 q 810 139 949 278 q 475 0 671 0 m 475 271 q 618 331 559 271 q 678 475 678 391 q 618 618 678 559 q 475 678 559 678 q 331 618 391 678 q 271 475 271 559 q 331 331 271 391 q 475 271 391 271 m 475 1289 l 746 1017 l 543 1017 l 475 1085 l 407 1017 l 203 1017 l 475 1289 z "},"õ":{"ha":949,"x_min":0,"x_max":949,"o":"m 475 0 q 139 139 278 0 q 0 475 0 278 q 139 810 0 671 q 475 949 278 949 q 810 810 671 949 q 949 475 949 671 q 810 139 949 278 q 475 0 671 0 m 475 271 q 618 331 559 271 q 678 475 678 391 q 618 618 678 559 q 475 678 559 678 q 331 618 391 678 q 271 475 271 559 q 331 331 271 391 q 475 271 391 271 m 203 1013 l 203 1234 q 353 1261 285 1261 q 475 1234 420 1261 q 553 1215 511 1215 q 746 1289 637 1215 l 746 1068 q 553 995 637 995 q 475 1013 511 995 q 353 1040 420 1040 q 203 1013 285 1040 z "},"ö":{"ha":949,"x_min":0,"x_max":949,"o":"m 618 331 q 648 361 618 331 q 678 475 678 391 q 618 618 678 559 q 475 678 559 678 q 331 618 391 678 q 271 475 271 559 q 331 331 271 391 q 475 271 391 271 q 618 331 559 271 m 475 0 q 139 139 278 0 q 0 475 0 278 q 139 810 0 671 q 475 949 278 949 q 810 810 671 949 q 949 475 949 671 q 810 139 949 278 q 475 0 671 0 m 340 1017 q 269 1047 298 1017 q 239 1119 239 1077 q 269 1191 239 1161 q 340 1221 298 1221 q 412 1191 382 1221 q 442 1119 442 1161 q 412 1047 442 1077 q 340 1017 382 1017 m 612 1017 q 540 1047 570 1017 q 510 1119 510 1077 q 540 1191 510 1161 q 612 1221 570 1221 q 684 1191 654 1221 q 713 1119 713 1161 q 684 1047 713 1077 q 612 1017 654 1017 z "},"÷":{"ha":814,"x_min":68,"x_max":746,"o":"m 746 610 l 746 339 l 68 339 l 68 610 l 746 610 m 543 678 l 271 678 l 271 949 l 543 949 l 543 678 m 543 0 l 271 0 l 271 271 l 543 271 l 543 0 z "},"ø":{"ha":951,"x_min":-3,"x_max":946,"o":"m 435 675 q 328 618 374 665 q 268 475 268 559 q 288 385 268 425 l 435 675 m 514 275 q 615 331 571 287 q 675 475 675 391 q 656 561 675 522 l 514 275 m 789 827 q 807 810 798 819 q 946 475 946 671 q 807 139 946 278 q 471 0 668 0 q 380 8 425 0 l 309 -136 l 26 -136 l 155 121 q 136 139 145 130 q -3 475 -3 278 q 136 810 -3 671 q 471 949 275 949 q 569 940 522 949 l 642 1085 l 918 1085 l 789 827 z "},"ù":{"ha":949,"x_min":-68,"x_max":882,"o":"m 339 949 l 339 475 q 475 271 339 271 q 610 475 610 271 l 610 814 l 475 949 l 882 949 l 882 475 q 475 0 882 0 q 68 475 68 0 l 68 814 l -68 949 l 339 949 m 339 1017 l 271 1221 l 475 1221 l 543 1017 l 339 1017 z "},"ú":{"ha":949,"x_min":-68,"x_max":882,"o":"m 339 949 l 339 475 q 475 271 339 271 q 610 475 610 271 l 610 814 l 475 949 l 882 949 l 882 475 q 475 0 882 0 q 68 475 68 0 l 68 814 l -68 949 l 339 949 m 543 1017 l 339 1017 l 407 1221 l 610 1221 l 543 1017 z "},"û":{"ha":949,"x_min":-68,"x_max":882,"o":"m 339 949 l 339 475 q 475 271 339 271 q 610 475 610 271 l 610 814 l 475 949 l 882 949 l 882 475 q 475 0 882 0 q 68 475 68 0 l 68 814 l -68 949 l 339 949 m 475 1289 l 746 1017 l 543 1017 l 475 1085 l 407 1017 l 203 1017 l 475 1289 z "},"ü":{"ha":949,"x_min":-68,"x_max":882,"o":"m 339 949 l 339 475 q 475 271 339 271 q 610 475 610 271 l 610 814 l 475 949 l 882 949 l 882 475 q 475 0 882 0 q 68 475 68 0 l 68 814 l -68 949 l 339 949 m 339 1017 q 267 1047 297 1017 q 237 1119 237 1077 q 267 1191 237 1161 q 339 1221 297 1221 q 411 1191 381 1221 q 441 1119 441 1161 q 411 1047 441 1077 q 339 1017 381 1017 m 610 1017 q 538 1047 568 1017 q 509 1119 509 1077 q 538 1191 509 1161 q 610 1221 568 1221 q 682 1191 652 1221 q 712 1119 712 1161 q 682 1047 712 1077 q 610 1017 652 1017 z "},"ý":{"ha":832,"x_min":-68,"x_max":882,"o":"m 269 441 l -68 949 l 239 949 l 405 703 l 574 949 l 882 949 l 541 441 l 541 -271 l 269 -271 l 269 441 m 499 1017 l 296 1017 l 363 1221 l 567 1221 l 499 1017 z "},"þ":{"ha":872,"x_min":73,"x_max":887,"o":"m 345 916 l 548 916 q 887 543 887 916 q 548 170 887 170 l 345 170 l 345 0 l 73 0 l 73 1051 l 345 1051 l 345 916 m 345 441 l 548 441 q 616 543 616 441 q 548 644 616 644 l 345 644 l 345 441 z "},"ÿ":{"ha":832,"x_min":-68,"x_max":882,"o":"m 269 441 l -68 949 l 239 949 l 405 703 l 574 949 l 882 949 l 541 441 l 541 -271 l 269 -271 l 269 441 m 271 1017 q 199 1047 229 1017 q 170 1119 170 1077 q 199 1191 170 1161 q 271 1221 229 1221 q 343 1191 313 1221 q 373 1119 373 1161 q 343 1047 373 1077 q 271 1017 313 1017 m 543 1017 q 471 1047 500 1017 q 441 1119 441 1077 q 471 1191 441 1161 q 543 1221 500 1221 q 614 1191 585 1221 q 644 1119 644 1161 q 614 1047 644 1077 q 543 1017 585 1017 z "},"Œ":{"ha":1424,"x_min":0,"x_max":1356,"o":"m 618 331 q 648 361 618 331 q 678 475 678 391 q 618 618 678 559 q 475 678 559 678 q 331 618 391 678 q 271 475 271 559 q 331 331 271 391 q 475 271 391 271 q 618 331 559 271 m 1017 610 l 1356 610 l 1356 339 l 1017 339 l 1017 610 m 678 44 q 475 0 586 0 q 139 139 278 0 q 0 475 0 278 q 139 810 0 671 q 475 949 278 949 q 678 905 586 949 l 678 949 l 1356 949 l 1356 678 l 950 678 l 950 271 l 1356 271 l 1356 0 l 678 0 l 678 44 z "},"œ":{"ha":1424,"x_min":0,"x_max":1356,"o":"m 618 331 q 648 361 618 331 q 678 475 678 391 q 618 618 678 559 q 475 678 559 678 q 331 618 391 678 q 271 475 271 559 q 331 331 271 391 q 475 271 391 271 q 618 331 559 271 m 1017 610 l 1356 610 l 1356 339 l 1017 339 l 1017 610 m 678 44 q 475 0 586 0 q 139 139 278 0 q 0 475 0 278 q 139 810 0 671 q 475 949 278 949 q 678 905 586 949 l 678 949 l 1356 949 l 1356 678 l 950 678 l 950 271 l 1356 271 l 1356 0 l 678 0 l 678 44 z "},"ɶ":{"ha":1424,"x_min":0,"x_max":1356,"o":"m 618 331 q 648 361 618 331 q 678 475 678 391 q 618 618 678 559 q 475 678 559 678 q 331 618 391 678 q 271 475 271 559 q 331 331 271 391 q 475 271 391 271 q 618 331 559 271 m 1017 610 l 1356 610 l 1356 339 l 1017 339 l 1017 610 m 678 44 q 475 0 586 0 q 139 139 278 0 q 0 475 0 278 q 139 810 0 671 q 475 949 278 949 q 678 905 586 949 l 678 949 l 1356 949 l 1356 678 l 950 678 l 950 271 l 1356 271 l 1356 0 l 678 0 l 678 44 z "},"ˆ":{"ha":746,"x_min":34,"x_max":712,"o":"m 576 1356 l 712 1017 l 441 1017 l 373 1187 l 305 1017 l 34 1017 l 170 1356 l 576 1356 z "},"ˇ":{"ha":746,"x_min":34,"x_max":712,"o":"m 373 1187 l 441 1356 l 712 1356 l 576 1017 l 170 1017 l 34 1356 l 305 1356 l 373 1187 z "},"ˉ":{"ha":610,"x_min":34,"x_max":576,"o":"m 576 1289 l 576 1017 l 34 1017 l 34 1289 l 576 1289 z "},"˙":{"ha":339,"x_min":34,"x_max":305,"o":"m 305 1017 l 34 1017 l 34 1289 l 305 1289 l 305 1017 z "},"˜":{"ha":746,"x_min":68,"x_max":610,"o":"m 68 1013 l 68 1234 q 217 1261 149 1261 q 339 1234 285 1261 q 418 1215 376 1215 q 610 1289 502 1215 l 610 1068 q 418 995 502 995 q 339 1013 376 995 q 217 1040 285 1040 q 68 1013 149 1040 z "},"˝":{"ha":845,"x_min":34,"x_max":811,"o":"m 305 610 l 34 610 l 170 949 l 441 949 l 305 610 m 675 610 l 404 610 l 540 949 l 811 949 l 675 610 z "},"̀":{"ha":475,"x_min":136,"x_max":407,"o":"m 203 1017 l 136 1221 l 339 1221 l 407 1017 l 203 1017 z "},"́":{"ha":475,"x_min":136,"x_max":407,"o":"m 339 1017 l 136 1017 l 203 1221 l 407 1221 l 339 1017 z "},"̂":{"ha":610,"x_min":0,"x_max":543,"o":"m 271 1289 l 543 1017 l 339 1017 l 271 1085 l 203 1017 l 0 1017 l 271 1289 z "},"̃":{"ha":746,"x_min":68,"x_max":610,"o":"m 68 1013 l 68 1234 q 217 1261 149 1261 q 339 1234 285 1261 q 418 1215 376 1215 q 610 1289 502 1215 l 610 1068 q 418 995 502 995 q 339 1013 376 995 q 217 1040 285 1040 q 68 1013 149 1040 z "},"̄":{"ha":610,"x_min":34,"x_max":576,"o":"m 576 1289 l 576 1017 l 34 1017 l 34 1289 l 576 1289 z "},"̅":{"ha":610,"x_min":34,"x_max":576,"o":"m 576 1289 l 576 1017 l 34 1017 l 34 1289 l 576 1289 z "},"̆":{"ha":610,"x_min":34,"x_max":576,"o":"m 543 1289 l 576 1017 q 305 983 441 983 q 34 1017 170 983 l 68 1289 q 305 1255 186 1255 q 543 1289 424 1255 z "},"̇":{"ha":339,"x_min":34,"x_max":305,"o":"m 305 1017 l 34 1017 l 34 1289 l 305 1289 l 305 1017 z "},"̈":{"ha":678,"x_min":34,"x_max":644,"o":"m 305 1017 l 34 1017 l 34 1289 l 305 1289 l 305 1017 m 644 1017 l 373 1017 l 373 1289 l 644 1289 l 644 1017 z "},"̉":{"ha":358,"x_min":34,"x_max":324,"o":"m 237 1221 q 170 1289 237 1289 q 102 1187 102 1289 l 34 1187 q 186 1356 34 1356 q 324 1246 324 1356 q 315 1160 324 1234 q 203 1017 305 1085 l 136 1017 q 237 1221 237 1153 z "},"̊":{"ha":373,"x_min":34,"x_max":339,"o":"m 186 1017 q 79 1060 123 1017 q 34 1162 34 1103 q 79 1265 34 1223 q 186 1308 123 1308 q 294 1265 250 1308 q 339 1162 339 1223 q 294 1060 339 1103 q 186 1017 250 1017 m 186 1085 q 247 1110 222 1085 q 271 1170 271 1135 q 247 1230 271 1205 q 186 1255 222 1255 q 126 1230 151 1255 q 102 1170 102 1205 q 126 1110 102 1135 q 186 1085 151 1085 z "},"̋":{"ha":845,"x_min":34,"x_max":811,"o":"m 305 1017 l 34 1017 l 170 1356 l 441 1356 l 305 1017 m 675 1017 l 404 1017 l 540 1356 l 811 1356 l 675 1017 z "},"̌":{"ha":746,"x_min":34,"x_max":712,"o":"m 373 1187 l 441 1356 l 712 1356 l 576 1017 l 170 1017 l 34 1356 l 305 1356 l 373 1187 z "},"̧":{"ha":305,"x_min":34,"x_max":271,"o":"m 68 -102 l 68 34 l 136 34 l 136 -34 q 271 -136 271 -34 q 136 -237 271 -237 l 34 -237 l 34 -170 l 102 -170 q 186 -153 170 -170 q 195 -136 195 -144 q 182 -114 195 -127 q 68 -102 170 -102 z "},"؉":{"ha":1289,"x_min":34,"x_max":1255,"o":"m 916 949 l 340 0 l 34 0 l 612 949 l 916 949 m 305 610 l 34 610 l 34 882 l 305 882 l 305 610 m 916 68 l 644 68 l 644 339 l 916 339 l 916 68 m 1255 68 l 983 68 l 983 339 l 1255 339 l 1255 68 z "},"–":{"ha":814,"x_min":68,"x_max":746,"o":"m 746 610 l 746 339 l 68 339 l 68 610 l 746 610 z "},"—":{"ha":1424,"x_min":68,"x_max":1356,"o":"m 1356 610 l 1356 339 l 68 339 l 68 610 l 1356 610 z "},"‘":{"ha":339,"x_min":34,"x_max":305,"o":"m 305 949 l 271 543 l 68 543 l 34 949 l 305 949 z "},"’":{"ha":339,"x_min":34,"x_max":305,"o":"m 305 949 l 271 543 l 68 543 l 34 949 l 305 949 z "},"‚":{"ha":339,"x_min":34,"x_max":305,"o":"m 305 136 l 305 -271 l 34 -271 l 34 136 l 305 136 z "},"“":{"ha":678,"x_min":34,"x_max":644,"o":"m 305 949 l 271 543 l 68 543 l 34 949 l 305 949 m 644 949 l 610 543 l 407 543 l 373 949 l 644 949 z "},"”":{"ha":678,"x_min":34,"x_max":644,"o":"m 305 949 l 271 543 l 68 543 l 34 949 l 305 949 m 644 949 l 610 543 l 407 543 l 373 949 l 644 949 z "},"„":{"ha":678,"x_min":34,"x_max":644,"o":"m 305 136 l 305 -271 l 34 -271 l 34 136 l 305 136 m 644 136 l 644 -271 l 373 -271 l 373 136 l 644 136 z "},"•":{"ha":339,"x_min":34,"x_max":305,"o":"m 170 339 q 74 379 113 339 q 34 475 34 418 q 74 571 34 531 q 170 610 113 610 q 266 571 226 610 q 305 475 305 531 q 266 379 305 418 q 170 339 226 339 z "},"…":{"ha":1153,"x_min":34,"x_max":1119,"o":"m 305 0 l 34 0 l 34 271 l 305 271 l 305 0 m 712 0 l 441 0 l 441 271 l 712 271 l 712 0 m 1119 0 l 848 0 l 848 271 l 1119 271 l 1119 0 z "},"‹":{"ha":882,"x_min":68,"x_max":814,"o":"m 68 610 l 814 949 l 814 678 l 339 475 l 814 271 l 814 0 l 68 339 l 68 610 z "},"›":{"ha":882,"x_min":68,"x_max":814,"o":"m 814 339 l 68 0 l 68 271 l 543 475 l 68 678 l 68 949 l 814 610 l 814 339 z "},"€":{"ha":968,"x_min":-68,"x_max":968,"o":"m 77 575 q 207 810 104 708 q 475 945 321 925 q 543 951 509 951 q 610 945 576 951 q 878 810 764 925 q 968 689 935 754 l 726 564 q 686 618 711 593 q 543 678 627 678 q 399 618 458 678 q 365 575 378 598 l 610 575 l 610 507 l 341 507 q 339 475 339 492 q 342 439 339 456 l 610 439 l 610 372 l 367 372 q 399 331 380 350 q 543 271 458 271 q 686 331 627 271 q 715 367 703 348 l 945 221 q 878 139 917 178 q 610 4 764 24 q 543 0 576 0 q 475 4 509 0 q 207 139 321 24 q 78 372 106 240 l -68 372 l -68 439 l 69 439 q 68 475 68 457 q 68 507 68 491 l -68 507 l -68 575 l 77 575 z "},"™":{"ha":796,"x_min":34,"x_max":762,"o":"m 239 853 l 239 610 l 142 610 l 142 853 l 34 853 l 34 950 l 349 950 l 349 853 l 239 853 m 762 950 l 762 610 l 665 610 l 665 772 l 616 610 l 519 610 l 471 772 l 471 610 l 374 610 l 374 950 l 495 950 l 568 756 l 641 950 l 762 950 z "},"−":{"ha":746,"x_min":34,"x_max":712,"o":"m 712 610 l 712 339 l 34 339 l 34 610 l 712 610 z "}},"familyName":"Maximum Voltage","ascender":1424,"descender":-271,"underlinePosition":-147,"underlineThickness":102,"boundingBox":{"yMin":-271,"xMin":-197,"yMax":1424,"xMax":1492},"resolution":1000,"original_font_information":{"format":0,"copyright":"Typeface © Darrell Flood. 2024. All Rights Reserved","fontFamily":"Maximum Voltage","fontSubfamily":"Regular","uniqueID":"Maximum Voltage:Version 1.00","fullName":"Maximum Voltage","version":"Version 1.00;June 23, 2024;FontCreator 12.0.0.2567 64-bit","postScriptName":"MaximumVoltage","description":"This font was created using FontCreator 12 from High-Logic.com"},"cssFontWeight":"normal","cssFontStyle":"normal"} \ No newline at end of file diff --git a/air-quality-ui/public/NaturalEarthCoastline2.jpg b/air-quality-ui/public/NaturalEarthCoastline2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a7aa80dfa7dcabf27f951e19a58943e1192fa795 GIT binary patch literal 155744 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 E2i+QX-v9sr literal 0 HcmV?d00001 diff --git a/air-quality-ui/public/all_colormaps.png b/air-quality-ui/public/all_colormaps.png new file mode 100644 index 0000000000000000000000000000000000000000..ea79254290bda2f44b11b2f5841f16013be9793e GIT binary patch literal 1436 zcmV;N1!MY&P)V>bE;TMPEFfrfbZ~PzFE4FjbZ~5MbZlv2E^l&Y zFDf=4MF0Q*32;bRa{vGjVE_ORVF9Q=r)dBH1qn$+K~#90RgKGT+|~hxze670L~_U( zX-0NzNsg6xks@x;tb#6zZoBRi^d-gyT%y?CLLf8 z31@AFsqRSg4?N3m*p)Zjs+!xmWhWbCJW3orFq)Q^Qu5D0@HkR@camY;BQXt|$-GC@@x8<0_L5J#E7Dx!^*LhPA}4Di9M6&MubBs*)#%_&F1c{XZJ$;q z4AMt+wZI*rY%dv=VbjgT zwZQQmwCB+K7G>~+E}yXvA&)*>vU>lT@87+pes^H^ZsKii^G3|P9}O~{cO)hvw3eK? z6Sm{xdk!jc_^=YB8+dZM;Npir5w3lbjm=lfCD&=p({CJ}{_ucr&#(CHfx>m^4w?JET#-+3p4lW$J6Yjf)gY4MbJv&A+J=2aFX=_q3BE^7h zX^bUMw#3*T+6Hag$f{FJbx%fTh>{;EgHIfj9sBixohrCf19!?}rvmP}fPLdr zG!k7~$OhcnU{^MxwwN1%-1R>*^cj7hGxP&P=R$Q#SOv&x!?GH=tTk<8XgWjP87gHc zyP2xjpHYTN%~Z;v9zm{^gK1pm(nn_@bEcUxfzDlqEMPcJbh)4@ZK_66wvxQF$p?$$ zWXNYtHjj9-!qzQ9H^`UK6@^%kyAj7Y9e7IMDv8@W$iYQU9@2PN zGQbLaTHzyG=Z_5bB{wGz$u|>qs<0OWK{yeHGeJ1xhu}p9FVy(qL>LVuQOD+_;S0ax z$`xEV2@l2%>tchjufI38|A4@~h`Rhj#IB@8RSHZ q9Bl3; + +const loader = new THREE.TextureLoader(); +const cmap = loader.load('/all_colormaps.png'); +cmap.minFilter = THREE.NearestFilter; +cmap.magFilter = THREE.NearestFilter; + +const geometry = new THREE.PlaneGeometry(4, 2, 64 * 4, 32 * 4); + +type Props = {}; + +const createCanvasTextureFromImage = async (imageUrl: string, index: number): Promise => { + return new Promise((resolve, reject) => { + const img = new Image(); + img.crossOrigin = 'Anonymous'; // Handle cross-origin issues + img.onload = () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('2d'); + + if (context) { + canvas.width = 900; // Width of the canvas + canvas.height = 450; // Height of the canvas + context.drawImage(img, index * 900, 0, 900, 450, 0, 0, 900, 450); + + const texture = new THREE.CanvasTexture(canvas); + texture.wrapS = texture.wrapT = THREE.RepeatWrapping; + texture.minFilter = THREE.NearestFilter; + texture.magFilter = THREE.NearestFilter; + resolve(texture); + } else { + reject(new Error('Failed to get canvas context')); + } + }; + img.onerror = (error) => reject(error); + img.src = imageUrl; + }); +}; + +export type SurfaceLayerRef = { + type: RefObject, + tick: (weight: number, uSphereWrapAmount: number) => void, +}; + +const SurfaceLayer = memo( + forwardRef(({ }, ref) => { + console.log('creating SurfaceLayer component'); + const surface_layer_ref = useRef(null); + + const [windowIndex, setWindowIndex] = useState(0); + + const materialRef = useRef(new THREE.ShaderMaterial({ + vertexShader: vertexShader, + fragmentShader: fragmentShader, + wireframe: false, + transparent: true, + side: THREE.DoubleSide, + uniforms: { + uFrameWeight: { value: 0.0 }, + uSphereWrapAmount: { value: 0.0 }, + uHeightDisplacement: { value: 0.2 }, + uLayerHeight: { value: 0.0 }, + uLayerOpacity: { value: 0.0 }, + thisDataTexture: { value: null }, + nextDataTexture: { value: null }, + textureTimesteps: { value: null }, + thisDataMin: { value: new Float32Array(1) }, + thisDataMax: { value: new Float32Array(1) }, + nextDataMin: { value: null }, + nextDataMax: { value: null }, + referenceHeightTexture: { value: null }, + referenceDataMin: { value: null }, + referenceDataMax: { value: null }, + referenceDataHeightFlag: { value: false }, + colorMap: { value: cmap }, + colorMapIndex: { value: 0.0 }, + }, + })); + + const imageUrl = 'http://localhost:5173/data_textures/2024-08-04_00/aqi_2024-08-04_00_CAMS_global.chunk_1_of_3.webp'; + + useEffect(() => { + const fetchAndUpdateTextures = async () => { + try { + const thisCanvasTexture = await createCanvasTextureFromImage(imageUrl, windowIndex); + const nextCanvasTexture = await createCanvasTextureFromImage(imageUrl, windowIndex + 1); + + if (materialRef.current) { + materialRef.current.uniforms.thisDataTexture.value = thisCanvasTexture; + materialRef.current.uniforms.thisDataTexture.needsUpdate = true; + materialRef.current.uniforms.nextDataTexture.value = nextCanvasTexture; + materialRef.current.uniforms.nextDataTexture.needsUpdate = true; + } + } catch (error) { + console.error('Error processing image:', error); + } + }; + + fetchAndUpdateTextures(); + }, [windowIndex, imageUrl]); + + useEffect(() => { + const interval = setInterval(() => { + setWindowIndex(prevIndex => prevIndex + 1); + }, 1000); // Update every second + + return () => clearInterval(interval); // Cleanup on component unmount + }, []); + + const tick = (weight: number, uSphereWrapAmount: number) => { + if (materialRef.current) { + materialRef.current.uniforms.uFrameWeight.value = weight % 1; + materialRef.current.uniforms.uSphereWrapAmount.value = uSphereWrapAmount; + materialRef.current.uniforms.uLayerOpacity.value = 1.0; + } + }; + + useImperativeHandle(ref, () => ({ + type: surface_layer_ref, + tick, + })); + + return ( + + ); + }) +); + +export { SurfaceLayer }; \ No newline at end of file diff --git a/air-quality-ui/src/components/globe/SurfaceLayer.tsx b/air-quality-ui/src/components/globe/SurfaceLayer.tsx new file mode 100644 index 00000000..53f2a471 --- /dev/null +++ b/air-quality-ui/src/components/globe/SurfaceLayer.tsx @@ -0,0 +1,196 @@ +import { + forwardRef, + useImperativeHandle, + useRef, + memo, + useEffect, + useCallback, + } from "react"; + import * as THREE from "three"; + import vertexShader from "./shaders/surfaceVert.glsl"; + import fragmentShader from "./shaders/surfaceFrag.glsl"; + + type PlaneType = THREE.Mesh; + + const loader = new THREE.TextureLoader(); + const cmap = loader.load('/all_colormaps.png'); + const lsm = loader.load('/NaturalEarthCoastline2.jpg'); + cmap.minFilter = THREE.NearestFilter; + cmap.magFilter = THREE.NearestFilter; + lsm.minFilter = THREE.NearestFilter; + lsm.magFilter = THREE.NearestFilter; + + + const geometry = new THREE.PlaneGeometry(4, 2, 64 * 4, 32 * 4); + + const createCanvasTextureFromFullImage = async (imageUrl: string): Promise => { + return new Promise((resolve, reject) => { + const img = new Image(); + img.crossOrigin = 'Anonymous'; // Handle cross-origin issues + img.onload = () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('2d'); + + if (context) { + canvas.width = img.width; + canvas.height = img.height; + context.drawImage(img, 0, 0); + + resolve(canvas); + } else { + reject(new Error('Failed to get canvas context')); + } + }; + img.onerror = (error) => reject(error); + img.src = imageUrl; + }); + }; + + const createCanvasTextureFromCanvas = (canvas: HTMLCanvasElement, index: number): THREE.CanvasTexture => { + const context = canvas.getContext('2d'); + if (context) { + const textureCanvas = document.createElement('canvas'); + const textureContext = textureCanvas.getContext('2d'); + + textureCanvas.width = 900; // Width of the texture canvas + textureCanvas.height = 450; // Height of the texture canvas + textureContext.drawImage(canvas, index * 900, 0, 900, 450, 0, 0, 900, 450); + + const texture = new THREE.CanvasTexture(textureCanvas); + texture.wrapS = texture.wrapT = THREE.RepeatWrapping; + // texture.minFilter = THREE.NearestFilter; + // texture.magFilter = THREE.NearestFilter; + texture.minFilter = THREE.LinearFilter; + texture.magFilter = THREE.LinearFilter; + + return texture; + } else { + throw new Error('Failed to get texture canvas context'); + } + }; + + export type SurfaceLayerRef = { + type: RefObject, + tick: (weight: number, uSphereWrapAmount: number) => void, + }; + + const SurfaceLayer = memo( + forwardRef(({}, ref) => { + console.log('creating SurfaceLayer component'); + const surface_layer_ref = useRef(null); + + const materialRef = useRef(new THREE.ShaderMaterial({ + vertexShader: vertexShader, + fragmentShader: fragmentShader, + wireframe: false, + transparent: true, + side: THREE.DoubleSide, + uniforms: { + uFrameWeight: { value: 0 }, + uSphereWrapAmount: { value: 0.0 }, + uHeightDisplacement: { value: 0.2 }, + uLayerHeight: { value: 0.0 }, + uLayerOpacity: { value: 0.0 }, + thisDataTexture: { value: null }, + nextDataTexture: { value: null }, + textureTimesteps: { value: null }, + thisDataMin: { value: new Float32Array(1) }, + thisDataMax: { value: new Float32Array(1) }, + nextDataMin: { value: null }, + nextDataMax: { value: null }, + referenceHeightTexture: { value: null }, + referenceDataMin: { value: null }, + referenceDataMax: { value: null }, + referenceDataHeightFlag: { value: false }, + colorMap: { value: cmap }, + colorMapIndex: { value: 0.0 }, + lsmTexture: { value: lsm }, + }, + })); + + const imageUrl = 'http://localhost:5173/data_textures/2024-08-04_00/aqi_2024-08-04_00_CAMS_global.chunk_1_of_3.webp'; + + const fullImageCanvasRef = useRef(null); + + const fetchAndUpdateTextures = useCallback(async () => { + try { + if (!fullImageCanvasRef.current) { + // Load the full image and draw it to a single canvas + const fullCanvas = await createCanvasTextureFromFullImage(imageUrl); + fullImageCanvasRef.current = fullCanvas; + } + + const canvas = fullImageCanvasRef.current; + if (canvas) { + const thisCanvasTexture = createCanvasTextureFromCanvas(canvas, windowIndexRef.current); + const nextCanvasTexture = createCanvasTextureFromCanvas(canvas, windowIndexRef.current + 1); + + if (materialRef.current) { + materialRef.current.uniforms.thisDataTexture.value = thisCanvasTexture; + materialRef.current.uniforms.nextDataTexture.value = nextCanvasTexture; + materialRef.current.uniforms.thisDataTexture.needsUpdate = true; + materialRef.current.uniforms.nextDataTexture.needsUpdate = true; + } + } + } catch (error) { + console.error('Error processing image:', error); + } + }, [imageUrl]); + + const windowIndexRef = useRef(0); + const elapsedTimeRef = useRef(0); + + useEffect(() => { + fetchAndUpdateTextures(); + }, [fetchAndUpdateTextures]); + + useEffect(() => { + const interval = setInterval(() => { + elapsedTimeRef.current += 0.03; + + if (elapsedTimeRef.current >= 1) { + if (windowIndexRef.current >= 14.) { + windowIndexRef.current = 0; // Reset windowIndex + } else { + windowIndexRef.current += 1; + } + elapsedTimeRef.current = 0; // Reset elapsedTime + fetchAndUpdateTextures(); // Update textures when the window index changes + } + + const currentTime = elapsedTimeRef.current; + const weight = currentTime % 1; // Value between 0 and 1 + if (materialRef.current) { + materialRef.current.uniforms.uFrameWeight.value = weight; + materialRef.current.uniforms.uFrameWeight.needsUpdate = true; + } + }, 1); + + return () => clearInterval(interval); // Cleanup on component unmount + }, [fetchAndUpdateTextures]); + + const tick = (weight: number, uSphereWrapAmount: number) => { + if (materialRef.current) { + materialRef.current.uniforms.uFrameWeight.value = weight % 1; + materialRef.current.uniforms.uSphereWrapAmount.value = uSphereWrapAmount; + materialRef.current.uniforms.uLayerOpacity.value = 1.0; + } + }; + + useImperativeHandle(ref, () => ({ + type: surface_layer_ref, + tick, + })); + + return ( + + ); + }) + ); + + export { SurfaceLayer }; \ No newline at end of file diff --git a/air-quality-ui/src/components/globe/TextureProcessor.tsx b/air-quality-ui/src/components/globe/TextureProcessor.tsx new file mode 100644 index 00000000..205ca213 --- /dev/null +++ b/air-quality-ui/src/components/globe/TextureProcessor.tsx @@ -0,0 +1,69 @@ +import React, { useState, useEffect, useRef } from 'react'; + +const ImageProcessor = () => { + const [processedImage, setProcessedImage] = useState(null); + const imageUrl = 'http://localhost:5173/data_textures/2024-08-04_00/aqi_2024-08-04_00_CAMS_global.chunk_1_of_3.webp'; + + // Create refs to store the image and canvas + const imageRef = useRef(null); + const canvasRef = useRef(null); + + useEffect(() => { + const processImage = async () => { + const img = new Image(); + img.crossOrigin = 'Anonymous'; // Handle cross-origin issues + + img.onload = () => { + // Store the image reference + imageRef.current = img; + + const canvas = document.createElement('canvas'); + canvasRef.current = canvas; // Store the canvas reference + const context = canvas.getContext('2d'); + + // Initialize canvas size + canvas.width = img.width; + canvas.height = img.height; + + // Draw the entire image on the canvas + context.drawImage(img, 0, 0); + + // Set initial section to display (first 900 pixels in width) + extractAndSetImage(0, 0, 900, img.height); + }; + + img.src = imageUrl; + }; + + processImage(); + }, [imageUrl]); + + const extractAndSetImage = (x, y, width, height) => { + const canvas = canvasRef.current; + const context = canvas.getContext('2d'); + + // Clear the canvas + context.clearRect(0, 0, canvas.width, canvas.height); + + // Draw the specified section of the image onto the canvas + context.drawImage(imageRef.current, x, y, width, height, 0, 0, width, height); + + // Convert canvas to a data URL and set it as the processed image + const newImageUrl = canvas.toDataURL('image/webp'); + setProcessedImage(newImageUrl); + }; + + return ( +

+ + + {processedImage ? ( + Processed + ) : ( +

Loading...

+ )} +
+ ); +}; + +export default ImageProcessor; \ No newline at end of file diff --git a/air-quality-ui/src/components/globe/World.tsx b/air-quality-ui/src/components/globe/World.tsx new file mode 100644 index 00000000..ff48e382 --- /dev/null +++ b/air-quality-ui/src/components/globe/World.tsx @@ -0,0 +1,30 @@ +import { Canvas } from '@react-three/fiber' +import { OrbitControls } from '@react-three/drei' +import { useRef, useEffect, memo } from "react" + +import { SurfaceLayer, SurfaceLayerRef } from "./SurfaceLayer" + +const World = (): JSX.Element => { + + const surface_layer_ref = useRef(null) + + + + return ( + + + + {/* + + + */} + + + + ) + } + + export default World \ No newline at end of file diff --git a/air-quality-ui/src/components/globe/shaders/surfaceFrag.glsl b/air-quality-ui/src/components/globe/shaders/surfaceFrag.glsl new file mode 100644 index 00000000..d85fc78c --- /dev/null +++ b/air-quality-ui/src/components/globe/shaders/surfaceFrag.glsl @@ -0,0 +1,130 @@ +//////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// define uniforms +//////////////////////////////////////////////////////////////////////////////////////////////////////////////// +uniform float uLayerOpacity; +uniform float uFrameWeight; +uniform float thisDataMin[12]; +uniform float thisDataMax[12]; +uniform float uUserMinValue; +uniform float uUserMaxValue; +uniform float colorMapIndex; + +uniform sampler2D thisDataTexture; +uniform sampler2D nextDataTexture; +uniform sampler2D colorMap; +uniform sampler2D lsmTexture; + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// varying from vertex shader +//////////////////////////////////////////////////////////////////////////////////////////////////////////////// +varying vec2 vUv; +varying vec3 vNormal; +varying vec3 vPosition; + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// define functions +//////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +// convert float to color via colormap +vec4 applyColormap(float t, sampler2D colormap, float index){ + return(texture2D(colormap,vec2(t, index / 23.0 + 1.0 / 23.0 ))); +} + +// remap color range +float remap(float value, float inMin, float inMax, float outMin, float outMax) { + return outMin + (outMax - outMin) * (value - inMin) / (inMax - inMin); +} + +// Adjusted remap function to handle user-defined min and max values +float userRemap(float value) { + if (value < 0.0) { + return 0.5 * (value - uUserMinValue) / -uUserMinValue; + } else { + return 0.5 + 0.5 * value / uUserMaxValue; + } +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// main program +//////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +void main() { + +float cmap_index = colorMapIndex; +float opacity_cutoff = 0.0; + +// convert relative bitmap value to absolute value for both frames +float thisFrameData = remap( + texture2D( + thisDataTexture, + vUv + ).r, + 0.0, + 1.0, + 1.0, + 7.0); + +float nextFrameData = remap( + texture2D( + nextDataTexture, + vUv + ).r, + 0.0, + 1.0, + 1.0, + 7.0); + +// interpolate between absolute values of both frames +float intData = mix(thisFrameData, nextFrameData, uFrameWeight); + +// apply user scaling to data +// float dataRemapped = userRemap(intData); + +// apply colormap to data +// vec4 dataColor = applyColormap( dataRemapped, colorMap, cmap_index ); + + +// gl_FragColor = dataColor; +gl_FragColor = vec4(1.0); + +// float testFrameData = remap( +// texture2D( +// thisDataTexture, +// vUv +// ).r, +// 0.0, +// 1.0, +// 1.0, +// 7.0); + +vec3 color; + +// Define colors for each range +if (intData >= 1.0 && intData < 2.0) { + color = vec3(129., 237., 229.); // Red +} else if (intData >= 2.0 && intData < 3.0) { + color = vec3(116.0, 201.0, 172.0); // Green +} else if (intData >= 3.0 && intData < 4.0) { + color = vec3(238.0, 230.0, 97.0); // Blue +} else if (intData >= 4.0 && intData < 5.0) { + color = vec3(236.0, 94.0, 87.0); // Yellow +} else if (intData >= 5.0 && intData < 6.0) { + color = vec3(137.0, 26.0, 52.0); // Orange +} else if (intData >= 6.0 && intData < 7.0) { + color = vec3(115.0, 40.0, 125.0); // Purple +} else { + color = vec3(0.0, 0.0, 0.0); // Black for values out of range +} + +gl_FragColor = vec4(color/255., 1.0); + +// overlay lsmTexture +vec4 lsmColor = texture2D(lsmTexture, vUv); +// gl_FragColor.rgb = mix(gl_FragColor.rgb, vec3(0.0), lsmColor.a); + +gl_FragColor = mix(vec4(0.,0.,0.,1.),gl_FragColor,lsmColor.r); + +// gl_FragColor = vec4(testFrameData, testFrameData, testFrameData, 1.0); +// gl_FragColor.a *= uLayerOpacity; + +} \ No newline at end of file diff --git a/air-quality-ui/src/components/globe/shaders/surfaceVert.glsl b/air-quality-ui/src/components/globe/shaders/surfaceVert.glsl new file mode 100644 index 00000000..646a6937 --- /dev/null +++ b/air-quality-ui/src/components/globe/shaders/surfaceVert.glsl @@ -0,0 +1,89 @@ +//////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// define uniforms +//////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#define M_PI 3.14159265 + +uniform float uSphereWrapAmount; +uniform float uLayerHeight; +uniform float uHeightDisplacement; // Scale of the height displacement +uniform float thisDataMin[12]; +uniform float thisDataMax[12]; + +uniform sampler2D dataTexture; // Heightmap texture + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// varying for fragment shader +//////////////////////////////////////////////////////////////////////////////////////////////////////////////// +varying vec2 vUv; + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// define functions +//////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +vec3 anglesToSphereCoord(vec2 a, float r) { + + return vec3( + r * sin(a.y) * sin(a.x), + r * cos(a.y), + r * sin(a.y) * cos(a.x) + ); + +} + +// remap color range +float remap(float value, float inMin, float inMax, float outMin, float outMax) { + return outMin + (outMax - outMin) * (value - inMin) / (inMax - inMin); +} + +// Adjusted remap function to handle user-defined min and max values +float userRemap(float value) { + float uUserMinValue = -6000.0; + float uUserMaxValue = 6000.0; + + if (value < 0.0) { + return 0.5 * (value - uUserMinValue) / -uUserMinValue; + } else { + return 0.5 + 0.5 * value / uUserMaxValue; + } +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// main program +//////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +void main() { + + float thisFrameData = remap( + texture2D( + dataTexture, + uv + ).r, + 0.0, + 1.0, + thisDataMin[0], + thisDataMax[0]); + + float dataRemapped = userRemap(thisFrameData); + + + + // Sample the heightmap texture + // float height = texture2D(dataTexture, uv).r - 0.5; + // float height = dataRemapped - 0.5; + float height = 0.0; + + // standard plane position + // vec3 modPosition = position; + vec3 modPosition = position + normal * height * uHeightDisplacement; + + // calculate sphere position with radius increased by calculated z displacement + vec2 angles = M_PI * vec2(2. * uv.x, uv.y - 1.); + vec3 sphPos = anglesToSphereCoord(angles, 1.0 + height * uHeightDisplacement ); + + // mix plane and sphere position based on chosen projection weight + vec3 wrapPos = mix(modPosition, sphPos, uSphereWrapAmount); + + gl_Position = projectionMatrix * modelViewMatrix * vec4( wrapPos, 1.0 ); + + vUv = uv; +} \ No newline at end of file diff --git a/air-quality-ui/src/components/summary-view/GlobalSummary.tsx b/air-quality-ui/src/components/summary-view/GlobalSummary.tsx index 6c77ea54..c053d5cf 100644 --- a/air-quality-ui/src/components/summary-view/GlobalSummary.tsx +++ b/air-quality-ui/src/components/summary-view/GlobalSummary.tsx @@ -16,6 +16,7 @@ import { } from '../../services/types' import { LoadingSpinner } from '../common/LoadingSpinner' import GlobalSummaryTable from '../summary-grid/table/GlobalSummaryTable' +import World from '../globe/World' // Import your Three.js scene component const GlobalSummary = (): JSX.Element => { const { forecastBaseDate, maxInSituDate } = useForecastContext() @@ -96,6 +97,7 @@ const GlobalSummary = (): JSX.Element => { )} {!forecastPending && !summaryPending && (
+ Date: Thu, 5 Sep 2024 14:07:01 +0100 Subject: [PATCH 02/39] first map version --- air-quality-ui/Dockerfile | 4 +++- air-quality-ui/package-lock.json | 1 + .../public/gebco_08_rev_elev_2k_HQ.jpg | Bin 0 -> 290299 bytes ...eLayer.static.tsx => SurfaceLayer copy.tsx} | 0 .../src/components/globe/SurfaceLayer.tsx | 12 ++++++++---- air-quality-ui/src/components/globe/World.tsx | 6 +----- .../components/globe/shaders/surfaceVert.glsl | 11 +++++------ 7 files changed, 18 insertions(+), 16 deletions(-) create mode 100644 air-quality-ui/public/gebco_08_rev_elev_2k_HQ.jpg rename air-quality-ui/src/components/globe/{SurfaceLayer.static.tsx => SurfaceLayer copy.tsx} (100%) diff --git a/air-quality-ui/Dockerfile b/air-quality-ui/Dockerfile index 9caf8958..51466537 100644 --- a/air-quality-ui/Dockerfile +++ b/air-quality-ui/Dockerfile @@ -3,11 +3,13 @@ FROM node:22.4.0-alpine AS development WORKDIR /app COPY package.json package.json -RUN npm i +RUN npm i --verbose +RUN ls -al node_modules COPY . . CMD ["npm", "run", "dev"] +# CMD ["sleep", "infinity"] FROM development AS build diff --git a/air-quality-ui/package-lock.json b/air-quality-ui/package-lock.json index efa21604..2a9550db 100644 --- a/air-quality-ui/package-lock.json +++ b/air-quality-ui/package-lock.json @@ -11745,6 +11745,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/vite-plugin-glsl/-/vite-plugin-glsl-1.3.0.tgz", "integrity": "sha512-SzEoLet9Bp5VSozjrhUiSc3xX1+u7rCTjXAsq4qWM3u8UjilI76A9ucX/T+CRGQCe25j50GSY+9mKSGUVPET1w==", + "license": "MIT", "dependencies": { "@rollup/pluginutils": "^5.1.0" }, diff --git a/air-quality-ui/public/gebco_08_rev_elev_2k_HQ.jpg b/air-quality-ui/public/gebco_08_rev_elev_2k_HQ.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5d491bb1dd019a838dfc4061c0049226c61a29e0 GIT binary patch literal 290299 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%0D^ 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 E2i+QX-v9sr literal 0 HcmV?d00001 diff --git a/air-quality-ui/public/all_colormaps.png b/air-quality-ui/public/all_colormaps.png new file mode 100644 index 0000000000000000000000000000000000000000..ea79254290bda2f44b11b2f5841f16013be9793e GIT binary patch literal 1436 zcmV;N1!MY&P)V>bE;TMPEFfrfbZ~PzFE4FjbZ~5MbZlv2E^l&Y zFDf=4MF0Q*32;bRa{vGjVE_ORVF9Q=r)dBH1qn$+K~#90RgKGT+|~hxze670L~_U( zX-0NzNsg6xks@x;tb#6zZoBRi^d-gyT%y?CLLf8 z31@AFsqRSg4?N3m*p)Zjs+!xmWhWbCJW3orFq)Q^Qu5D0@HkR@camY;BQXt|$-GC@@x8<0_L5J#E7Dx!^*LhPA}4Di9M6&MubBs*)#%_&F1c{XZJ$;q z4AMt+wZI*rY%dv=VbjgT zwZQQmwCB+K7G>~+E}yXvA&)*>vU>lT@87+pes^H^ZsKii^G3|P9}O~{cO)hvw3eK? z6Sm{xdk!jc_^=YB8+dZM;Npir5w3lbjm=lfCD&=p({CJ}{_ucr&#(CHfx>m^4w?JET#-+3p4lW$J6Yjf)gY4MbJv&A+J=2aFX=_q3BE^7h zX^bUMw#3*T+6Hag$f{FJbx%fTh>{;EgHIfj9sBixohrCf19!?}rvmP}fPLdr zG!k7~$OhcnU{^MxwwN1%-1R>*^cj7hGxP&P=R$Q#SOv&x!?GH=tTk<8XgWjP87gHc zyP2xjpHYTN%~Z;v9zm{^gK1pm(nn_@bEcUxfzDlqEMPcJbh)4@ZK_66wvxQF$p?$$ zWXNYtHjj9-!qzQ9H^`UK6@^%kyAj7Y9e7IMDv8@W$iYQU9@2PN zGQbLaTHzyG=Z_5bB{wGz$u|>qs<0OWK{yeHGeJ1xhu}p9FVy(qL>LVuQOD+_;S0ax z$`xEV2@l2%>tchjufI38|A4@~h`Rhj#IB@8RSHZ q9Bl3; + +const loader = new THREE.TextureLoader(); +const cmap = loader.load('/all_colormaps.png'); +cmap.minFilter = THREE.NearestFilter; +cmap.magFilter = THREE.NearestFilter; + +const geometry = new THREE.PlaneGeometry(4, 2, 64 * 4, 32 * 4); + +type Props = {}; + +const createCanvasTextureFromImage = async (imageUrl: string, index: number): Promise => { + return new Promise((resolve, reject) => { + const img = new Image(); + img.crossOrigin = 'Anonymous'; // Handle cross-origin issues + img.onload = () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('2d'); + + if (context) { + canvas.width = 900; // Width of the canvas + canvas.height = 450; // Height of the canvas + context.drawImage(img, index * 900, 0, 900, 450, 0, 0, 900, 450); + + const texture = new THREE.CanvasTexture(canvas); + texture.wrapS = texture.wrapT = THREE.RepeatWrapping; + texture.minFilter = THREE.NearestFilter; + texture.magFilter = THREE.NearestFilter; + resolve(texture); + } else { + reject(new Error('Failed to get canvas context')); + } + }; + img.onerror = (error) => reject(error); + img.src = imageUrl; + }); +}; + +export type SurfaceLayerRef = { + type: RefObject, + tick: (weight: number, uSphereWrapAmount: number) => void, +}; + +const SurfaceLayer = memo( + forwardRef(({ }, ref) => { + console.log('creating SurfaceLayer component'); + const surface_layer_ref = useRef(null); + + const [windowIndex, setWindowIndex] = useState(0); + + const materialRef = useRef(new THREE.ShaderMaterial({ + vertexShader: vertexShader, + fragmentShader: fragmentShader, + wireframe: false, + transparent: true, + side: THREE.DoubleSide, + uniforms: { + uFrameWeight: { value: 0.0 }, + uSphereWrapAmount: { value: 0.0 }, + uHeightDisplacement: { value: 0.2 }, + uLayerHeight: { value: 0.0 }, + uLayerOpacity: { value: 0.0 }, + thisDataTexture: { value: null }, + nextDataTexture: { value: null }, + textureTimesteps: { value: null }, + thisDataMin: { value: new Float32Array(1) }, + thisDataMax: { value: new Float32Array(1) }, + nextDataMin: { value: null }, + nextDataMax: { value: null }, + referenceHeightTexture: { value: null }, + referenceDataMin: { value: null }, + referenceDataMax: { value: null }, + referenceDataHeightFlag: { value: false }, + colorMap: { value: cmap }, + colorMapIndex: { value: 0.0 }, + }, + })); + + const imageUrl = 'http://localhost:5173/data_textures/2024-08-04_00/aqi_2024-08-04_00_CAMS_global.chunk_1_of_3.webp'; + + useEffect(() => { + const fetchAndUpdateTextures = async () => { + try { + const thisCanvasTexture = await createCanvasTextureFromImage(imageUrl, windowIndex); + const nextCanvasTexture = await createCanvasTextureFromImage(imageUrl, windowIndex + 1); + + if (materialRef.current) { + materialRef.current.uniforms.thisDataTexture.value = thisCanvasTexture; + materialRef.current.uniforms.thisDataTexture.needsUpdate = true; + materialRef.current.uniforms.nextDataTexture.value = nextCanvasTexture; + materialRef.current.uniforms.nextDataTexture.needsUpdate = true; + } + } catch (error) { + console.error('Error processing image:', error); + } + }; + + fetchAndUpdateTextures(); + }, [windowIndex, imageUrl]); + + useEffect(() => { + const interval = setInterval(() => { + setWindowIndex(prevIndex => prevIndex + 1); + }, 1000); // Update every second + + return () => clearInterval(interval); // Cleanup on component unmount + }, []); + + const tick = (weight: number, uSphereWrapAmount: number) => { + if (materialRef.current) { + materialRef.current.uniforms.uFrameWeight.value = weight % 1; + materialRef.current.uniforms.uSphereWrapAmount.value = uSphereWrapAmount; + materialRef.current.uniforms.uLayerOpacity.value = 1.0; + } + }; + + useImperativeHandle(ref, () => ({ + type: surface_layer_ref, + tick, + })); + + return ( + + ); + }) +); + +export { SurfaceLayer }; \ No newline at end of file diff --git a/air-quality-ui/src/components/globe/SurfaceLayer.tsx b/air-quality-ui/src/components/globe/SurfaceLayer.tsx new file mode 100644 index 00000000..53f2a471 --- /dev/null +++ b/air-quality-ui/src/components/globe/SurfaceLayer.tsx @@ -0,0 +1,196 @@ +import { + forwardRef, + useImperativeHandle, + useRef, + memo, + useEffect, + useCallback, + } from "react"; + import * as THREE from "three"; + import vertexShader from "./shaders/surfaceVert.glsl"; + import fragmentShader from "./shaders/surfaceFrag.glsl"; + + type PlaneType = THREE.Mesh; + + const loader = new THREE.TextureLoader(); + const cmap = loader.load('/all_colormaps.png'); + const lsm = loader.load('/NaturalEarthCoastline2.jpg'); + cmap.minFilter = THREE.NearestFilter; + cmap.magFilter = THREE.NearestFilter; + lsm.minFilter = THREE.NearestFilter; + lsm.magFilter = THREE.NearestFilter; + + + const geometry = new THREE.PlaneGeometry(4, 2, 64 * 4, 32 * 4); + + const createCanvasTextureFromFullImage = async (imageUrl: string): Promise => { + return new Promise((resolve, reject) => { + const img = new Image(); + img.crossOrigin = 'Anonymous'; // Handle cross-origin issues + img.onload = () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('2d'); + + if (context) { + canvas.width = img.width; + canvas.height = img.height; + context.drawImage(img, 0, 0); + + resolve(canvas); + } else { + reject(new Error('Failed to get canvas context')); + } + }; + img.onerror = (error) => reject(error); + img.src = imageUrl; + }); + }; + + const createCanvasTextureFromCanvas = (canvas: HTMLCanvasElement, index: number): THREE.CanvasTexture => { + const context = canvas.getContext('2d'); + if (context) { + const textureCanvas = document.createElement('canvas'); + const textureContext = textureCanvas.getContext('2d'); + + textureCanvas.width = 900; // Width of the texture canvas + textureCanvas.height = 450; // Height of the texture canvas + textureContext.drawImage(canvas, index * 900, 0, 900, 450, 0, 0, 900, 450); + + const texture = new THREE.CanvasTexture(textureCanvas); + texture.wrapS = texture.wrapT = THREE.RepeatWrapping; + // texture.minFilter = THREE.NearestFilter; + // texture.magFilter = THREE.NearestFilter; + texture.minFilter = THREE.LinearFilter; + texture.magFilter = THREE.LinearFilter; + + return texture; + } else { + throw new Error('Failed to get texture canvas context'); + } + }; + + export type SurfaceLayerRef = { + type: RefObject, + tick: (weight: number, uSphereWrapAmount: number) => void, + }; + + const SurfaceLayer = memo( + forwardRef(({}, ref) => { + console.log('creating SurfaceLayer component'); + const surface_layer_ref = useRef(null); + + const materialRef = useRef(new THREE.ShaderMaterial({ + vertexShader: vertexShader, + fragmentShader: fragmentShader, + wireframe: false, + transparent: true, + side: THREE.DoubleSide, + uniforms: { + uFrameWeight: { value: 0 }, + uSphereWrapAmount: { value: 0.0 }, + uHeightDisplacement: { value: 0.2 }, + uLayerHeight: { value: 0.0 }, + uLayerOpacity: { value: 0.0 }, + thisDataTexture: { value: null }, + nextDataTexture: { value: null }, + textureTimesteps: { value: null }, + thisDataMin: { value: new Float32Array(1) }, + thisDataMax: { value: new Float32Array(1) }, + nextDataMin: { value: null }, + nextDataMax: { value: null }, + referenceHeightTexture: { value: null }, + referenceDataMin: { value: null }, + referenceDataMax: { value: null }, + referenceDataHeightFlag: { value: false }, + colorMap: { value: cmap }, + colorMapIndex: { value: 0.0 }, + lsmTexture: { value: lsm }, + }, + })); + + const imageUrl = 'http://localhost:5173/data_textures/2024-08-04_00/aqi_2024-08-04_00_CAMS_global.chunk_1_of_3.webp'; + + const fullImageCanvasRef = useRef(null); + + const fetchAndUpdateTextures = useCallback(async () => { + try { + if (!fullImageCanvasRef.current) { + // Load the full image and draw it to a single canvas + const fullCanvas = await createCanvasTextureFromFullImage(imageUrl); + fullImageCanvasRef.current = fullCanvas; + } + + const canvas = fullImageCanvasRef.current; + if (canvas) { + const thisCanvasTexture = createCanvasTextureFromCanvas(canvas, windowIndexRef.current); + const nextCanvasTexture = createCanvasTextureFromCanvas(canvas, windowIndexRef.current + 1); + + if (materialRef.current) { + materialRef.current.uniforms.thisDataTexture.value = thisCanvasTexture; + materialRef.current.uniforms.nextDataTexture.value = nextCanvasTexture; + materialRef.current.uniforms.thisDataTexture.needsUpdate = true; + materialRef.current.uniforms.nextDataTexture.needsUpdate = true; + } + } + } catch (error) { + console.error('Error processing image:', error); + } + }, [imageUrl]); + + const windowIndexRef = useRef(0); + const elapsedTimeRef = useRef(0); + + useEffect(() => { + fetchAndUpdateTextures(); + }, [fetchAndUpdateTextures]); + + useEffect(() => { + const interval = setInterval(() => { + elapsedTimeRef.current += 0.03; + + if (elapsedTimeRef.current >= 1) { + if (windowIndexRef.current >= 14.) { + windowIndexRef.current = 0; // Reset windowIndex + } else { + windowIndexRef.current += 1; + } + elapsedTimeRef.current = 0; // Reset elapsedTime + fetchAndUpdateTextures(); // Update textures when the window index changes + } + + const currentTime = elapsedTimeRef.current; + const weight = currentTime % 1; // Value between 0 and 1 + if (materialRef.current) { + materialRef.current.uniforms.uFrameWeight.value = weight; + materialRef.current.uniforms.uFrameWeight.needsUpdate = true; + } + }, 1); + + return () => clearInterval(interval); // Cleanup on component unmount + }, [fetchAndUpdateTextures]); + + const tick = (weight: number, uSphereWrapAmount: number) => { + if (materialRef.current) { + materialRef.current.uniforms.uFrameWeight.value = weight % 1; + materialRef.current.uniforms.uSphereWrapAmount.value = uSphereWrapAmount; + materialRef.current.uniforms.uLayerOpacity.value = 1.0; + } + }; + + useImperativeHandle(ref, () => ({ + type: surface_layer_ref, + tick, + })); + + return ( + + ); + }) + ); + + export { SurfaceLayer }; \ No newline at end of file diff --git a/air-quality-ui/src/components/globe/TextureProcessor.tsx b/air-quality-ui/src/components/globe/TextureProcessor.tsx new file mode 100644 index 00000000..205ca213 --- /dev/null +++ b/air-quality-ui/src/components/globe/TextureProcessor.tsx @@ -0,0 +1,69 @@ +import React, { useState, useEffect, useRef } from 'react'; + +const ImageProcessor = () => { + const [processedImage, setProcessedImage] = useState(null); + const imageUrl = 'http://localhost:5173/data_textures/2024-08-04_00/aqi_2024-08-04_00_CAMS_global.chunk_1_of_3.webp'; + + // Create refs to store the image and canvas + const imageRef = useRef(null); + const canvasRef = useRef(null); + + useEffect(() => { + const processImage = async () => { + const img = new Image(); + img.crossOrigin = 'Anonymous'; // Handle cross-origin issues + + img.onload = () => { + // Store the image reference + imageRef.current = img; + + const canvas = document.createElement('canvas'); + canvasRef.current = canvas; // Store the canvas reference + const context = canvas.getContext('2d'); + + // Initialize canvas size + canvas.width = img.width; + canvas.height = img.height; + + // Draw the entire image on the canvas + context.drawImage(img, 0, 0); + + // Set initial section to display (first 900 pixels in width) + extractAndSetImage(0, 0, 900, img.height); + }; + + img.src = imageUrl; + }; + + processImage(); + }, [imageUrl]); + + const extractAndSetImage = (x, y, width, height) => { + const canvas = canvasRef.current; + const context = canvas.getContext('2d'); + + // Clear the canvas + context.clearRect(0, 0, canvas.width, canvas.height); + + // Draw the specified section of the image onto the canvas + context.drawImage(imageRef.current, x, y, width, height, 0, 0, width, height); + + // Convert canvas to a data URL and set it as the processed image + const newImageUrl = canvas.toDataURL('image/webp'); + setProcessedImage(newImageUrl); + }; + + return ( +

+ ); +}; + +export default ImageProcessor; \ No newline at end of file diff --git a/air-quality-ui/src/components/globe/World.tsx b/air-quality-ui/src/components/globe/World.tsx new file mode 100644 index 00000000..ff48e382 --- /dev/null +++ b/air-quality-ui/src/components/globe/World.tsx @@ -0,0 +1,30 @@ +import { Canvas } from '@react-three/fiber' +import { OrbitControls } from '@react-three/drei' +import { useRef, useEffect, memo } from "react" + +import { SurfaceLayer, SurfaceLayerRef } from "./SurfaceLayer" + +const World = (): JSX.Element => { + + const surface_layer_ref = useRef(null) + + + + return ( + + + + {/* + + + */} + + + + ) + } + + export default World \ No newline at end of file diff --git a/air-quality-ui/src/components/globe/shaders/surfaceFrag.glsl b/air-quality-ui/src/components/globe/shaders/surfaceFrag.glsl new file mode 100644 index 00000000..d85fc78c --- /dev/null +++ b/air-quality-ui/src/components/globe/shaders/surfaceFrag.glsl @@ -0,0 +1,130 @@ +//////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// define uniforms +//////////////////////////////////////////////////////////////////////////////////////////////////////////////// +uniform float uLayerOpacity; +uniform float uFrameWeight; +uniform float thisDataMin[12]; +uniform float thisDataMax[12]; +uniform float uUserMinValue; +uniform float uUserMaxValue; +uniform float colorMapIndex; + +uniform sampler2D thisDataTexture; +uniform sampler2D nextDataTexture; +uniform sampler2D colorMap; +uniform sampler2D lsmTexture; + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// varying from vertex shader +//////////////////////////////////////////////////////////////////////////////////////////////////////////////// +varying vec2 vUv; +varying vec3 vNormal; +varying vec3 vPosition; + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// define functions +//////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +// convert float to color via colormap +vec4 applyColormap(float t, sampler2D colormap, float index){ + return(texture2D(colormap,vec2(t, index / 23.0 + 1.0 / 23.0 ))); +} + +// remap color range +float remap(float value, float inMin, float inMax, float outMin, float outMax) { + return outMin + (outMax - outMin) * (value - inMin) / (inMax - inMin); +} + +// Adjusted remap function to handle user-defined min and max values +float userRemap(float value) { + if (value < 0.0) { + return 0.5 * (value - uUserMinValue) / -uUserMinValue; + } else { + return 0.5 + 0.5 * value / uUserMaxValue; + } +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// main program +//////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +void main() { + +float cmap_index = colorMapIndex; +float opacity_cutoff = 0.0; + +// convert relative bitmap value to absolute value for both frames +float thisFrameData = remap( + texture2D( + thisDataTexture, + vUv + ).r, + 0.0, + 1.0, + 1.0, + 7.0); + +float nextFrameData = remap( + texture2D( + nextDataTexture, + vUv + ).r, + 0.0, + 1.0, + 1.0, + 7.0); + +// interpolate between absolute values of both frames +float intData = mix(thisFrameData, nextFrameData, uFrameWeight); + +// apply user scaling to data +// float dataRemapped = userRemap(intData); + +// apply colormap to data +// vec4 dataColor = applyColormap( dataRemapped, colorMap, cmap_index ); + + +// gl_FragColor = dataColor; +gl_FragColor = vec4(1.0); + +// float testFrameData = remap( +// texture2D( +// thisDataTexture, +// vUv +// ).r, +// 0.0, +// 1.0, +// 1.0, +// 7.0); + +vec3 color; + +// Define colors for each range +if (intData >= 1.0 && intData < 2.0) { + color = vec3(129., 237., 229.); // Red +} else if (intData >= 2.0 && intData < 3.0) { + color = vec3(116.0, 201.0, 172.0); // Green +} else if (intData >= 3.0 && intData < 4.0) { + color = vec3(238.0, 230.0, 97.0); // Blue +} else if (intData >= 4.0 && intData < 5.0) { + color = vec3(236.0, 94.0, 87.0); // Yellow +} else if (intData >= 5.0 && intData < 6.0) { + color = vec3(137.0, 26.0, 52.0); // Orange +} else if (intData >= 6.0 && intData < 7.0) { + color = vec3(115.0, 40.0, 125.0); // Purple +} else { + color = vec3(0.0, 0.0, 0.0); // Black for values out of range +} + +gl_FragColor = vec4(color/255., 1.0); + +// overlay lsmTexture +vec4 lsmColor = texture2D(lsmTexture, vUv); +// gl_FragColor.rgb = mix(gl_FragColor.rgb, vec3(0.0), lsmColor.a); + +gl_FragColor = mix(vec4(0.,0.,0.,1.),gl_FragColor,lsmColor.r); + +// gl_FragColor = vec4(testFrameData, testFrameData, testFrameData, 1.0); +// gl_FragColor.a *= uLayerOpacity; + +} \ No newline at end of file diff --git a/air-quality-ui/src/components/globe/shaders/surfaceVert.glsl b/air-quality-ui/src/components/globe/shaders/surfaceVert.glsl new file mode 100644 index 00000000..646a6937 --- /dev/null +++ b/air-quality-ui/src/components/globe/shaders/surfaceVert.glsl @@ -0,0 +1,89 @@ +//////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// define uniforms +//////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#define M_PI 3.14159265 + +uniform float uSphereWrapAmount; +uniform float uLayerHeight; +uniform float uHeightDisplacement; // Scale of the height displacement +uniform float thisDataMin[12]; +uniform float thisDataMax[12]; + +uniform sampler2D dataTexture; // Heightmap texture + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// varying for fragment shader +//////////////////////////////////////////////////////////////////////////////////////////////////////////////// +varying vec2 vUv; + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// define functions +//////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +vec3 anglesToSphereCoord(vec2 a, float r) { + + return vec3( + r * sin(a.y) * sin(a.x), + r * cos(a.y), + r * sin(a.y) * cos(a.x) + ); + +} + +// remap color range +float remap(float value, float inMin, float inMax, float outMin, float outMax) { + return outMin + (outMax - outMin) * (value - inMin) / (inMax - inMin); +} + +// Adjusted remap function to handle user-defined min and max values +float userRemap(float value) { + float uUserMinValue = -6000.0; + float uUserMaxValue = 6000.0; + + if (value < 0.0) { + return 0.5 * (value - uUserMinValue) / -uUserMinValue; + } else { + return 0.5 + 0.5 * value / uUserMaxValue; + } +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// main program +//////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +void main() { + + float thisFrameData = remap( + texture2D( + dataTexture, + uv + ).r, + 0.0, + 1.0, + thisDataMin[0], + thisDataMax[0]); + + float dataRemapped = userRemap(thisFrameData); + + + + // Sample the heightmap texture + // float height = texture2D(dataTexture, uv).r - 0.5; + // float height = dataRemapped - 0.5; + float height = 0.0; + + // standard plane position + // vec3 modPosition = position; + vec3 modPosition = position + normal * height * uHeightDisplacement; + + // calculate sphere position with radius increased by calculated z displacement + vec2 angles = M_PI * vec2(2. * uv.x, uv.y - 1.); + vec3 sphPos = anglesToSphereCoord(angles, 1.0 + height * uHeightDisplacement ); + + // mix plane and sphere position based on chosen projection weight + vec3 wrapPos = mix(modPosition, sphPos, uSphereWrapAmount); + + gl_Position = projectionMatrix * modelViewMatrix * vec4( wrapPos, 1.0 ); + + vUv = uv; +} \ No newline at end of file diff --git a/air-quality-ui/src/components/summary-view/GlobalSummary.tsx b/air-quality-ui/src/components/summary-view/GlobalSummary.tsx index 3436e4f6..f89351a0 100644 --- a/air-quality-ui/src/components/summary-view/GlobalSummary.tsx +++ b/air-quality-ui/src/components/summary-view/GlobalSummary.tsx @@ -15,6 +15,7 @@ import { } from '../../services/types' import { LoadingSpinner } from '../common/LoadingSpinner' import GlobalSummaryTable from '../summary-grid/table/GlobalSummaryTable' +import World from '../globe/World' // Import your Three.js scene component const GlobalSummary = (): JSX.Element => { const { forecastDetails } = useForecastContext() @@ -108,6 +109,7 @@ const GlobalSummary = (): JSX.Element => { )} {!forecastPending && !summaryPending && (
+ Date: Thu, 5 Sep 2024 14:07:01 +0100 Subject: [PATCH 04/39] first map version --- air-quality-ui/Dockerfile | 4 +++- air-quality-ui/package-lock.json | 1 + .../public/gebco_08_rev_elev_2k_HQ.jpg | Bin 0 -> 290299 bytes ...eLayer.static.tsx => SurfaceLayer copy.tsx} | 0 .../src/components/globe/SurfaceLayer.tsx | 12 ++++++++---- air-quality-ui/src/components/globe/World.tsx | 6 +----- .../components/globe/shaders/surfaceVert.glsl | 11 +++++------ 7 files changed, 18 insertions(+), 16 deletions(-) create mode 100644 air-quality-ui/public/gebco_08_rev_elev_2k_HQ.jpg rename air-quality-ui/src/components/globe/{SurfaceLayer.static.tsx => SurfaceLayer copy.tsx} (100%) diff --git a/air-quality-ui/Dockerfile b/air-quality-ui/Dockerfile index 9caf8958..51466537 100644 --- a/air-quality-ui/Dockerfile +++ b/air-quality-ui/Dockerfile @@ -3,11 +3,13 @@ FROM node:22.4.0-alpine AS development WORKDIR /app COPY package.json package.json -RUN npm i +RUN npm i --verbose +RUN ls -al node_modules COPY . . CMD ["npm", "run", "dev"] +# CMD ["sleep", "infinity"] FROM development AS build diff --git a/air-quality-ui/package-lock.json b/air-quality-ui/package-lock.json index 902bcfcc..584d341f 100644 --- a/air-quality-ui/package-lock.json +++ b/air-quality-ui/package-lock.json @@ -11806,6 +11806,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/vite-plugin-glsl/-/vite-plugin-glsl-1.3.0.tgz", "integrity": "sha512-SzEoLet9Bp5VSozjrhUiSc3xX1+u7rCTjXAsq4qWM3u8UjilI76A9ucX/T+CRGQCe25j50GSY+9mKSGUVPET1w==", + "license": "MIT", "dependencies": { "@rollup/pluginutils": "^5.1.0" }, diff --git a/air-quality-ui/public/gebco_08_rev_elev_2k_HQ.jpg b/air-quality-ui/public/gebco_08_rev_elev_2k_HQ.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5d491bb1dd019a838dfc4061c0049226c61a29e0 GIT binary patch literal 290299 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%0D^ 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

- + Date: Thu, 5 Sep 2024 18:15:20 +0100 Subject: [PATCH 06/39] added slider --- .../src/components/globe/Controls.tsx | 102 ++++++++++++++++++ .../src/components/globe/SurfaceLayer.tsx | 74 ++++++++++--- air-quality-ui/src/components/globe/World.tsx | 54 +++++----- 3 files changed, 189 insertions(+), 41 deletions(-) create mode 100644 air-quality-ui/src/components/globe/Controls.tsx diff --git a/air-quality-ui/src/components/globe/Controls.tsx b/air-quality-ui/src/components/globe/Controls.tsx new file mode 100644 index 00000000..068b9dc1 --- /dev/null +++ b/air-quality-ui/src/components/globe/Controls.tsx @@ -0,0 +1,102 @@ +import React, { useState, useEffect } from 'react'; + +type ControlsProps = { + isTimeRunning: boolean; + onToggleTimeUpdate: () => void; + onSliderChange: (value: number) => void; +}; + +const Controls: React.FC = ({ + isTimeRunning, + onToggleTimeUpdate, + onSliderChange, +}) => { + const [sliderValue, setSliderValue] = useState(0.0); // Default slider value + + // Handle slider change from user input + const handleSliderChange = (event: React.ChangeEvent) => { + const value = parseFloat(event.target.value); // Parse as float for decimal values + setSliderValue(value); + }; + + // Effect to notify parent of slider changes + useEffect(() => { + onSliderChange(sliderValue); + }, [sliderValue, onSliderChange]); + + // Automatically advance the slider when isTimeRunning is true + useEffect(() => { + if (isTimeRunning) { + const interval = setInterval(() => { + setSliderValue((prevValue) => { + // If slider hits max value (40), reset to 0 + const newValue = prevValue >= 40 ? 0 : prevValue + 0.05; + return newValue; + }); + }, 10); // Advance the slider every 100ms + + // Cleanup the interval on pause or unmount + return () => clearInterval(interval); + } + }, [isTimeRunning]); + + return ( +
+ {/* Button to toggle time update */} + + + {/* Slider */} +
+ + +
+
+ ); +}; + +const styles = { + controlsContainer: { + display: 'flex', + justifyContent: 'center', + alignItems: 'center', + gap: '20px', + padding: '10px', + backgroundColor: '#f4f4f4', + borderTop: '1px solid #ccc', + }, + controlButton: { + padding: '10px 20px', + fontSize: '16px', + color: 'white', + border: 'none', + borderRadius: '5px', + cursor: 'pointer', + }, + sliderContainer: { + display: 'flex', + flexDirection: 'column', + alignItems: 'center', + }, + slider: { + width: '500px', + }, +}; + +export default Controls; \ No newline at end of file diff --git a/air-quality-ui/src/components/globe/SurfaceLayer.tsx b/air-quality-ui/src/components/globe/SurfaceLayer.tsx index 0adf8008..0b84093a 100644 --- a/air-quality-ui/src/components/globe/SurfaceLayer.tsx +++ b/air-quality-ui/src/components/globe/SurfaceLayer.tsx @@ -17,6 +17,7 @@ type SurfaceLayerProps = { forecastData: Record; summarizedMeasurementData: Record; isTimeRunning: boolean; // New prop to control the time updates + sliderValue: number; // New prop to control the slider value }; export type SurfaceLayerRef = { @@ -107,7 +108,7 @@ const createCanvasTextureFromCanvas = (canvas: HTMLCanvasElement, index: number) const SurfaceLayer = memo( forwardRef( - ({ forecastData, summarizedMeasurementData, isTimeRunning }, ref) => { // Receive isTimeRunning as a prop + ({ forecastData, summarizedMeasurementData, isTimeRunning, sliderValue }, ref) => { // Receive isTimeRunning as a prop const surface_layer_ref = useRef(null); const materialRef = useRef( new THREE.ShaderMaterial({ @@ -117,6 +118,7 @@ const SurfaceLayer = memo( transparent: true, side: THREE.DoubleSide, uniforms: { + uFrame: { value: 0 }, uFrameWeight: { value: 0 }, uSphereWrapAmount: { value: 0.0 }, uHeightDisplacement: { value: 0.2 }, @@ -184,34 +186,74 @@ const SurfaceLayer = memo( fetchAndUpdateTextures() + // useEffect(() => { + // // if (!isTimeRunning) return; // If time is paused, stop the update loop + + // const interval = setInterval(() => { + // // elapsedTimeRef.current += 0.05; + // elapsedTimeRef.current = sliderValue; + + // if (elapsedTimeRef.current >= 1) { + // windowIndexRef.current = (windowIndexRef.current + 1) % 40; // Loop through a max of 15 windows + // elapsedTimeRef.current = 0; // Reset elapsed time + // fetchAndUpdateTextures(); // Fetch and update textures on each new frame + // } + + // const currentTime = elapsedTimeRef.current; + // const weight = currentTime % 1; // Value between 0 and 1 + // // const weight = sliderValue; // Value between 0 and 1 + + // if (materialRef.current) { + // materialRef.current.uniforms.uFrameWeight.value = weight; + // } + // }, 1000 / 60); // Run updates at roughly 60 frames per second + + // return () => clearInterval(interval); // Cleanup interval on component unmount + // }, [fetchAndUpdateTextures, isTimeRunning,]); // Add isTimeRunning as a dependency + useEffect(() => { - if (!isTimeRunning) return; // If time is paused, stop the update loop + // if (!isTimeRunning) return; // If time is paused, stop the update loop - const interval = setInterval(() => { - elapsedTimeRef.current += 0.05; + // elapsedTimeRef.current += 0.05; + elapsedTimeRef.current = sliderValue; - if (elapsedTimeRef.current >= 1) { - windowIndexRef.current = (windowIndexRef.current + 1) % 40; // Loop through a max of 15 windows - elapsedTimeRef.current = 0; // Reset elapsed time + if (windowIndexRef.current != Math.floor(sliderValue)) { + windowIndexRef.current = Math.floor(sliderValue); // Loop through a max of 15 windows fetchAndUpdateTextures(); // Fetch and update textures on each new frame } - const currentTime = elapsedTimeRef.current; - const weight = currentTime % 1; // Value between 0 and 1 + // const currentTime = elapsedTimeRef.current; + const weight = sliderValue % 1; // Value between 0 and 1 + // const weight = sliderValue; // Value between 0 and 1 + if (materialRef.current) { materialRef.current.uniforms.uFrameWeight.value = weight; } - }, 1000 / 60); // Run updates at roughly 60 frames per second - return () => clearInterval(interval); // Cleanup interval on component unmount - }, [fetchAndUpdateTextures, isTimeRunning]); // Add isTimeRunning as a dependency + }, [sliderValue]); // Add isTimeRunning as a dependency // Handle the tick function to externally control weight and sphere wrapping - const tick = (weight: number, uSphereWrapAmount: number) => { + const tick = (sliderValue: number, uSphereWrapAmount: number) => { if (materialRef.current) { - materialRef.current.uniforms.uFrameWeight.value = weight % 1; - materialRef.current.uniforms.uSphereWrapAmount.value = uSphereWrapAmount; - materialRef.current.uniforms.uLayerOpacity.value = 1.0; + + elapsedTimeRef.current = sliderValue; + + if (windowIndexRef.current != Math.floor(sliderValue)) { + windowIndexRef.current = Math.floor(sliderValue); // Loop through a max of 15 windows + fetchAndUpdateTextures(); // Fetch and update textures on each new frame + } + + // const currentTime = elapsedTimeRef.current; + const weight = sliderValue % 1; // Value between 0 and 1 + // const weight = sliderValue; // Value between 0 and 1 + + if (materialRef.current) { + materialRef.current.uniforms.uFrameWeight.value = weight; + } + + // materialRef.current.uniforms.uFrameWeight.value = weight % 1; + // materialRef.current.uniforms.uSphereWrapAmount.value = uSphereWrapAmount; + // materialRef.current.uniforms.uLayerOpacity.value = 1.0; } }; useImperativeHandle(ref, () => ({ diff --git a/air-quality-ui/src/components/globe/World.tsx b/air-quality-ui/src/components/globe/World.tsx index d50291d7..0f6c41b7 100644 --- a/air-quality-ui/src/components/globe/World.tsx +++ b/air-quality-ui/src/components/globe/World.tsx @@ -2,6 +2,7 @@ import { Canvas } from '@react-three/fiber'; import { OrbitControls } from '@react-three/drei'; import { useRef, useState } from 'react'; import { SurfaceLayer, SurfaceLayerRef } from './SurfaceLayer'; +import Controls from './Controls'; type WorldProps = { forecastData: Record; @@ -14,50 +15,53 @@ const World = ({ }: WorldProps): JSX.Element => { const surface_layer_ref = useRef(null); const [isTimeRunning, setIsTimeRunning] = useState(true); // State to control time updates + const [sliderValue, setSliderValue] = useState(0.5); // State for the slider value // Function to toggle the time update on and off const toggleTimeUpdate = () => { setIsTimeRunning((prev) => !prev); }; - return ( - <> - {/* Button to toggle time update */} - + // Function to handle slider change + const handleSliderChange = (value: number) => { + surface_layer_ref.current?.tick(value, 0.0); + // setSliderValue(value); + }; + return ( +
- {/* Pass forecastData, summarizedMeasurementData, and isTimeRunning to SurfaceLayer */} - + + {/* Render Controls component below the canvas */} + +
); }; -export default World; +const styles = { + worldContainer: { + display: 'flex', + flexDirection: 'column', + alignItems: 'center', + }, +}; + +export default World; \ No newline at end of file From 4a3976c4d9283317af97a861b4b7eee524e7351b Mon Sep 17 00:00:00 2001 From: sebsteinig Date: Fri, 6 Sep 2024 01:32:06 +0100 Subject: [PATCH 07/39] added location markers --- air-quality-ui/Dockerfile | 2 - air-quality-ui/package-lock.json | 478 ++++++++++++------ air-quality-ui/package.json | 1 + .../src/components/globe/Controls.tsx | 30 +- .../src/components/globe/LocationMarker.tsx | 196 +++++++ .../components/globe/SurfaceLayer copy.tsx | 144 ------ .../src/components/globe/SurfaceLayer.tsx | 53 +- air-quality-ui/src/components/globe/World.tsx | 34 +- 8 files changed, 576 insertions(+), 362 deletions(-) create mode 100644 air-quality-ui/src/components/globe/LocationMarker.tsx delete mode 100644 air-quality-ui/src/components/globe/SurfaceLayer copy.tsx diff --git a/air-quality-ui/Dockerfile b/air-quality-ui/Dockerfile index 51466537..33242b9a 100644 --- a/air-quality-ui/Dockerfile +++ b/air-quality-ui/Dockerfile @@ -4,12 +4,10 @@ WORKDIR /app COPY package.json package.json RUN npm i --verbose -RUN ls -al node_modules COPY . . CMD ["npm", "run", "dev"] -# CMD ["sleep", "infinity"] FROM development AS build diff --git a/air-quality-ui/package-lock.json b/air-quality-ui/package-lock.json index 584d341f..13e7f620 100644 --- a/air-quality-ui/package-lock.json +++ b/air-quality-ui/package-lock.json @@ -27,6 +27,7 @@ "react-router-dom": "^6.23.1", "react-select": "^5.8.0", "three": "^0.167.1", + "three-custom-shader-material": "^5.4.0", "vite-plugin-glsl": "^1.3.0" }, "devDependencies": { @@ -2175,11 +2176,6 @@ "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-2.0.0.tgz", "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==" }, - "node_modules/@maplibre/maplibre-gl-style-spec/node_modules/tinyqueue": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-2.0.3.tgz", - "integrity": "sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==" - }, "node_modules/@mediapipe/tasks-vision": { "version": "0.10.8", "resolved": "https://registry.npmjs.org/@mediapipe/tasks-vision/-/tasks-vision-0.10.8.tgz", @@ -4618,6 +4614,11 @@ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, "node_modules/cosmiconfig": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", @@ -6365,6 +6366,24 @@ "resolved": "https://registry.npmjs.org/glsl-noise/-/glsl-noise-0.0.0.tgz", "integrity": "sha512-b/ZCF6amfAUb7dJM/MxRs7AetQEahYzJ8PtgfrmEdtw6uyGOr+ZSGtgjFm6mfsBkxJ4d2W7kg+Nlqzqvn3Bc0w==" }, + "node_modules/glsl-token-functions": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/glsl-token-functions/-/glsl-token-functions-1.0.1.tgz", + "integrity": "sha512-EigGhp1g+aUVeUNY7H1o5tL/bnwIB3/FcRREPr2E7Du+/UDXN24hDkaZ3e4aWHDjHr9lJ6YHXMISkwhUYg9UOg==" + }, + "node_modules/glsl-token-string": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/glsl-token-string/-/glsl-token-string-1.0.1.tgz", + "integrity": "sha512-1mtQ47Uxd47wrovl+T6RshKGkRRCYWhnELmkEcUAPALWGTFe2XZpH3r45XAwL2B6v+l0KNsCnoaZCSnhzKEksg==" + }, + "node_modules/glsl-tokenizer": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/glsl-tokenizer/-/glsl-tokenizer-2.1.5.tgz", + "integrity": "sha512-XSZEJ/i4dmz3Pmbnpsy3cKh7cotvFlBiZnDOwnj/05EwNp2XrhQ4XKJxT7/pDt4kp4YcpRSKz8eTV7S+mwV6MA==", + "dependencies": { + "through2": "^0.6.3" + } + }, "node_modules/gopd": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", @@ -6668,8 +6687,7 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/ini": { "version": "4.1.3", @@ -7052,8 +7070,7 @@ "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, "node_modules/isobject": { "version": "3.0.1", @@ -9592,6 +9609,14 @@ "node": ">=0.10.0" } }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "engines": { + "node": ">= 6" + } + }, "node_modules/object-inspect": { "version": "1.13.2", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", @@ -10344,6 +10369,22 @@ "react-dom": ">=16.13" } }, + "node_modules/readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/readable-stream/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, "node_modules/redent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", @@ -10888,6 +10929,11 @@ "resolved": "https://registry.npmjs.org/stats.js/-/stats.js-0.17.0.tgz", "integrity": "sha512-hNKz8phvYLPEcRkeG1rsGmV5ChMjKDAWU7/OJJdDErPBNChQXxCo3WZurGpnWc6gZhAzEPFad1aVgyOANH1sMw==" }, + "node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + }, "node_modules/string-length": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", @@ -11136,6 +11182,31 @@ "resolved": "https://registry.npmjs.org/three/-/three-0.167.1.tgz", "integrity": "sha512-gYTLJA/UQip6J/tJvl91YYqlZF47+D/kxiWrbTon35ZHlXEN0VOo+Qke2walF1/x92v55H6enomymg4Dak52kw==" }, + "node_modules/three-custom-shader-material": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/three-custom-shader-material/-/three-custom-shader-material-5.4.0.tgz", + "integrity": "sha512-Yn1lFlKOk3Vul3npEGAmbbFUZ5S2+yjPgM2XqJEZEYRSUUH2vk+WVYrtTB6Bcq15wa7hLUXAKoctAvbRmBmbYA==", + "license": "MIT", + "dependencies": { + "glsl-token-functions": "^1.0.1", + "glsl-token-string": "^1.0.1", + "glsl-tokenizer": "^2.1.5", + "object-hash": "^3.0.0" + }, + "peerDependencies": { + "@react-three/fiber": ">=8.0", + "react": ">=18.0", + "three": ">=0.154" + }, + "peerDependenciesMeta": { + "@react-three/fiber": { + "optional": true + }, + "react": { + "optional": true + } + } + }, "node_modules/three-mesh-bvh": { "version": "0.7.6", "resolved": "https://registry.npmjs.org/three-mesh-bvh/-/three-mesh-bvh-0.7.6.tgz", @@ -11170,6 +11241,15 @@ "resolved": "https://registry.npmjs.org/potpack/-/potpack-1.0.2.tgz", "integrity": "sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ==" }, + "node_modules/through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==", + "dependencies": { + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + } + }, "node_modules/tinyqueue": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-3.0.0.tgz", @@ -12065,6 +12145,14 @@ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "dev": true }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -12188,9 +12276,9 @@ } }, "@babel/compat-data": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.2.tgz", - "integrity": "sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.4.tgz", + "integrity": "sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==", "dev": true }, "@babel/core": { @@ -12231,11 +12319,11 @@ } }, "@babel/generator": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.0.tgz", - "integrity": "sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.4.tgz", + "integrity": "sha512-NFtZmZsyzDPJnk9Zg3BbTfKKc9UlHYzD0E//p2Z3B9nCwwtJW9T0gVbCz8+fBngnn4zf1Dr3IK8PHQQHq0lDQw==", "requires": { - "@babel/types": "^7.25.0", + "@babel/types": "^7.25.4", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" @@ -12337,11 +12425,11 @@ } }, "@babel/parser": { - "version": "7.25.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.3.tgz", - "integrity": "sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.4.tgz", + "integrity": "sha512-nq+eWrOgdtu3jG5Os4TQP3x3cLA8hR8TvJNjD8vnPa20WGycimcparWnLK4jJhElTK6SDyuJo1weMKO/5LpmLA==", "requires": { - "@babel/types": "^7.25.2" + "@babel/types": "^7.25.4" } }, "@babel/plugin-syntax-async-generators": { @@ -12371,6 +12459,24 @@ "@babel/helper-plugin-utils": "^7.12.13" } }, + "@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-import-attributes": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz", + "integrity": "sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.24.7" + } + }, "@babel/plugin-syntax-import-meta": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", @@ -12452,6 +12558,15 @@ "@babel/helper-plugin-utils": "^7.8.0" } }, + "@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, "@babel/plugin-syntax-top-level-await": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", @@ -12462,12 +12577,12 @@ } }, "@babel/plugin-syntax-typescript": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz", - "integrity": "sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.4.tgz", + "integrity": "sha512-uMOCoHVU52BsSWxPOMVv5qKRdeSlPuImUCB2dlPuBSU+W2/ROE7/Zg8F2Kepbk+8yBa68LlRKxO+xgEVWorsDg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.24.8" } }, "@babel/plugin-transform-react-jsx-self": { @@ -12489,9 +12604,9 @@ } }, "@babel/runtime": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz", - "integrity": "sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.4.tgz", + "integrity": "sha512-DSgLeL/FNcpXuzav5wfYvHCGvynXkJbn3Zvc3823AEe9nPwW9IK4UoCSS5yGymmQzN0pCPvivtgS6/8U2kkm1w==", "requires": { "regenerator-runtime": "^0.14.0" } @@ -12507,23 +12622,23 @@ } }, "@babel/traverse": { - "version": "7.25.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.3.tgz", - "integrity": "sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.4.tgz", + "integrity": "sha512-VJ4XsrD+nOvlXyLzmLzUs/0qjFS4sK30te5yEFlvbbUNEgKaVb2BHZUpAL+ttLPQAHNrsI3zZisbfha5Cvr8vg==", "requires": { "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.25.0", - "@babel/parser": "^7.25.3", + "@babel/generator": "^7.25.4", + "@babel/parser": "^7.25.4", "@babel/template": "^7.25.0", - "@babel/types": "^7.25.2", + "@babel/types": "^7.25.4", "debug": "^4.3.1", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.2.tgz", - "integrity": "sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.4.tgz", + "integrity": "sha512-zQ1ijeeCXVEh+aNL0RlmkPkG8HUiDcU2pzQQFjtbntgAczRASFzj4H+6+bV+dy1ntKR14I/DypeuRG1uma98iQ==", "requires": { "@babel/helper-string-parser": "^7.24.8", "@babel/helper-validator-identifier": "^7.24.7", @@ -12606,14 +12721,14 @@ "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==" }, "@emotion/react": { - "version": "11.13.0", - "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.13.0.tgz", - "integrity": "sha512-WkL+bw1REC2VNV1goQyfxjx1GYJkcc23CRQkXX+vZNLINyfI7o+uUn/rTGPt/xJ3bJHd5GcljgnxHf4wRw5VWQ==", + "version": "11.13.3", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.13.3.tgz", + "integrity": "sha512-lIsdU6JNrmYfJ5EbUCf4xW1ovy5wKQ2CkPRM4xogziOxH1nXxBSjpC9YqbFAP7circxMfYp+6x676BqWcEiixg==", "requires": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.12.0", "@emotion/cache": "^11.13.0", - "@emotion/serialize": "^1.3.0", + "@emotion/serialize": "^1.3.1", "@emotion/use-insertion-effect-with-fallbacks": "^1.1.0", "@emotion/utils": "^1.4.0", "@emotion/weak-memoize": "^0.4.0", @@ -12621,13 +12736,13 @@ } }, "@emotion/serialize": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.0.tgz", - "integrity": "sha512-jACuBa9SlYajnpIVXB+XOXnfJHyckDfe6fOpORIM6yhBDlqGuExvDdZYHDQGoDf3bZXGv7tNr+LpLjJqiEQ6EA==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.1.tgz", + "integrity": "sha512-dEPNKzBPU+vFPGa+z3axPRn8XVDetYORmDC0wAiej+TNcOZE70ZMJa0X7JdeoM6q/nWTMZeLpN/fTnD9o8MQBA==", "requires": { "@emotion/hash": "^0.9.2", "@emotion/memoize": "^0.9.0", - "@emotion/unitless": "^0.9.0", + "@emotion/unitless": "^0.10.0", "@emotion/utils": "^1.4.0", "csstype": "^3.0.2" } @@ -12651,9 +12766,9 @@ } }, "@emotion/unitless": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.9.0.tgz", - "integrity": "sha512-TP6GgNZtmtFaFcsOgExdnfxLLpRDla4Q66tnenA9CktvVSdNKDvMVuUah4QvWPIpNjrWsGg3qeGo9a43QooGZQ==" + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz", + "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==" }, "@emotion/use-insertion-effect-with-fallbacks": { "version": "1.1.0", @@ -13601,9 +13716,9 @@ "integrity": "sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q==" }, "@maplibre/maplibre-gl-style-spec": { - "version": "20.3.0", - "resolved": "https://registry.npmjs.org/@maplibre/maplibre-gl-style-spec/-/maplibre-gl-style-spec-20.3.0.tgz", - "integrity": "sha512-eSiQ3E5LUSxAOY9ABXGyfNhout2iEa6mUxKeaQ9nJ8NL1NuaQYU7zKqzx/LEYcXe1neT4uYAgM1wYZj3fTSXtA==", + "version": "20.3.1", + "resolved": "https://registry.npmjs.org/@maplibre/maplibre-gl-style-spec/-/maplibre-gl-style-spec-20.3.1.tgz", + "integrity": "sha512-5ueL4UDitzVtceQ8J4kY+Px3WK+eZTsmGwha3MBKHKqiHvKrjWWwBCIl1K8BuJSc5OFh83uI8IFNoFvQxX2uUw==", "requires": { "@mapbox/jsonlint-lines-primitives": "~2.0.2", "@mapbox/unitbezier": "^0.0.1", @@ -13612,18 +13727,13 @@ "quickselect": "^2.0.0", "rw": "^1.3.3", "sort-object": "^3.0.3", - "tinyqueue": "^2.0.3" + "tinyqueue": "^3.0.0" }, "dependencies": { "quickselect": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-2.0.0.tgz", "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==" - }, - "tinyqueue": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-2.0.3.tgz", - "integrity": "sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==" } } }, @@ -13641,20 +13751,20 @@ } }, "@mui/core-downloads-tracker": { - "version": "5.16.6", - "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.16.6.tgz", - "integrity": "sha512-kytg6LheUG42V8H/o/Ptz3olSO5kUXW9zF0ox18VnblX6bO2yif1FPItgc3ey1t5ansb1+gbe7SatntqusQupg==", + "version": "5.16.7", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.16.7.tgz", + "integrity": "sha512-RtsCt4Geed2/v74sbihWzzRs+HsIQCfclHeORh5Ynu2fS4icIKozcSubwuG7vtzq2uW3fOR1zITSP84TNt2GoQ==", "peer": true }, "@mui/material": { - "version": "5.16.6", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.16.6.tgz", - "integrity": "sha512-0LUIKBOIjiFfzzFNxXZBRAyr9UQfmTAFzbt6ziOU2FDXhorNN2o3N9/32mNJbCA8zJo2FqFU6d3dtoqUDyIEfA==", + "version": "5.16.7", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.16.7.tgz", + "integrity": "sha512-cwwVQxBhK60OIOqZOVLFt55t01zmarKJiJUWbk0+8s/Ix5IaUzAShqlJchxsIQ4mSrWqgcKCCXKtIlG5H+/Jmg==", "peer": true, "requires": { "@babel/runtime": "^7.23.9", - "@mui/core-downloads-tracker": "^5.16.6", - "@mui/system": "^5.16.6", + "@mui/core-downloads-tracker": "^5.16.7", + "@mui/system": "^5.16.7", "@mui/types": "^7.2.15", "@mui/utils": "^5.16.6", "@popperjs/core": "^2.11.8", @@ -13688,9 +13798,9 @@ } }, "@mui/system": { - "version": "5.16.6", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.16.6.tgz", - "integrity": "sha512-5xgyJjBIMPw8HIaZpfbGAaFYPwImQn7Nyh+wwKWhvkoIeDosQ1ZMVrbTclefi7G8hNmqhip04duYwYpbBFnBgw==", + "version": "5.16.7", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.16.7.tgz", + "integrity": "sha512-Jncvs/r/d/itkxh7O7opOunTqbbSSzMTHzZkNLM+FjAOg+cYAZHrPDlYe1ZGKUYORwwb2XexlWnpZp0kZ4AHuA==", "requires": { "@babel/runtime": "^7.23.9", "@mui/private-theming": "^5.16.6", @@ -13722,9 +13832,9 @@ } }, "@mui/x-date-pickers": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-7.12.0.tgz", - "integrity": "sha512-WU5C7QNfSpJ9cP8vl2sY7q35NW+0TUMgEy+sl98fcPhLckq3cgV1wnVxoZnQZ3BxVQAtx+7ag/MpefU03vJcVw==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-7.13.0.tgz", + "integrity": "sha512-cmpAfkzOjUgL4I8WenU4elm1QJO8vWpGmIPCezT3Q9wFjGL1QApQhJ5gMZ+X4tM6Gha9AhIWNQX5eXHKbSoyFQ==", "requires": { "@babel/runtime": "^7.25.0", "@mui/system": "^5.16.5", @@ -13881,9 +13991,9 @@ } }, "@remix-run/router": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.19.0.tgz", - "integrity": "sha512-zDICCLKEwbVYTS6TjYaWtHXxkdoUvD/QXvyVZjGCsWz5vyH7aFeONlPffPdW+Y/t6KT0MgXb2Mfjun9YpWN1dA==" + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.19.1.tgz", + "integrity": "sha512-S45oynt/WH19bHbIXjtli6QmwNYvaz+vtnubvNpNDvUOoA/OWh6j1OikIP3G+v5GHdxyC6EXoChG3HgYGEUfcg==" }, "@rollup/pluginutils": { "version": "5.1.0", @@ -14395,11 +14505,11 @@ } }, "@types/node": { - "version": "20.14.14", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.14.tgz", - "integrity": "sha512-d64f00982fS9YoOgJkAMolK7MN8Iq3TDdVjchbYHdEmjth/DHowx82GnoA+tVUAN+7vxfYUgAzi+JXbKNd2SDQ==", + "version": "20.16.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.1.tgz", + "integrity": "sha512-zJDo7wEadFtSyNz5QITDfRcrhqDvQI1xQNQ0VoizPjM/dVAODqqIUWbJPkvsxmTI0MYRGRikcdjMPhOssnPejQ==", "requires": { - "undici-types": "~5.26.4" + "undici-types": "~6.19.2" } }, "@types/offscreencanvas": { @@ -14423,9 +14533,9 @@ "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==" }, "@types/react": { - "version": "18.3.3", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz", - "integrity": "sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==", + "version": "18.3.4", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.4.tgz", + "integrity": "sha512-J7W30FTdfCxDDjmfRM+/JqLHBIyl7xUIp9kwK637FGmY7+mkSFSe6L4jpZzhj5QMfLssSDP4/i75AKkrdC7/Jw==", "requires": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -14449,9 +14559,9 @@ } }, "@types/react-transition-group": { - "version": "4.4.10", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.10.tgz", - "integrity": "sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==", + "version": "4.4.11", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.11.tgz", + "integrity": "sha512-RM05tAniPZ5DZPzzNFP+DmrcOdD0efDUxMy3145oljWSl3x9ZV5vhme98gTxFrj2lhXvmGNnUiuDyJgY9IKkNA==", "requires": { "@types/react": "*" } @@ -14506,9 +14616,9 @@ "integrity": "sha512-4hxA+NwohSgImdTSlPXEqDqqFktNgmTXQ05ff1uWam05tNGroCMp4G+4XVl6qWm1p7GQ/9oD41kAYsSssF6Mzw==" }, "@types/yargs": { - "version": "17.0.32", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", - "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", "requires": { "@types/yargs-parser": "*" } @@ -14878,9 +14988,9 @@ "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==" }, "async": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", - "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", "dev": true }, "asynckit": { @@ -15021,23 +15131,26 @@ } }, "babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz", + "integrity": "sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==", "dev": true, "requires": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^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.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.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-top-level-await": "^7.8.3" + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5" } }, "babel-preset-jest": { @@ -15280,6 +15393,11 @@ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, "cosmiconfig": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", @@ -16108,9 +16226,9 @@ "requires": {} }, "eslint-plugin-react-refresh": { - "version": "0.4.9", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.9.tgz", - "integrity": "sha512-QK49YrBAo5CLNLseZ7sZgvgTy21E6NEw22eZqc4teZfH8pxV3yXc9XXOYfUI6JNpw7mfHNkAeWtBxrTyykB6HA==", + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.11.tgz", + "integrity": "sha512-wrAKxMbVr8qhXTtIKfXqAn5SAtRZt0aXxe5P23Fh4pUAdC6XEsybGLB8P0PI4j1yYqOgUEUlzKAGDfo7rJOjcw==", "dev": true, "requires": {} }, @@ -16528,21 +16646,26 @@ } }, "global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-4.0.0.tgz", + "integrity": "sha512-w0Uf9Y9/nyHinEk5vMJKRie+wa4kR5hmDbEhGGds/kG1PwGLLHKRoNMeJOyCQjjBkANlnScqgzcFwGHgmgLkVA==", "requires": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" + "ini": "^4.1.3", + "kind-of": "^6.0.3", + "which": "^4.0.0" }, "dependencies": { + "isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==" + }, "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", "requires": { - "isexe": "^2.0.0" + "isexe": "^3.1.1" } } } @@ -16581,6 +16704,24 @@ "resolved": "https://registry.npmjs.org/glsl-noise/-/glsl-noise-0.0.0.tgz", "integrity": "sha512-b/ZCF6amfAUb7dJM/MxRs7AetQEahYzJ8PtgfrmEdtw6uyGOr+ZSGtgjFm6mfsBkxJ4d2W7kg+Nlqzqvn3Bc0w==" }, + "glsl-token-functions": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/glsl-token-functions/-/glsl-token-functions-1.0.1.tgz", + "integrity": "sha512-EigGhp1g+aUVeUNY7H1o5tL/bnwIB3/FcRREPr2E7Du+/UDXN24hDkaZ3e4aWHDjHr9lJ6YHXMISkwhUYg9UOg==" + }, + "glsl-token-string": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/glsl-token-string/-/glsl-token-string-1.0.1.tgz", + "integrity": "sha512-1mtQ47Uxd47wrovl+T6RshKGkRRCYWhnELmkEcUAPALWGTFe2XZpH3r45XAwL2B6v+l0KNsCnoaZCSnhzKEksg==" + }, + "glsl-tokenizer": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/glsl-tokenizer/-/glsl-tokenizer-2.1.5.tgz", + "integrity": "sha512-XSZEJ/i4dmz3Pmbnpsy3cKh7cotvFlBiZnDOwnj/05EwNp2XrhQ4XKJxT7/pDt4kp4YcpRSKz8eTV7S+mwV6MA==", + "requires": { + "through2": "^0.6.3" + } + }, "gopd": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", @@ -16742,9 +16883,9 @@ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" }, "ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true }, "immediate": { @@ -16796,13 +16937,12 @@ "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz", + "integrity": "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==" }, "internal-slot": { "version": "1.0.7", @@ -16866,9 +17006,9 @@ "dev": true }, "is-core-module": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.0.tgz", - "integrity": "sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==", + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", "requires": { "hasown": "^2.0.2" } @@ -18545,11 +18685,6 @@ } } }, - "js-sha1": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/js-sha1/-/js-sha1-0.7.0.tgz", - "integrity": "sha512-oQZ1Mo7440BfLSv9TX87VNEyU52pXPVG19F9PL3gTgNt0tVxlZ8F4O6yze3CLuLx28TxotxvlyepCNaaV0ZjMw==" - }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -18777,9 +18912,9 @@ } }, "maplibre-gl": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/maplibre-gl/-/maplibre-gl-4.5.1.tgz", - "integrity": "sha512-pKFDK8ZU2atwZWC8gdPVhN7Bf5HIPgtA+IG/iQ7J6WgmqSwCSmylc5q3stahWqXfx9PYUwVNJITrp1Hw96SUiA==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/maplibre-gl/-/maplibre-gl-4.6.0.tgz", + "integrity": "sha512-zobZK+fE+XM+7K81fk5pSBYWZlTGjGT0P96y2fR4DV2ry35ZBfAd0uWNatll69EgYeE+uOhN1MvEk+z1PCuyOQ==", "requires": { "@mapbox/geojson-rewind": "^0.5.2", "@mapbox/jsonlint-lines-primitives": "^2.0.2", @@ -18788,7 +18923,7 @@ "@mapbox/unitbezier": "^0.0.1", "@mapbox/vector-tile": "^1.3.1", "@mapbox/whoots-js": "^3.1.0", - "@maplibre/maplibre-gl-style-spec": "^20.3.0", + "@maplibre/maplibre-gl-style-spec": "^20.3.1", "@types/geojson": "^7946.0.14", "@types/geojson-vt": "3.2.5", "@types/mapbox__point-geometry": "^0.1.4", @@ -18798,7 +18933,7 @@ "earcut": "^3.0.0", "geojson-vt": "^4.0.2", "gl-matrix": "^3.4.3", - "global-prefix": "^3.0.0", + "global-prefix": "^4.0.0", "kdbush": "^4.0.2", "murmurhash-js": "^1.0.0", "pbf": "^3.3.0", @@ -18947,6 +19082,11 @@ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" }, + "object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==" + }, "object-inspect": { "version": "1.13.2", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", @@ -19412,20 +19552,20 @@ "dev": true }, "react-router": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.26.0.tgz", - "integrity": "sha512-wVQq0/iFYd3iZ9H2l3N3k4PL8EEHcb0XlU2Na8nEwmiXgIUElEH6gaJDtUQxJ+JFzmIXaQjfdpcGWaM6IoQGxg==", + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.26.1.tgz", + "integrity": "sha512-kIwJveZNwp7teQRI5QmwWo39A5bXRyqpH0COKKmPnyD2vBvDwgFXSqDUYtt1h+FEyfnE8eXr7oe0MxRzVwCcvQ==", "requires": { - "@remix-run/router": "1.19.0" + "@remix-run/router": "1.19.1" } }, "react-router-dom": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.26.0.tgz", - "integrity": "sha512-RRGUIiDtLrkX3uYcFiCIxKFWMcWQGMojpYZfcstc63A1+sSnVgILGIm9gNUA6na3Fm1QuPGSBQH2EMbAZOnMsQ==", + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.26.1.tgz", + "integrity": "sha512-veut7m41S1fLql4pLhxeSW3jlqs+4MtjRLj0xvuCEXsxusJCbs6I8yn9BxzzDX2XDgafrccY6hwjmd/bL54tFw==", "requires": { - "@remix-run/router": "1.19.0", - "react-router": "6.26.0" + "@remix-run/router": "1.19.1", + "react-router": "6.26.1" } }, "react-select": { @@ -19463,6 +19603,24 @@ "debounce": "^1.2.1" } }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + } + } + }, "redent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", @@ -19872,6 +20030,11 @@ "resolved": "https://registry.npmjs.org/stats.js/-/stats.js-0.17.0.tgz", "integrity": "sha512-hNKz8phvYLPEcRkeG1rsGmV5ChMjKDAWU7/OJJdDErPBNChQXxCo3WZurGpnWc6gZhAzEPFad1aVgyOANH1sMw==" }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + }, "string-length": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", @@ -20062,6 +20225,17 @@ "resolved": "https://registry.npmjs.org/three/-/three-0.167.1.tgz", "integrity": "sha512-gYTLJA/UQip6J/tJvl91YYqlZF47+D/kxiWrbTon35ZHlXEN0VOo+Qke2walF1/x92v55H6enomymg4Dak52kw==" }, + "three-custom-shader-material": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/three-custom-shader-material/-/three-custom-shader-material-5.4.0.tgz", + "integrity": "sha512-Yn1lFlKOk3Vul3npEGAmbbFUZ5S2+yjPgM2XqJEZEYRSUUH2vk+WVYrtTB6Bcq15wa7hLUXAKoctAvbRmBmbYA==", + "requires": { + "glsl-token-functions": "^1.0.1", + "glsl-token-string": "^1.0.1", + "glsl-tokenizer": "^2.1.5", + "object-hash": "^3.0.0" + } + }, "three-mesh-bvh": { "version": "0.7.6", "resolved": "https://registry.npmjs.org/three-mesh-bvh/-/three-mesh-bvh-0.7.6.tgz", @@ -20093,6 +20267,15 @@ } } }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==", + "requires": { + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + } + }, "tinyqueue": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-3.0.0.tgz", @@ -20370,9 +20553,9 @@ } }, "undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==" }, "union-value": { "version": "1.0.1", @@ -20487,8 +20670,8 @@ "requires": { "esbuild": "^0.21.3", "fsevents": "~2.3.3", - "postcss": "^8.4.39", - "rollup": "^4.13.0" + "postcss": "^8.4.41", + "rollup": "^4.20.0" } }, "vite-plugin-glsl": { @@ -20680,6 +20863,11 @@ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "dev": true }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + }, "y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", diff --git a/air-quality-ui/package.json b/air-quality-ui/package.json index 4cb8bc79..e16901cb 100644 --- a/air-quality-ui/package.json +++ b/air-quality-ui/package.json @@ -33,6 +33,7 @@ "react-router-dom": "^6.23.1", "react-select": "^5.8.0", "three": "^0.167.1", + "three-custom-shader-material": "^5.4.0", "vite-plugin-glsl": "^1.3.0" }, "devDependencies": { diff --git a/air-quality-ui/src/components/globe/Controls.tsx b/air-quality-ui/src/components/globe/Controls.tsx index 068b9dc1..eeb06d1f 100644 --- a/air-quality-ui/src/components/globe/Controls.tsx +++ b/air-quality-ui/src/components/globe/Controls.tsx @@ -1,4 +1,5 @@ import React, { useState, useEffect } from 'react'; +import { useForecastContext } from '../../context'; type ControlsProps = { isTimeRunning: boolean; @@ -19,26 +20,27 @@ const Controls: React.FC = ({ setSliderValue(value); }; + const { forecastDetails } = useForecastContext(); + const numForecastHours = forecastDetails.maxForecastDate.diff(forecastDetails.forecastBaseDate, 'hours').hours; + const numForecastTimeSteps = numForecastHours / 3; + + const currentDate = forecastDetails.forecastBaseDate.plus({ hours: Math.floor(sliderValue * 3) }).toFormat('yyyy-MM-dd T'); + // Effect to notify parent of slider changes useEffect(() => { onSliderChange(sliderValue); }, [sliderValue, onSliderChange]); - // Automatically advance the slider when isTimeRunning is true - useEffect(() => { + // Automatically advance the slider when isTimeRunning is true + useEffect(() => { if (isTimeRunning) { - const interval = setInterval(() => { - setSliderValue((prevValue) => { - // If slider hits max value (40), reset to 0 - const newValue = prevValue >= 40 ? 0 : prevValue + 0.05; - return newValue; - }); - }, 10); // Advance the slider every 100ms + const interval = setInterval(() => { + setSliderValue((prevValue) => (prevValue >= numForecastTimeSteps ? 0 : prevValue + 0.05)); + }, 10); - // Cleanup the interval on pause or unmount - return () => clearInterval(interval); + return () => clearInterval(interval); // Clean up the interval } - }, [isTimeRunning]); + }, [isTimeRunning]); return (
@@ -55,12 +57,12 @@ const Controls: React.FC = ({ {/* Slider */}
- + void; +}; + + +const LocationMarker = forwardRef( + ({ forecastData, measurementData, thisRotationsFrame, nextRotationsFrame }, ref): JSX.Element => { + const markerRef = useRef(null); + const materialRef = useRef(null); // Ref for the material + + // Uniform values from props or calculations + const lat = forecastData[0].location.latitude; + const lon = forecastData[0].location.longitude; + + // Extract point data from forecastData + const forecastDataArray = forecastData.map((data) => data.overall_aqi_level); + const forecastDataArrayUniform = new Float32Array(forecastDataArray); + + // and the same array for the average measurement data + const measurementArray = forecastData.map((forecastEntry) => { + // Find a corresponding measurement entry by matching valid_time and measurement_base_time + const matchingMeasurement = measurementData?.find( + (measurementEntry) => measurementEntry.measurement_base_time === forecastEntry.valid_time + ); + + // If a matching measurement is found, return the overall_aqi_level, otherwise return a missing value (e.g., -1) + return matchingMeasurement ? matchingMeasurement.overall_aqi_level.mean : -1; + }); + + const measurementDataArrayUniform = new Float32Array(measurementArray); + + if ( forecastData[0].location_name === "Cape Town") { + console.log(measurementData) + console.log(measurementDataArrayUniform) + } + + // Animation or build time (example values) + const shaderUniforms = { + uSphereWrapAmount: { value: 0.0 }, + uFrameWeight: { value: 0.5 }, + }; + + const markerSize = 0.025; + const markerColor = [0.25, 0.25, 0.25]; // Example color + + // Implement the tick function + const tick = (weight: number, uSphereWrapAmount: number) => { + if (markerRef.current) { + markerRef.current.material.uniforms.uFrameWeight.value = weight; + markerRef.current.material.uniforms.uFrame.value = Math.floor(weight); + } + }; + + // Expose the tick method to the parent component + useImperativeHandle(ref, () => ({ + tick, + })); + + return ( + + + + {/* CustomShaderMaterial from the custom-shader-material library */} + = 1.0 && value < 2.0) { + color = vec3(129.0 / 255.0, 237.0 / 255.0, 229.0 / 255.0); + } else if (value >= 2.0 && value < 3.0) { + color = vec3(116.0 / 255.0, 201.0 / 255.0, 172.0 / 255.0); + } else if (value >= 3.0 && value < 4.0) { + color = vec3(238.0 / 255.0, 230.0 / 255.0, 97.0 / 255.0); + } else if (value >= 4.0 && value < 5.0) { + color = vec3(236.0 / 255.0, 94.0 / 255.0, 87.0 / 255.0); + } else if (value >= 5.0 && value < 6.0) { + color = vec3(137.0 / 255.0, 26.0 / 255.0, 52.0 / 255.0); + } else if (value >= 6.0 && value < 7.0) { + color = vec3(115.0 / 255.0, 40.0 / 255.0, 125.0 / 255.0); + } else { + color = vec3(0.15, 0.15, 0.15); // Default to dark grey + } + } + // Add more variable types as needed + else { + color = vec3(1.0, 1.0, 1.0); // Default to white + } + + return color; + } + + uniform float uSphereWrapAmount; + uniform float uLat; + uniform float uLon; + uniform float uForecastData[40]; + uniform float uMeasurementData[40]; + uniform int uFrame; + uniform int uVariableType; + uniform float uFrameWeight; + + varying vec3 vColor; + + void main() { + + // Call the color function to get the color based on AQI value and variable type + // float intData = uAqiForecast[uFrame]; // Access the correct frame data + // vec3 thisColor = getColorForValue(uAqiForecast[uFrame], uVariableType); + // vec3 color = mix(thisColor, thisColor, uFrameWeight); + // float forecastValue = mix(uForecastData[uFrame],uForecastData[uFrame+1],uFrameWeight); + // float measurementValue = mix(uMeasurementData[uFrame],uMeasurementData[uFrame+1],uFrameWeight); + float forecastValue = uForecastData[uFrame]; + float measurementValue = uMeasurementData[uFrame]; + float diff; + if ( (measurementValue > 0.0) && (forecastValue > 0.0) ) { + diff = abs(measurementValue-forecastValue); + } else { + diff = 1.0; + } + if (diff < 1.0) { + diff = 1.0; + } + + vec3 color = getColorForValue(measurementValue, uVariableType); + + vColor = adjustSaturation(color, 2.0); // Increase saturation + + float lat = uLat; + float lon = uLon; + + vec3 posPlane = position * diff; + posPlane.x += lon / 180.0 * 2.0; + posPlane.y += lat / 90.0; + + csm_Position = posPlane; + + } + `} + fragmentShader={` + + uniform float uOpacity; + varying vec3 vColor; + + + void main() { + + csm_DiffuseColor = vec4(vColor, uOpacity); // Apply the color to the fragment + } + `} + uniforms={{ + uSphereWrapAmount: shaderUniforms.uSphereWrapAmount, + uFrameWeight: shaderUniforms.uFrameWeight, + uFrame: { value: 0 }, + uLat: { value: lat }, + uLon: { value: lon }, + uColor: { value: markerColor }, + uOpacity: { value: 1.0 }, + uForecastData: { value: forecastDataArrayUniform }, + uMeasurementData: { value: measurementDataArrayUniform }, + uVariableType: { value: 1 }, // Example variable type + }} + transparent + /> + + {/* Add a ring for the equator line */} + + + + + + ); + } +); + +export default LocationMarker; \ No newline at end of file diff --git a/air-quality-ui/src/components/globe/SurfaceLayer copy.tsx b/air-quality-ui/src/components/globe/SurfaceLayer copy.tsx deleted file mode 100644 index 97158c50..00000000 --- a/air-quality-ui/src/components/globe/SurfaceLayer copy.tsx +++ /dev/null @@ -1,144 +0,0 @@ -import { - forwardRef, - useImperativeHandle, - useRef, - RefObject, -} from "react"; -import { memo, useEffect, useState } from "react"; -import * as THREE from "three"; -import vertexShader from "./shaders/surfaceVert.glsl"; -import fragmentShader from "./shaders/surfaceFrag.glsl"; - -type PlaneType = THREE.Mesh; - -const loader = new THREE.TextureLoader(); -const cmap = loader.load('/all_colormaps.png'); -cmap.minFilter = THREE.NearestFilter; -cmap.magFilter = THREE.NearestFilter; - -const geometry = new THREE.PlaneGeometry(4, 2, 64 * 4, 32 * 4); - -type Props = {}; - -const createCanvasTextureFromImage = async (imageUrl: string, index: number): Promise => { - return new Promise((resolve, reject) => { - const img = new Image(); - img.crossOrigin = 'Anonymous'; // Handle cross-origin issues - img.onload = () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('2d'); - - if (context) { - canvas.width = 900; // Width of the canvas - canvas.height = 450; // Height of the canvas - context.drawImage(img, index * 900, 0, 900, 450, 0, 0, 900, 450); - - const texture = new THREE.CanvasTexture(canvas); - texture.wrapS = texture.wrapT = THREE.RepeatWrapping; - texture.minFilter = THREE.NearestFilter; - texture.magFilter = THREE.NearestFilter; - resolve(texture); - } else { - reject(new Error('Failed to get canvas context')); - } - }; - img.onerror = (error) => reject(error); - img.src = imageUrl; - }); -}; - -export type SurfaceLayerRef = { - type: RefObject, - tick: (weight: number, uSphereWrapAmount: number) => void, -}; - -const SurfaceLayer = memo( - forwardRef(({ }, ref) => { - console.log('creating SurfaceLayer component'); - const surface_layer_ref = useRef(null); - - const [windowIndex, setWindowIndex] = useState(0); - - const materialRef = useRef(new THREE.ShaderMaterial({ - vertexShader: vertexShader, - fragmentShader: fragmentShader, - wireframe: false, - transparent: true, - side: THREE.DoubleSide, - uniforms: { - uFrameWeight: { value: 0.0 }, - uSphereWrapAmount: { value: 0.0 }, - uHeightDisplacement: { value: 0.2 }, - uLayerHeight: { value: 0.0 }, - uLayerOpacity: { value: 0.0 }, - thisDataTexture: { value: null }, - nextDataTexture: { value: null }, - textureTimesteps: { value: null }, - thisDataMin: { value: new Float32Array(1) }, - thisDataMax: { value: new Float32Array(1) }, - nextDataMin: { value: null }, - nextDataMax: { value: null }, - referenceHeightTexture: { value: null }, - referenceDataMin: { value: null }, - referenceDataMax: { value: null }, - referenceDataHeightFlag: { value: false }, - colorMap: { value: cmap }, - colorMapIndex: { value: 0.0 }, - }, - })); - - const imageUrl = 'http://localhost:5173/data_textures/2024-08-04_00/aqi_2024-08-04_00_CAMS_global.chunk_1_of_3.webp'; - - useEffect(() => { - const fetchAndUpdateTextures = async () => { - try { - const thisCanvasTexture = await createCanvasTextureFromImage(imageUrl, windowIndex); - const nextCanvasTexture = await createCanvasTextureFromImage(imageUrl, windowIndex + 1); - - if (materialRef.current) { - materialRef.current.uniforms.thisDataTexture.value = thisCanvasTexture; - materialRef.current.uniforms.thisDataTexture.needsUpdate = true; - materialRef.current.uniforms.nextDataTexture.value = nextCanvasTexture; - materialRef.current.uniforms.nextDataTexture.needsUpdate = true; - } - } catch (error) { - console.error('Error processing image:', error); - } - }; - - fetchAndUpdateTextures(); - }, [windowIndex, imageUrl]); - - useEffect(() => { - const interval = setInterval(() => { - setWindowIndex(prevIndex => prevIndex + 1); - }, 1000); // Update every second - - return () => clearInterval(interval); // Cleanup on component unmount - }, []); - - const tick = (weight: number, uSphereWrapAmount: number) => { - if (materialRef.current) { - materialRef.current.uniforms.uFrameWeight.value = weight % 1; - materialRef.current.uniforms.uSphereWrapAmount.value = uSphereWrapAmount; - materialRef.current.uniforms.uLayerOpacity.value = 1.0; - } - }; - - useImperativeHandle(ref, () => ({ - type: surface_layer_ref, - tick, - })); - - return ( - - ); - }) -); - -export { SurfaceLayer }; \ No newline at end of file diff --git a/air-quality-ui/src/components/globe/SurfaceLayer.tsx b/air-quality-ui/src/components/globe/SurfaceLayer.tsx index 0b84093a..aec49f73 100644 --- a/air-quality-ui/src/components/globe/SurfaceLayer.tsx +++ b/air-quality-ui/src/components/globe/SurfaceLayer.tsx @@ -16,8 +16,6 @@ type PlaneType = THREE.Mesh; type SurfaceLayerProps = { forecastData: Record; summarizedMeasurementData: Record; - isTimeRunning: boolean; // New prop to control the time updates - sliderValue: number; // New prop to control the slider value }; export type SurfaceLayerRef = { @@ -108,7 +106,7 @@ const createCanvasTextureFromCanvas = (canvas: HTMLCanvasElement, index: number) const SurfaceLayer = memo( forwardRef( - ({ forecastData, summarizedMeasurementData, isTimeRunning, sliderValue }, ref) => { // Receive isTimeRunning as a prop + ({ forecastData, summarizedMeasurementData }, ref) => { // Receive isTimeRunning as a prop const surface_layer_ref = useRef(null); const materialRef = useRef( new THREE.ShaderMaterial({ @@ -144,7 +142,6 @@ const SurfaceLayer = memo( const fullImageCanvasRef = useRef(null); const windowIndexRef = useRef(0); - const elapsedTimeRef = useRef(0); const { forecastDetails } = useForecastContext(); const forecastBaseDate = forecastDetails.forecastBaseDate.toFormat('yyyy-MM-dd_HH'); @@ -186,57 +183,10 @@ const SurfaceLayer = memo( fetchAndUpdateTextures() - // useEffect(() => { - // // if (!isTimeRunning) return; // If time is paused, stop the update loop - - // const interval = setInterval(() => { - // // elapsedTimeRef.current += 0.05; - // elapsedTimeRef.current = sliderValue; - - // if (elapsedTimeRef.current >= 1) { - // windowIndexRef.current = (windowIndexRef.current + 1) % 40; // Loop through a max of 15 windows - // elapsedTimeRef.current = 0; // Reset elapsed time - // fetchAndUpdateTextures(); // Fetch and update textures on each new frame - // } - - // const currentTime = elapsedTimeRef.current; - // const weight = currentTime % 1; // Value between 0 and 1 - // // const weight = sliderValue; // Value between 0 and 1 - - // if (materialRef.current) { - // materialRef.current.uniforms.uFrameWeight.value = weight; - // } - // }, 1000 / 60); // Run updates at roughly 60 frames per second - - // return () => clearInterval(interval); // Cleanup interval on component unmount - // }, [fetchAndUpdateTextures, isTimeRunning,]); // Add isTimeRunning as a dependency - - useEffect(() => { - // if (!isTimeRunning) return; // If time is paused, stop the update loop - - // elapsedTimeRef.current += 0.05; - elapsedTimeRef.current = sliderValue; - - if (windowIndexRef.current != Math.floor(sliderValue)) { - windowIndexRef.current = Math.floor(sliderValue); // Loop through a max of 15 windows - fetchAndUpdateTextures(); // Fetch and update textures on each new frame - } - - // const currentTime = elapsedTimeRef.current; - const weight = sliderValue % 1; // Value between 0 and 1 - // const weight = sliderValue; // Value between 0 and 1 - - if (materialRef.current) { - materialRef.current.uniforms.uFrameWeight.value = weight; - } - - }, [sliderValue]); // Add isTimeRunning as a dependency - // Handle the tick function to externally control weight and sphere wrapping const tick = (sliderValue: number, uSphereWrapAmount: number) => { if (materialRef.current) { - elapsedTimeRef.current = sliderValue; if (windowIndexRef.current != Math.floor(sliderValue)) { windowIndexRef.current = Math.floor(sliderValue); // Loop through a max of 15 windows @@ -245,7 +195,6 @@ const SurfaceLayer = memo( // const currentTime = elapsedTimeRef.current; const weight = sliderValue % 1; // Value between 0 and 1 - // const weight = sliderValue; // Value between 0 and 1 if (materialRef.current) { materialRef.current.uniforms.uFrameWeight.value = weight; diff --git a/air-quality-ui/src/components/globe/World.tsx b/air-quality-ui/src/components/globe/World.tsx index 0f6c41b7..2c985b2e 100644 --- a/air-quality-ui/src/components/globe/World.tsx +++ b/air-quality-ui/src/components/globe/World.tsx @@ -1,7 +1,8 @@ +import React, { useRef, useState } from 'react'; // Add this import import { Canvas } from '@react-three/fiber'; import { OrbitControls } from '@react-three/drei'; -import { useRef, useState } from 'react'; import { SurfaceLayer, SurfaceLayerRef } from './SurfaceLayer'; +import LocationMarker, { LocationMarkerRef } from './LocationMarker'; import Controls from './Controls'; type WorldProps = { @@ -14,8 +15,8 @@ const World = ({ summarizedMeasurementData, }: WorldProps): JSX.Element => { const surface_layer_ref = useRef(null); + const markerRefs = useRef([]); // Array of refs for LocationMarkers const [isTimeRunning, setIsTimeRunning] = useState(true); // State to control time updates - const [sliderValue, setSliderValue] = useState(0.5); // State for the slider value // Function to toggle the time update on and off const toggleTimeUpdate = () => { @@ -25,7 +26,12 @@ const World = ({ // Function to handle slider change const handleSliderChange = (value: number) => { surface_layer_ref.current?.tick(value, 0.0); - // setSliderValue(value); + + // Loop through all marker refs and call tick method + markerRefs.current.forEach((ref) => { + if (ref.current) ref.current.tick(value, 0.0); // Update each marker with new value + // ref?.tick(value, 0.0); // Update each marker with new value + }); }; return ( @@ -40,9 +46,27 @@ const World = ({ ref={surface_layer_ref} forecastData={forecastData} summarizedMeasurementData={summarizedMeasurementData} - isTimeRunning={isTimeRunning} // Pass the time control state - sliderValue={sliderValue} // Pass the slider value /> + + {Object.keys(forecastData).map((key, index) => { + const forecastSubset = forecastData[key]; + const measurementSubset = summarizedMeasurementData[key]; + + // Properly create a ref for each marker using createRef + if (!markerRefs.current[index]) { + markerRefs.current[index] = React.createRef(); + } + + return ( + + ); + })} + From 3c63dad2aacb27e661a6be91fc778a366b6f0dc3 Mon Sep 17 00:00:00 2001 From: sebsteinig Date: Fri, 6 Sep 2024 02:51:55 +0100 Subject: [PATCH 08/39] added globe projection --- air-quality-ui/package-lock.json | 12 +++ air-quality-ui/package.json | 1 + .../src/components/globe/Controls.tsx | 41 ++++++++-- .../src/components/globe/LocationMarker.tsx | 76 ++++++++++++++++--- .../src/components/globe/SurfaceLayer.tsx | 16 +++- air-quality-ui/src/components/globe/World.tsx | 11 +++ 6 files changed, 141 insertions(+), 16 deletions(-) diff --git a/air-quality-ui/package-lock.json b/air-quality-ui/package-lock.json index 13e7f620..86f6088c 100644 --- a/air-quality-ui/package-lock.json +++ b/air-quality-ui/package-lock.json @@ -18,6 +18,7 @@ "ag-grid-react": "^31.3.2", "echarts": "^5.5.0", "echarts-for-react": "^3.0.2", + "gsap": "^3.12.5", "jest-each": "^29.7.0", "luxon": "^3.4.4", "maplibre-gl": "^4.5.0", @@ -6407,6 +6408,12 @@ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, + "node_modules/gsap": { + "version": "3.12.5", + "resolved": "https://registry.npmjs.org/gsap/-/gsap-3.12.5.tgz", + "integrity": "sha512-srBfnk4n+Oe/ZnMIOXt3gT605BX9x5+rh/prT2F1SsNJsU1XuMiP0E2aptW481OnonOGACZWBqseH5Z7csHxhQ==", + "license": "Standard 'no charge' license: https://gsap.com/standard-license. Club GSAP members get more: https://gsap.com/licensing/. Why GreenSock doesn't employ an MIT license: https://gsap.com/why-license/" + }, "node_modules/harmony-reflect": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", @@ -16742,6 +16749,11 @@ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, + "gsap": { + "version": "3.12.5", + "resolved": "https://registry.npmjs.org/gsap/-/gsap-3.12.5.tgz", + "integrity": "sha512-srBfnk4n+Oe/ZnMIOXt3gT605BX9x5+rh/prT2F1SsNJsU1XuMiP0E2aptW481OnonOGACZWBqseH5Z7csHxhQ==" + }, "harmony-reflect": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", diff --git a/air-quality-ui/package.json b/air-quality-ui/package.json index e16901cb..8b643473 100644 --- a/air-quality-ui/package.json +++ b/air-quality-ui/package.json @@ -24,6 +24,7 @@ "ag-grid-react": "^31.3.2", "echarts": "^5.5.0", "echarts-for-react": "^3.0.2", + "gsap": "^3.12.5", "jest-each": "^29.7.0", "luxon": "^3.4.4", "maplibre-gl": "^4.5.0", diff --git a/air-quality-ui/src/components/globe/Controls.tsx b/air-quality-ui/src/components/globe/Controls.tsx index eeb06d1f..98071922 100644 --- a/air-quality-ui/src/components/globe/Controls.tsx +++ b/air-quality-ui/src/components/globe/Controls.tsx @@ -5,14 +5,17 @@ type ControlsProps = { isTimeRunning: boolean; onToggleTimeUpdate: () => void; onSliderChange: (value: number) => void; + onGlobeButtonClick: (globeAnimationState: boolean) => void; // New prop to pass globe state to parent }; const Controls: React.FC = ({ isTimeRunning, onToggleTimeUpdate, onSliderChange, + onGlobeButtonClick, }) => { const [sliderValue, setSliderValue] = useState(0.0); // Default slider value + const [globeAnimationState, setGlobeAnimationState] = useState(false); // State for globe animation // Handle slider change from user input const handleSliderChange = (event: React.ChangeEvent) => { @@ -31,16 +34,24 @@ const Controls: React.FC = ({ onSliderChange(sliderValue); }, [sliderValue, onSliderChange]); - // Automatically advance the slider when isTimeRunning is true - useEffect(() => { + // Automatically advance the slider when isTimeRunning is true + useEffect(() => { if (isTimeRunning) { - const interval = setInterval(() => { + const interval = setInterval(() => { setSliderValue((prevValue) => (prevValue >= numForecastTimeSteps ? 0 : prevValue + 0.05)); - }, 10); + }, 10); - return () => clearInterval(interval); // Clean up the interval + return () => clearInterval(interval); // Clean up the interval } - }, [isTimeRunning]); + }, [isTimeRunning]); + + // Handle globe button click with GSAP animation + const handleGlobeButtonClick = () => { + setGlobeAnimationState((prevState) => !prevState); // Toggle globe animation state + + // Notify parent of the state change + onGlobeButtonClick(!globeAnimationState); + }; return (
@@ -69,6 +80,15 @@ const Controls: React.FC = ({ style={styles.slider} />
+ + {/* New Globe Button */} +
); }; @@ -99,6 +119,15 @@ const styles = { slider: { width: '500px', }, + globeButton: { + fontSize: '24px', + padding: '10px', + backgroundColor: '#007bff', + color: 'white', + border: 'none', + borderRadius: '5px', + cursor: 'pointer', + }, }; export default Controls; \ No newline at end of file diff --git a/air-quality-ui/src/components/globe/LocationMarker.tsx b/air-quality-ui/src/components/globe/LocationMarker.tsx index 48a532d1..c7ecb588 100644 --- a/air-quality-ui/src/components/globe/LocationMarker.tsx +++ b/air-quality-ui/src/components/globe/LocationMarker.tsx @@ -2,6 +2,8 @@ import { useRef, forwardRef, useImperativeHandle } from 'react'; import { Mesh } from 'three'; import CustomShaderMaterial from 'three-custom-shader-material'; import * as THREE from 'three'; +import { useThree, useFrame } from '@react-three/fiber'; +import { gsap } from 'gsap'; type LocationMarkerProps = { forecastData: ForecastResponseDto; @@ -12,13 +14,16 @@ type LocationMarkerProps = { export type LocationMarkerRef = { tick: (weight: number, uSphereWrapAmount: number) => void; + changeProjection: (globeState: boolean) => void; }; const LocationMarker = forwardRef( ({ forecastData, measurementData, thisRotationsFrame, nextRotationsFrame }, ref): JSX.Element => { const markerRef = useRef(null); - const materialRef = useRef(null); // Ref for the material + const ringRef = useRef(null); // Ref for the ring geometry + const { camera } = useThree(); // Access the camera + const prevCameraPosition = useRef(camera.position.clone()); // Store previous camera position // Uniform values from props or calculations const lat = forecastData[0].location.latitude; @@ -41,10 +46,6 @@ const LocationMarker = forwardRef( const measurementDataArrayUniform = new Float32Array(measurementArray); - if ( forecastData[0].location_name === "Cape Town") { - console.log(measurementData) - console.log(measurementDataArrayUniform) - } // Animation or build time (example values) const shaderUniforms = { @@ -55,17 +56,54 @@ const LocationMarker = forwardRef( const markerSize = 0.025; const markerColor = [0.25, 0.25, 0.25]; // Example color + // Scale based on camera zoom or position + const scaleBasedOnZoom = () => { + if (markerRef.current) { + // Calculate scale based on the camera's distance from the origin + const distance = camera.position.z; // Use camera's distance from the origin + const scaleFactor = distance / 10; // Adjust the denominator to control the sensitivity of the scaling + + markerRef.current.material.uniforms.uZoomLevel.value = scaleFactor + console.log(markerRef.current.material.uniforms.uZoomLevel.value) + } + }; + + // Track camera movement and apply scaling + useFrame(() => { + // Check if the z-axis of the camera has changed + if (camera.position.z !== prevCameraPosition.current.z) { + console.log('scale'); // Debugging to ensure scaling happens only on z-axis change + scaleBasedOnZoom(); // Adjust scale when the z-axis changes + prevCameraPosition.current.z = camera.position.z; // Update the z-axis position only + } + }); + // Implement the tick function const tick = (weight: number, uSphereWrapAmount: number) => { if (markerRef.current) { markerRef.current.material.uniforms.uFrameWeight.value = weight; markerRef.current.material.uniforms.uFrame.value = Math.floor(weight); } + // scaleBasedOnZoom(); // Scale based on current zoom whenever tick is called }; + const changeProjection = (globeState: boolean) => { + if (markerRef.current) { + if ( globeState ) { + gsap.to(markerRef.current.material.uniforms.uSphereWrapAmount, { value: 1.0, duration: 2 }); + ringRef.current.visible = false; // Show the ring in flat projection + } else { + gsap.to(markerRef.current.material.uniforms.uSphereWrapAmount, { value: 0.0, duration: 2, onComplete: () => { + ringRef.current.visible = true; // Show the ring in flat projection + }}); + } + } + }; + // Expose the tick method to the parent component useImperativeHandle(ref, () => ({ tick, + changeProjection })); return ( @@ -111,6 +149,8 @@ const LocationMarker = forwardRef( return color; } + #define M_PI 3.14159265 + uniform float uSphereWrapAmount; uniform float uLat; uniform float uLon; @@ -119,6 +159,7 @@ const LocationMarker = forwardRef( uniform int uFrame; uniform int uVariableType; uniform float uFrameWeight; + uniform float uZoomLevel; varying vec3 vColor; @@ -149,11 +190,27 @@ const LocationMarker = forwardRef( float lat = uLat; float lon = uLon; - vec3 posPlane = position * diff; + // vec3 posPlane = position * 1.1 * uZoomLevel ; + vec3 posPlane = position * 0.3 ; posPlane.x += lon / 180.0 * 2.0; posPlane.y += lat / 90.0; - csm_Position = posPlane; + float r = 1.0; + float theta = 2. * M_PI * (posPlane.x / 4. + 0.5); + float phi = M_PI * (posPlane.y / 2. + 0.5 - 1.0); + float sinPhiRadius = sin( phi ) * r; + + vec3 posSphere; + posSphere.x = sinPhiRadius * sin(theta); + posSphere.y = r * cos(phi); + posSphere.z = sinPhiRadius * cos(theta); + + posPlane += position * diff; + posSphere += position * diff; + + csm_Position = mix(posPlane, posSphere, uSphereWrapAmount) ; + + // csm_Position = posPlane; } `} @@ -171,6 +228,7 @@ const LocationMarker = forwardRef( uniforms={{ uSphereWrapAmount: shaderUniforms.uSphereWrapAmount, uFrameWeight: shaderUniforms.uFrameWeight, + uZoomLevel: { value: 0.11 }, uFrame: { value: 0 }, uLat: { value: lat }, uLon: { value: lon }, @@ -184,8 +242,8 @@ const LocationMarker = forwardRef( /> {/* Add a ring for the equator line */} - - + + diff --git a/air-quality-ui/src/components/globe/SurfaceLayer.tsx b/air-quality-ui/src/components/globe/SurfaceLayer.tsx index aec49f73..c0700edf 100644 --- a/air-quality-ui/src/components/globe/SurfaceLayer.tsx +++ b/air-quality-ui/src/components/globe/SurfaceLayer.tsx @@ -3,13 +3,13 @@ import { useImperativeHandle, useRef, memo, - useEffect, useCallback, } from "react"; import * as THREE from "three"; import vertexShader from "./shaders/surfaceVert.glsl"; import fragmentShader from "./shaders/surfaceFrag.glsl"; import { useForecastContext } from '../../context'; +import { gsap } from 'gsap'; type PlaneType = THREE.Mesh; @@ -21,6 +21,7 @@ type SurfaceLayerProps = { export type SurfaceLayerRef = { type: React.RefObject; tick: (weight: number, uSphereWrapAmount: number) => void; + changeProjection: (globeState: boolean) => void; }; // Preload textures globally so they are not reloaded during re-renders @@ -205,9 +206,22 @@ const SurfaceLayer = memo( // materialRef.current.uniforms.uLayerOpacity.value = 1.0; } }; + + const changeProjection = (globeState: boolean) => { + if (materialRef.current) { + if ( globeState ) { + gsap.to(materialRef.current.uniforms.uSphereWrapAmount, { value: 1.0, duration: 2 }); + } else { + gsap.to(materialRef.current.uniforms.uSphereWrapAmount, { value: 0.0, duration: 2 }); + } + } + }; + + useImperativeHandle(ref, () => ({ type: surface_layer_ref, tick, + changeProjection, })); return ( !prev); }; + const handleGlobeButtonClick = (globeState: boolean) => { + surface_layer_ref.current?.changeProjection(globeState); + + // Loop through all marker refs and call tick method + markerRefs.current.forEach((ref) => { + if (ref.current) ref.current.changeProjection(globeState); // Update each marker with new value + // ref?.tick(value, 0.0); // Update each marker with new value + }); + }; + // Function to handle slider change const handleSliderChange = (value: number) => { surface_layer_ref.current?.tick(value, 0.0); @@ -75,6 +85,7 @@ const World = ({ isTimeRunning={isTimeRunning} onToggleTimeUpdate={toggleTimeUpdate} onSliderChange={handleSliderChange} // Handle slider value changes + onGlobeButtonClick={handleGlobeButtonClick} />
); From 67d03ed056ecd5397b5fdf856769a003f21a52cb Mon Sep 17 00:00:00 2001 From: sebsteinig Date: Fri, 6 Sep 2024 03:02:22 +0100 Subject: [PATCH 09/39] improved time control --- .../src/components/globe/Controls.tsx | 75 +++++++++++++------ 1 file changed, 54 insertions(+), 21 deletions(-) diff --git a/air-quality-ui/src/components/globe/Controls.tsx b/air-quality-ui/src/components/globe/Controls.tsx index 98071922..6df97fc5 100644 --- a/air-quality-ui/src/components/globe/Controls.tsx +++ b/air-quality-ui/src/components/globe/Controls.tsx @@ -16,6 +16,7 @@ const Controls: React.FC = ({ }) => { const [sliderValue, setSliderValue] = useState(0.0); // Default slider value const [globeAnimationState, setGlobeAnimationState] = useState(false); // State for globe animation + const [timeDelta, setTimeDelta] = useState(0.03); // State for the speed of the slider's advancement // Handle slider change from user input const handleSliderChange = (event: React.ChangeEvent) => { @@ -38,19 +39,27 @@ const Controls: React.FC = ({ useEffect(() => { if (isTimeRunning) { const interval = setInterval(() => { - setSliderValue((prevValue) => (prevValue >= numForecastTimeSteps ? 0 : prevValue + 0.05)); + setSliderValue((prevValue) => (prevValue >= numForecastTimeSteps ? 0 : prevValue + timeDelta)); }, 10); return () => clearInterval(interval); // Clean up the interval } - }, [isTimeRunning]); + }, [isTimeRunning, timeDelta]); // Handle globe button click with GSAP animation const handleGlobeButtonClick = () => { setGlobeAnimationState((prevState) => !prevState); // Toggle globe animation state + onGlobeButtonClick(!globeAnimationState); // Notify parent of the state change + }; + + // Increase timeDelta + const handleIncreaseTimeDelta = () => { + setTimeDelta((prevDelta) => prevDelta + 0.01); // Increase by 0.01 + }; - // Notify parent of the state change - onGlobeButtonClick(!globeAnimationState); + // Decrease timeDelta + const handleDecreaseTimeDelta = () => { + setTimeDelta((prevDelta) => Math.max(0.01, prevDelta - 0.01)); // Decrease by 0.01, but don't go below 0.01 }; return ( @@ -58,12 +67,24 @@ const Controls: React.FC = ({ {/* Button to toggle time update */} + {/* Minus Button */} + + + {/* Plus Button */} + {/* Slider */} @@ -81,14 +102,15 @@ const Controls: React.FC = ({ />
- {/* New Globe Button */} + {/* Globe Button */} +

mTgOdPZtXpn6xqFjN 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 DhaTQ~ literal 0 HcmV?d00001 diff --git a/air-quality-ui/src/components/globe/SurfaceLayer.static.tsx b/air-quality-ui/src/components/globe/SurfaceLayer copy.tsx similarity index 100% rename from air-quality-ui/src/components/globe/SurfaceLayer.static.tsx rename to air-quality-ui/src/components/globe/SurfaceLayer copy.tsx diff --git a/air-quality-ui/src/components/globe/SurfaceLayer.tsx b/air-quality-ui/src/components/globe/SurfaceLayer.tsx index 53f2a471..06cdf427 100644 --- a/air-quality-ui/src/components/globe/SurfaceLayer.tsx +++ b/air-quality-ui/src/components/globe/SurfaceLayer.tsx @@ -15,11 +15,14 @@ import { const loader = new THREE.TextureLoader(); const cmap = loader.load('/all_colormaps.png'); const lsm = loader.load('/NaturalEarthCoastline2.jpg'); + const height = loader.load('/gebco_08_rev_elev_2k_HQ.jpg'); + cmap.minFilter = THREE.NearestFilter; cmap.magFilter = THREE.NearestFilter; lsm.minFilter = THREE.NearestFilter; lsm.magFilter = THREE.NearestFilter; - + height.minFilter = THREE.NearestFilter; + height.magFilter = THREE.NearestFilter; const geometry = new THREE.PlaneGeometry(4, 2, 64 * 4, 32 * 4); @@ -98,7 +101,7 @@ import { thisDataMax: { value: new Float32Array(1) }, nextDataMin: { value: null }, nextDataMax: { value: null }, - referenceHeightTexture: { value: null }, + referenceHeightTexture: { value: height }, referenceDataMin: { value: null }, referenceDataMax: { value: null }, referenceDataHeightFlag: { value: false }, @@ -108,7 +111,7 @@ import { }, })); - const imageUrl = 'http://localhost:5173/data_textures/2024-08-04_00/aqi_2024-08-04_00_CAMS_global.chunk_1_of_3.webp'; + const imageUrl = 'http://localhost:5173/data_textures/2024-08-29_00/aqi_2024-08-29_00_CAMS_global.chunk_1_of_3.webp'; const fullImageCanvasRef = useRef(null); @@ -146,7 +149,7 @@ import { useEffect(() => { const interval = setInterval(() => { - elapsedTimeRef.current += 0.03; + elapsedTimeRef.current += 0.015; if (elapsedTimeRef.current >= 1) { if (windowIndexRef.current >= 14.) { @@ -162,6 +165,7 @@ import { const weight = currentTime % 1; // Value between 0 and 1 if (materialRef.current) { materialRef.current.uniforms.uFrameWeight.value = weight; + // materialRef.current.uniforms.uFrameWeight.value = 0.0; materialRef.current.uniforms.uFrameWeight.needsUpdate = true; } }, 1); diff --git a/air-quality-ui/src/components/globe/World.tsx b/air-quality-ui/src/components/globe/World.tsx index ff48e382..732b7ecd 100644 --- a/air-quality-ui/src/components/globe/World.tsx +++ b/air-quality-ui/src/components/globe/World.tsx @@ -1,6 +1,6 @@ import { Canvas } from '@react-three/fiber' import { OrbitControls } from '@react-three/drei' -import { useRef, useEffect, memo } from "react" +import { useRef } from "react" import { SurfaceLayer, SurfaceLayerRef } from "./SurfaceLayer" @@ -17,10 +17,6 @@ const World = (): JSX.Element => { > - {/* - - - */} diff --git a/air-quality-ui/src/components/globe/shaders/surfaceVert.glsl b/air-quality-ui/src/components/globe/shaders/surfaceVert.glsl index 646a6937..405c26aa 100644 --- a/air-quality-ui/src/components/globe/shaders/surfaceVert.glsl +++ b/air-quality-ui/src/components/globe/shaders/surfaceVert.glsl @@ -10,7 +10,7 @@ uniform float thisDataMin[12]; uniform float thisDataMax[12]; uniform sampler2D dataTexture; // Heightmap texture - +uniform sampler2D referenceHeightTexture; //////////////////////////////////////////////////////////////////////////////////////////////////////////////// // varying for fragment shader //////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -55,20 +55,19 @@ void main() { float thisFrameData = remap( texture2D( - dataTexture, + referenceHeightTexture, uv ).r, 0.0, 1.0, - thisDataMin[0], - thisDataMax[0]); + 0.0, + 8000.0); float dataRemapped = userRemap(thisFrameData); - // Sample the heightmap texture - // float height = texture2D(dataTexture, uv).r - 0.5; + // float height = texture2D(referenceHeightTexture, uv).r - 0.5; // float height = dataRemapped - 0.5; float height = 0.0; From 1eb7bcf30d3b959da2da7477b8c414f6346157b2 Mon Sep 17 00:00:00 2001 From: sebsteinig Date: Thu, 5 Sep 2024 17:00:21 +0100 Subject: [PATCH 05/39] added all chunks to animation --- .../components/globe/SurfaceLayer copy.tsx | 144 -------- .../src/components/globe/SurfaceLayer.tsx | 333 ++++++++++-------- air-quality-ui/src/components/globe/World.tsx | 71 +++- .../components/summary-view/GlobalSummary.tsx | 6 +- 4 files changed, 243 insertions(+), 311 deletions(-) delete mode 100644 air-quality-ui/src/components/globe/SurfaceLayer copy.tsx diff --git a/air-quality-ui/src/components/globe/SurfaceLayer copy.tsx b/air-quality-ui/src/components/globe/SurfaceLayer copy.tsx deleted file mode 100644 index 97158c50..00000000 --- a/air-quality-ui/src/components/globe/SurfaceLayer copy.tsx +++ /dev/null @@ -1,144 +0,0 @@ -import { - forwardRef, - useImperativeHandle, - useRef, - RefObject, -} from "react"; -import { memo, useEffect, useState } from "react"; -import * as THREE from "three"; -import vertexShader from "./shaders/surfaceVert.glsl"; -import fragmentShader from "./shaders/surfaceFrag.glsl"; - -type PlaneType = THREE.Mesh; - -const loader = new THREE.TextureLoader(); -const cmap = loader.load('/all_colormaps.png'); -cmap.minFilter = THREE.NearestFilter; -cmap.magFilter = THREE.NearestFilter; - -const geometry = new THREE.PlaneGeometry(4, 2, 64 * 4, 32 * 4); - -type Props = {}; - -const createCanvasTextureFromImage = async (imageUrl: string, index: number): Promise => { - return new Promise((resolve, reject) => { - const img = new Image(); - img.crossOrigin = 'Anonymous'; // Handle cross-origin issues - img.onload = () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('2d'); - - if (context) { - canvas.width = 900; // Width of the canvas - canvas.height = 450; // Height of the canvas - context.drawImage(img, index * 900, 0, 900, 450, 0, 0, 900, 450); - - const texture = new THREE.CanvasTexture(canvas); - texture.wrapS = texture.wrapT = THREE.RepeatWrapping; - texture.minFilter = THREE.NearestFilter; - texture.magFilter = THREE.NearestFilter; - resolve(texture); - } else { - reject(new Error('Failed to get canvas context')); - } - }; - img.onerror = (error) => reject(error); - img.src = imageUrl; - }); -}; - -export type SurfaceLayerRef = { - type: RefObject, - tick: (weight: number, uSphereWrapAmount: number) => void, -}; - -const SurfaceLayer = memo( - forwardRef(({ }, ref) => { - console.log('creating SurfaceLayer component'); - const surface_layer_ref = useRef(null); - - const [windowIndex, setWindowIndex] = useState(0); - - const materialRef = useRef(new THREE.ShaderMaterial({ - vertexShader: vertexShader, - fragmentShader: fragmentShader, - wireframe: false, - transparent: true, - side: THREE.DoubleSide, - uniforms: { - uFrameWeight: { value: 0.0 }, - uSphereWrapAmount: { value: 0.0 }, - uHeightDisplacement: { value: 0.2 }, - uLayerHeight: { value: 0.0 }, - uLayerOpacity: { value: 0.0 }, - thisDataTexture: { value: null }, - nextDataTexture: { value: null }, - textureTimesteps: { value: null }, - thisDataMin: { value: new Float32Array(1) }, - thisDataMax: { value: new Float32Array(1) }, - nextDataMin: { value: null }, - nextDataMax: { value: null }, - referenceHeightTexture: { value: null }, - referenceDataMin: { value: null }, - referenceDataMax: { value: null }, - referenceDataHeightFlag: { value: false }, - colorMap: { value: cmap }, - colorMapIndex: { value: 0.0 }, - }, - })); - - const imageUrl = 'http://localhost:5173/data_textures/2024-08-04_00/aqi_2024-08-04_00_CAMS_global.chunk_1_of_3.webp'; - - useEffect(() => { - const fetchAndUpdateTextures = async () => { - try { - const thisCanvasTexture = await createCanvasTextureFromImage(imageUrl, windowIndex); - const nextCanvasTexture = await createCanvasTextureFromImage(imageUrl, windowIndex + 1); - - if (materialRef.current) { - materialRef.current.uniforms.thisDataTexture.value = thisCanvasTexture; - materialRef.current.uniforms.thisDataTexture.needsUpdate = true; - materialRef.current.uniforms.nextDataTexture.value = nextCanvasTexture; - materialRef.current.uniforms.nextDataTexture.needsUpdate = true; - } - } catch (error) { - console.error('Error processing image:', error); - } - }; - - fetchAndUpdateTextures(); - }, [windowIndex, imageUrl]); - - useEffect(() => { - const interval = setInterval(() => { - setWindowIndex(prevIndex => prevIndex + 1); - }, 1000); // Update every second - - return () => clearInterval(interval); // Cleanup on component unmount - }, []); - - const tick = (weight: number, uSphereWrapAmount: number) => { - if (materialRef.current) { - materialRef.current.uniforms.uFrameWeight.value = weight % 1; - materialRef.current.uniforms.uSphereWrapAmount.value = uSphereWrapAmount; - materialRef.current.uniforms.uLayerOpacity.value = 1.0; - } - }; - - useImperativeHandle(ref, () => ({ - type: surface_layer_ref, - tick, - })); - - return ( - - ); - }) -); - -export { SurfaceLayer }; \ No newline at end of file diff --git a/air-quality-ui/src/components/globe/SurfaceLayer.tsx b/air-quality-ui/src/components/globe/SurfaceLayer.tsx index 06cdf427..5ba543e1 100644 --- a/air-quality-ui/src/components/globe/SurfaceLayer.tsx +++ b/air-quality-ui/src/components/globe/SurfaceLayer.tsx @@ -1,178 +1,212 @@ import { - forwardRef, - useImperativeHandle, - useRef, - memo, - useEffect, - useCallback, - } from "react"; - import * as THREE from "three"; - import vertexShader from "./shaders/surfaceVert.glsl"; - import fragmentShader from "./shaders/surfaceFrag.glsl"; - - type PlaneType = THREE.Mesh; - - const loader = new THREE.TextureLoader(); - const cmap = loader.load('/all_colormaps.png'); - const lsm = loader.load('/NaturalEarthCoastline2.jpg'); - const height = loader.load('/gebco_08_rev_elev_2k_HQ.jpg'); - - cmap.minFilter = THREE.NearestFilter; - cmap.magFilter = THREE.NearestFilter; - lsm.minFilter = THREE.NearestFilter; - lsm.magFilter = THREE.NearestFilter; - height.minFilter = THREE.NearestFilter; - height.magFilter = THREE.NearestFilter; - - const geometry = new THREE.PlaneGeometry(4, 2, 64 * 4, 32 * 4); - - const createCanvasTextureFromFullImage = async (imageUrl: string): Promise => { - return new Promise((resolve, reject) => { - const img = new Image(); - img.crossOrigin = 'Anonymous'; // Handle cross-origin issues - img.onload = () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('2d'); - + forwardRef, + useImperativeHandle, + useRef, + memo, + useEffect, + useCallback, +} from "react"; +import * as THREE from "three"; +import vertexShader from "./shaders/surfaceVert.glsl"; +import fragmentShader from "./shaders/surfaceFrag.glsl"; +import { useForecastContext } from '../../context'; + +type PlaneType = THREE.Mesh; + +type SurfaceLayerProps = { + forecastData: Record; + summarizedMeasurementData: Record; + isTimeRunning: boolean; // New prop to control the time updates +}; + +export type SurfaceLayerRef = { + type: React.RefObject; + tick: (weight: number, uSphereWrapAmount: number) => void; +}; + +// Preload textures globally so they are not reloaded during re-renders +const loader = new THREE.TextureLoader(); +const cmap = loader.load('/all_colormaps.png'); +const lsm = loader.load('/NaturalEarthCoastline2.jpg'); +const height = loader.load('/gebco_08_rev_elev_2k_HQ.jpg'); + +cmap.minFilter = THREE.NearestFilter; +cmap.magFilter = THREE.NearestFilter; +lsm.minFilter = THREE.NearestFilter; +lsm.magFilter = THREE.NearestFilter; +height.minFilter = THREE.NearestFilter; +height.magFilter = THREE.NearestFilter; + +const geometry = new THREE.PlaneGeometry(4, 2, 64 * 4, 32 * 4); + +const createCanvasTextureFromMultipleImages = async (imageUrls: string[]): Promise => { + return new Promise((resolve, reject) => { + const images: HTMLImageElement[] = []; + let imagesLoaded = 0; + + // Helper function to handle image loading + const onLoadImage = () => { + imagesLoaded++; + if (imagesLoaded === imageUrls.length) { + // All images are loaded, now concatenate them + const canvas = document.createElement("canvas"); + const context = canvas.getContext("2d"); + if (context) { - canvas.width = img.width; - canvas.height = img.height; - context.drawImage(img, 0, 0); - + const singleImageWidth = images[0].width; + const singleImageHeight = images[0].height; + + // Set the canvas width and height to accommodate all images horizontally + canvas.width = singleImageWidth * imageUrls.length; + canvas.height = singleImageHeight; + + // Draw each image side by side + images.forEach((img, index) => { + context.drawImage(img, index * singleImageWidth, 0); + }); + resolve(canvas); } else { - reject(new Error('Failed to get canvas context')); + reject(new Error("Failed to get canvas context")); } - }; + } + }; + + // Load all images + imageUrls.forEach((url) => { + const img = new Image(); + img.crossOrigin = "Anonymous"; + img.onload = onLoadImage; img.onerror = (error) => reject(error); - img.src = imageUrl; + img.src = url; + images.push(img); }); - }; - - const createCanvasTextureFromCanvas = (canvas: HTMLCanvasElement, index: number): THREE.CanvasTexture => { - const context = canvas.getContext('2d'); - if (context) { - const textureCanvas = document.createElement('canvas'); - const textureContext = textureCanvas.getContext('2d'); - - textureCanvas.width = 900; // Width of the texture canvas - textureCanvas.height = 450; // Height of the texture canvas - textureContext.drawImage(canvas, index * 900, 0, 900, 450, 0, 0, 900, 450); - - const texture = new THREE.CanvasTexture(textureCanvas); - texture.wrapS = texture.wrapT = THREE.RepeatWrapping; - // texture.minFilter = THREE.NearestFilter; - // texture.magFilter = THREE.NearestFilter; - texture.minFilter = THREE.LinearFilter; - texture.magFilter = THREE.LinearFilter; - - return texture; - } else { - throw new Error('Failed to get texture canvas context'); - } - }; - - export type SurfaceLayerRef = { - type: RefObject, - tick: (weight: number, uSphereWrapAmount: number) => void, - }; - - const SurfaceLayer = memo( - forwardRef(({}, ref) => { - console.log('creating SurfaceLayer component'); + }); +}; + +const createCanvasTextureFromCanvas = (canvas: HTMLCanvasElement, index: number): THREE.CanvasTexture => { + const context = canvas.getContext("2d"); + if (context) { + const textureCanvas = document.createElement("canvas"); + const textureContext = textureCanvas.getContext("2d"); + + textureCanvas.width = 900; // Width of the texture canvas + textureCanvas.height = 450; // Height of the texture canvas + textureContext.drawImage(canvas, index * 900, 0, 900, 450, 0, 0, 900, 450); + + const texture = new THREE.CanvasTexture(textureCanvas); + texture.wrapS = texture.wrapT = THREE.RepeatWrapping; + texture.minFilter = THREE.LinearFilter; + texture.magFilter = THREE.LinearFilter; + + return texture; + } else { + throw new Error("Failed to get texture canvas context"); + } +}; + +const SurfaceLayer = memo( + forwardRef( + ({ forecastData, summarizedMeasurementData, isTimeRunning }, ref) => { // Receive isTimeRunning as a prop const surface_layer_ref = useRef(null); - - const materialRef = useRef(new THREE.ShaderMaterial({ - vertexShader: vertexShader, - fragmentShader: fragmentShader, - wireframe: false, - transparent: true, - side: THREE.DoubleSide, - uniforms: { - uFrameWeight: { value: 0 }, - uSphereWrapAmount: { value: 0.0 }, - uHeightDisplacement: { value: 0.2 }, - uLayerHeight: { value: 0.0 }, - uLayerOpacity: { value: 0.0 }, - thisDataTexture: { value: null }, - nextDataTexture: { value: null }, - textureTimesteps: { value: null }, - thisDataMin: { value: new Float32Array(1) }, - thisDataMax: { value: new Float32Array(1) }, - nextDataMin: { value: null }, - nextDataMax: { value: null }, - referenceHeightTexture: { value: height }, - referenceDataMin: { value: null }, - referenceDataMax: { value: null }, - referenceDataHeightFlag: { value: false }, - colorMap: { value: cmap }, - colorMapIndex: { value: 0.0 }, - lsmTexture: { value: lsm }, - }, - })); - - const imageUrl = 'http://localhost:5173/data_textures/2024-08-29_00/aqi_2024-08-29_00_CAMS_global.chunk_1_of_3.webp'; - + const materialRef = useRef( + new THREE.ShaderMaterial({ + vertexShader: vertexShader, + fragmentShader: fragmentShader, + wireframe: false, + transparent: true, + side: THREE.DoubleSide, + uniforms: { + uFrameWeight: { value: 0 }, + uSphereWrapAmount: { value: 0.0 }, + uHeightDisplacement: { value: 0.2 }, + uLayerHeight: { value: 0.0 }, + uLayerOpacity: { value: 0.0 }, + thisDataTexture: { value: null }, + nextDataTexture: { value: null }, + textureTimesteps: { value: null }, + thisDataMin: { value: new Float32Array(1) }, + thisDataMax: { value: new Float32Array(1) }, + nextDataMin: { value: null }, + nextDataMax: { value: null }, + referenceHeightTexture: { value: height }, + referenceDataMin: { value: null }, + referenceDataMax: { value: null }, + referenceDataHeightFlag: { value: false }, + colorMap: { value: cmap }, + colorMapIndex: { value: 0.0 }, + lsmTexture: { value: lsm }, + }, + }) + ); + const fullImageCanvasRef = useRef(null); - + const windowIndexRef = useRef(0); + const elapsedTimeRef = useRef(0); + + const { forecastDetails } = useForecastContext(); + const forecastBaseDate = forecastDetails.forecastBaseDate.toFormat('yyyy-MM-dd_HH'); + // const imageUrl = `http://localhost:5173/data_textures/${forecastBaseDate}/aqi_${forecastBaseDate}_CAMS_global.chunk_1_of_3.webp`; + + const imageUrls = [ + `http://localhost:5173/data_textures/${forecastBaseDate}/aqi_${forecastBaseDate}_CAMS_global.chunk_1_of_3.webp`, + `http://localhost:5173/data_textures/${forecastBaseDate}/aqi_${forecastBaseDate}_CAMS_global.chunk_2_of_3.webp`, + `http://localhost:5173/data_textures/${forecastBaseDate}/aqi_${forecastBaseDate}_CAMS_global.chunk_3_of_3.webp`, + ]; + const fetchAndUpdateTextures = useCallback(async () => { try { if (!fullImageCanvasRef.current) { - // Load the full image and draw it to a single canvas - const fullCanvas = await createCanvasTextureFromFullImage(imageUrl); + const fullCanvas = await createCanvasTextureFromMultipleImages(imageUrls); fullImageCanvasRef.current = fullCanvas; } - + const canvas = fullImageCanvasRef.current; if (canvas) { - const thisCanvasTexture = createCanvasTextureFromCanvas(canvas, windowIndexRef.current); - const nextCanvasTexture = createCanvasTextureFromCanvas(canvas, windowIndexRef.current + 1); - + const thisCanvasTexture = createCanvasTextureFromCanvas( + canvas, + windowIndexRef.current + ); + const nextCanvasTexture = createCanvasTextureFromCanvas( + canvas, + windowIndexRef.current + 1 + ); + if (materialRef.current) { materialRef.current.uniforms.thisDataTexture.value = thisCanvasTexture; materialRef.current.uniforms.nextDataTexture.value = nextCanvasTexture; - materialRef.current.uniforms.thisDataTexture.needsUpdate = true; - materialRef.current.uniforms.nextDataTexture.needsUpdate = true; } } } catch (error) { - console.error('Error processing image:', error); + console.error("Error processing image:", error); } - }, [imageUrl]); - - const windowIndexRef = useRef(0); - const elapsedTimeRef = useRef(0); - - useEffect(() => { - fetchAndUpdateTextures(); - }, [fetchAndUpdateTextures]); - + }, [imageUrls]); + + fetchAndUpdateTextures() + useEffect(() => { + if (!isTimeRunning) return; // If time is paused, stop the update loop + const interval = setInterval(() => { - elapsedTimeRef.current += 0.015; - + elapsedTimeRef.current += 0.05; + if (elapsedTimeRef.current >= 1) { - if (windowIndexRef.current >= 14.) { - windowIndexRef.current = 0; // Reset windowIndex - } else { - windowIndexRef.current += 1; - } - elapsedTimeRef.current = 0; // Reset elapsedTime - fetchAndUpdateTextures(); // Update textures when the window index changes + windowIndexRef.current = (windowIndexRef.current + 1) % 40; // Loop through a max of 15 windows + elapsedTimeRef.current = 0; // Reset elapsed time + fetchAndUpdateTextures(); // Fetch and update textures on each new frame } - + const currentTime = elapsedTimeRef.current; const weight = currentTime % 1; // Value between 0 and 1 if (materialRef.current) { materialRef.current.uniforms.uFrameWeight.value = weight; - // materialRef.current.uniforms.uFrameWeight.value = 0.0; - materialRef.current.uniforms.uFrameWeight.needsUpdate = true; } - }, 1); - - return () => clearInterval(interval); // Cleanup on component unmount - }, [fetchAndUpdateTextures]); - + }, 1000 / 60); // Run updates at roughly 60 frames per second + + return () => clearInterval(interval); // Cleanup interval on component unmount + }, [fetchAndUpdateTextures, isTimeRunning]); // Add isTimeRunning as a dependency + + // Handle the tick function to externally control weight and sphere wrapping const tick = (weight: number, uSphereWrapAmount: number) => { if (materialRef.current) { materialRef.current.uniforms.uFrameWeight.value = weight % 1; @@ -180,12 +214,12 @@ import { materialRef.current.uniforms.uLayerOpacity.value = 1.0; } }; - + useImperativeHandle(ref, () => ({ type: surface_layer_ref, tick, })); - + return ( ); - }) - ); - - export { SurfaceLayer }; \ No newline at end of file + } + ) +); + +export { SurfaceLayer }; \ No newline at end of file diff --git a/air-quality-ui/src/components/globe/World.tsx b/air-quality-ui/src/components/globe/World.tsx index 732b7ecd..88d2d899 100644 --- a/air-quality-ui/src/components/globe/World.tsx +++ b/air-quality-ui/src/components/globe/World.tsx @@ -1,26 +1,63 @@ -import { Canvas } from '@react-three/fiber' -import { OrbitControls } from '@react-three/drei' -import { useRef } from "react" +import { Canvas } from '@react-three/fiber'; +import { OrbitControls } from '@react-three/drei'; +import { useRef, useState } from 'react'; +import { SurfaceLayer, SurfaceLayerRef } from './SurfaceLayer'; -import { SurfaceLayer, SurfaceLayerRef } from "./SurfaceLayer" +type WorldProps = { + forecastData: Record; + summarizedMeasurementData: Record; +}; -const World = (): JSX.Element => { +const World = ({ + forecastData, + summarizedMeasurementData, +}: WorldProps): JSX.Element => { + const surface_layer_ref = useRef(null); + const [isTimeRunning, setIsTimeRunning] = useState(true); // State to control time updates - const surface_layer_ref = useRef(null) + // Function to toggle the time update on and off + const toggleTimeUpdate = () => { + setIsTimeRunning((prev) => !prev); + }; + return ( + <> + {/* Button to toggle time update */} + - - return ( - + - + {/* Pass forecastData, summarizedMeasurementData, and isTimeRunning to SurfaceLayer */} + - ) - } - - export default World \ No newline at end of file + + ); +}; + +export default World; \ No newline at end of file diff --git a/air-quality-ui/src/components/summary-view/GlobalSummary.tsx b/air-quality-ui/src/components/summary-view/GlobalSummary.tsx index f89351a0..1b4cf17d 100644 --- a/air-quality-ui/src/components/summary-view/GlobalSummary.tsx +++ b/air-quality-ui/src/components/summary-view/GlobalSummary.tsx @@ -64,6 +64,7 @@ const GlobalSummary = (): JSX.Element => { ) }, [forecastDetails]) + const { data: summarizedMeasurementData, isPending: summaryPending, @@ -109,7 +110,10 @@ const GlobalSummary = (): JSX.Element => { )} {!forecastPending && !summaryPending && (

); }; @@ -98,17 +120,21 @@ const styles = { display: 'flex', justifyContent: 'center', alignItems: 'center', - gap: '20px', + gap: '10px', padding: '10px', backgroundColor: '#f4f4f4', borderTop: '1px solid #ccc', }, controlButton: { - padding: '10px 20px', - fontSize: '16px', - color: 'white', + width: '40px', + height: '40px', + display: 'flex', + justifyContent: 'center', + alignItems: 'center', + fontSize: '32px', // Control the size of the button and the icon + backgroundColor: 'lightgray', // Remove the background color border: 'none', - borderRadius: '5px', + borderRadius: '20%', cursor: 'pointer', }, sliderContainer: { @@ -120,14 +146,21 @@ const styles = { width: '500px', }, globeButton: { - fontSize: '24px', - padding: '10px', - backgroundColor: '#007bff', - color: 'white', + width: '40px', + height: '40px', + display: 'flex', + justifyContent: 'center', + alignItems: 'center', + fontSize: '32px', // Adjust the font size for the globe icon + backgroundColor: 'lightgray', // Remove background border: 'none', - borderRadius: '5px', + borderRadius: '20%', cursor: 'pointer', }, + icon: { + fontSize: '28px', // Make the icons fill the button + lineHeight: '32px', + }, }; export default Controls; \ No newline at end of file From 2b3bf050c33e616d4ab2544474cdaab6c6edfd4a Mon Sep 17 00:00:00 2001 From: sebsteinig Date: Fri, 6 Sep 2024 13:17:08 +0100 Subject: [PATCH 10/39] added PM10 --- .../src/components/globe/Controls.tsx | 111 ++++++- .../components/globe/LocationMarker copy.tsx | 305 ++++++++++++++++++ .../src/components/globe/LocationMarker.tsx | 221 ++++++++++--- .../components/globe/SurfaceLayer copy.tsx | 281 ++++++++++++++++ .../src/components/globe/SurfaceLayer.tsx | 196 +++++++---- air-quality-ui/src/components/globe/World.tsx | 55 +++- .../components/globe/shaders/surfaceFrag.glsl | 78 +++-- 7 files changed, 1102 insertions(+), 145 deletions(-) create mode 100644 air-quality-ui/src/components/globe/LocationMarker copy.tsx create mode 100644 air-quality-ui/src/components/globe/SurfaceLayer copy.tsx diff --git a/air-quality-ui/src/components/globe/Controls.tsx b/air-quality-ui/src/components/globe/Controls.tsx index 6df97fc5..45c37693 100644 --- a/air-quality-ui/src/components/globe/Controls.tsx +++ b/air-quality-ui/src/components/globe/Controls.tsx @@ -5,7 +5,11 @@ type ControlsProps = { isTimeRunning: boolean; onToggleTimeUpdate: () => void; onSliderChange: (value: number) => void; - onGlobeButtonClick: (globeAnimationState: boolean) => void; // New prop to pass globe state to parent + onGlobeButtonClick: (globeAnimationState: boolean) => void; + onLocationMarkerClick: (locationMarkerState: boolean) => void; + onGridFilterClick: (filterState: boolean) => void; + onTimeInterpolationClick: (filterState: boolean) => void; + onVariableSelect: (variable: string) => void; // New prop for variable selection }; const Controls: React.FC = ({ @@ -13,10 +17,18 @@ const Controls: React.FC = ({ onToggleTimeUpdate, onSliderChange, onGlobeButtonClick, + onLocationMarkerClick, + onGridFilterClick, + onTimeInterpolationClick, + onVariableSelect, // New prop passed from parent }) => { const [sliderValue, setSliderValue] = useState(0.0); // Default slider value const [globeAnimationState, setGlobeAnimationState] = useState(false); // State for globe animation - const [timeDelta, setTimeDelta] = useState(0.03); // State for the speed of the slider's advancement + const [locationMarkerState, setLocationMarkerState] = useState(false); // State for location marker + const [filterState, setGridFilterState] = useState(false); // State for grid filter + const [timeInterpolationState, setTimeInterpolationState] = useState(false); // State for time interpolation + const [timeDelta, setTimeDelta] = useState(0.02); // State for the speed of the slider's advancement + const [selectedVariable, setSelectedVariable] = useState('aqi'); // Default variable to display // Handle slider change from user input const handleSliderChange = (event: React.ChangeEvent) => { @@ -29,7 +41,7 @@ const Controls: React.FC = ({ const numForecastTimeSteps = numForecastHours / 3; const currentDate = forecastDetails.forecastBaseDate.plus({ hours: Math.floor(sliderValue * 3) }).toFormat('yyyy-MM-dd T'); - + // Effect to notify parent of slider changes useEffect(() => { onSliderChange(sliderValue); @@ -40,18 +52,42 @@ const Controls: React.FC = ({ if (isTimeRunning) { const interval = setInterval(() => { setSliderValue((prevValue) => (prevValue >= numForecastTimeSteps ? 0 : prevValue + timeDelta)); - }, 10); + }, 20); return () => clearInterval(interval); // Clean up the interval } }, [isTimeRunning, timeDelta]); - // Handle globe button click with GSAP animation + // Handle globe button click const handleGlobeButtonClick = () => { setGlobeAnimationState((prevState) => !prevState); // Toggle globe animation state onGlobeButtonClick(!globeAnimationState); // Notify parent of the state change }; + // Handle location marker button click + const handleLocationMarkerClick = () => { + setLocationMarkerState((prevState) => !prevState); // Toggle location marker state + onLocationMarkerClick(!locationMarkerState); // Notify parent of the state change + }; + + // Handle grid filter button click + const handleGridFilterClick = () => { + setGridFilterState((prevState) => !prevState); + onGridFilterClick(!filterState); // Notify parent of the state change + }; + + const handleTimeInterpolationClick = () => { + setTimeInterpolationState((prevState) => !prevState); + onTimeInterpolationClick(!timeInterpolationState); // Notify parent of the state change + }; + + // Handle variable selection change + const handleVariableSelectChange = (event: React.ChangeEvent) => { + const variable = event.target.value; + setSelectedVariable(variable); + onVariableSelect(variable); // Notify parent of the variable change + }; + // Increase timeDelta const handleIncreaseTimeDelta = () => { setTimeDelta((prevDelta) => prevDelta + 0.01); // Increase by 0.01 @@ -71,6 +107,7 @@ const Controls: React.FC = ({ > {isTimeRunning ? '⏸️' : '▶️'} + {/* Minus Button */}

mTgOdPZtXpn6xqFjN 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 DhaTQ~ literal 0 HcmV?d00001 diff --git a/air-quality-ui/src/components/globe/SurfaceLayer.static.tsx b/air-quality-ui/src/components/globe/SurfaceLayer copy.tsx similarity index 100% rename from air-quality-ui/src/components/globe/SurfaceLayer.static.tsx rename to air-quality-ui/src/components/globe/SurfaceLayer copy.tsx diff --git a/air-quality-ui/src/components/globe/SurfaceLayer.tsx b/air-quality-ui/src/components/globe/SurfaceLayer.tsx index 53f2a471..06cdf427 100644 --- a/air-quality-ui/src/components/globe/SurfaceLayer.tsx +++ b/air-quality-ui/src/components/globe/SurfaceLayer.tsx @@ -15,11 +15,14 @@ import { const loader = new THREE.TextureLoader(); const cmap = loader.load('/all_colormaps.png'); const lsm = loader.load('/NaturalEarthCoastline2.jpg'); + const height = loader.load('/gebco_08_rev_elev_2k_HQ.jpg'); + cmap.minFilter = THREE.NearestFilter; cmap.magFilter = THREE.NearestFilter; lsm.minFilter = THREE.NearestFilter; lsm.magFilter = THREE.NearestFilter; - + height.minFilter = THREE.NearestFilter; + height.magFilter = THREE.NearestFilter; const geometry = new THREE.PlaneGeometry(4, 2, 64 * 4, 32 * 4); @@ -98,7 +101,7 @@ import { thisDataMax: { value: new Float32Array(1) }, nextDataMin: { value: null }, nextDataMax: { value: null }, - referenceHeightTexture: { value: null }, + referenceHeightTexture: { value: height }, referenceDataMin: { value: null }, referenceDataMax: { value: null }, referenceDataHeightFlag: { value: false }, @@ -108,7 +111,7 @@ import { }, })); - const imageUrl = 'http://localhost:5173/data_textures/2024-08-04_00/aqi_2024-08-04_00_CAMS_global.chunk_1_of_3.webp'; + const imageUrl = 'http://localhost:5173/data_textures/2024-08-29_00/aqi_2024-08-29_00_CAMS_global.chunk_1_of_3.webp'; const fullImageCanvasRef = useRef(null); @@ -146,7 +149,7 @@ import { useEffect(() => { const interval = setInterval(() => { - elapsedTimeRef.current += 0.03; + elapsedTimeRef.current += 0.015; if (elapsedTimeRef.current >= 1) { if (windowIndexRef.current >= 14.) { @@ -162,6 +165,7 @@ import { const weight = currentTime % 1; // Value between 0 and 1 if (materialRef.current) { materialRef.current.uniforms.uFrameWeight.value = weight; + // materialRef.current.uniforms.uFrameWeight.value = 0.0; materialRef.current.uniforms.uFrameWeight.needsUpdate = true; } }, 1); diff --git a/air-quality-ui/src/components/globe/World.tsx b/air-quality-ui/src/components/globe/World.tsx index ff48e382..732b7ecd 100644 --- a/air-quality-ui/src/components/globe/World.tsx +++ b/air-quality-ui/src/components/globe/World.tsx @@ -1,6 +1,6 @@ import { Canvas } from '@react-three/fiber' import { OrbitControls } from '@react-three/drei' -import { useRef, useEffect, memo } from "react" +import { useRef } from "react" import { SurfaceLayer, SurfaceLayerRef } from "./SurfaceLayer" @@ -17,10 +17,6 @@ const World = (): JSX.Element => { > - {/* - - - */} diff --git a/air-quality-ui/src/components/globe/shaders/surfaceVert.glsl b/air-quality-ui/src/components/globe/shaders/surfaceVert.glsl index 646a6937..405c26aa 100644 --- a/air-quality-ui/src/components/globe/shaders/surfaceVert.glsl +++ b/air-quality-ui/src/components/globe/shaders/surfaceVert.glsl @@ -10,7 +10,7 @@ uniform float thisDataMin[12]; uniform float thisDataMax[12]; uniform sampler2D dataTexture; // Heightmap texture - +uniform sampler2D referenceHeightTexture; //////////////////////////////////////////////////////////////////////////////////////////////////////////////// // varying for fragment shader //////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -55,20 +55,19 @@ void main() { float thisFrameData = remap( texture2D( - dataTexture, + referenceHeightTexture, uv ).r, 0.0, 1.0, - thisDataMin[0], - thisDataMax[0]); + 0.0, + 8000.0); float dataRemapped = userRemap(thisFrameData); - // Sample the heightmap texture - // float height = texture2D(dataTexture, uv).r - 0.5; + // float height = texture2D(referenceHeightTexture, uv).r - 0.5; // float height = dataRemapped - 0.5; float height = 0.0; From 85d3f001d76355bd27b189c56a9c2243465d191a Mon Sep 17 00:00:00 2001 From: sebsteinig Date: Tue, 6 Aug 2024 17:00:02 +0100 Subject: [PATCH 03/39] first r3f map version --- air-quality-ui/package-lock.json | 9702 ++++++++++++++++- air-quality-ui/package.json | 6 +- .../public/Maximum_Voltage_Regular.json | 1 + .../public/NaturalEarthCoastline2.jpg | Bin 0 -> 155744 bytes air-quality-ui/public/all_colormaps.png | Bin 0 -> 1436 bytes .../components/globe/SurfaceLayer.static.tsx | 144 + .../src/components/globe/SurfaceLayer.tsx | 196 + .../src/components/globe/TextureProcessor.tsx | 69 + air-quality-ui/src/components/globe/World.tsx | 30 + .../components/globe/shaders/surfaceFrag.glsl | 130 + .../components/globe/shaders/surfaceVert.glsl | 89 + .../components/summary-view/GlobalSummary.tsx | 2 + air-quality-ui/vite.config.ts | 3 +- 13 files changed, 10145 insertions(+), 227 deletions(-) create mode 100644 air-quality-ui/public/Maximum_Voltage_Regular.json create mode 100644 air-quality-ui/public/NaturalEarthCoastline2.jpg create mode 100644 air-quality-ui/public/all_colormaps.png create mode 100644 air-quality-ui/src/components/globe/SurfaceLayer.static.tsx create mode 100644 air-quality-ui/src/components/globe/SurfaceLayer.tsx create mode 100644 air-quality-ui/src/components/globe/TextureProcessor.tsx create mode 100644 air-quality-ui/src/components/globe/World.tsx create mode 100644 air-quality-ui/src/components/globe/shaders/surfaceFrag.glsl create mode 100644 air-quality-ui/src/components/globe/shaders/surfaceVert.glsl diff --git a/air-quality-ui/package-lock.json b/air-quality-ui/package-lock.json index 8517aef8..902bcfcc 100644 --- a/air-quality-ui/package-lock.json +++ b/air-quality-ui/package-lock.json @@ -1,7 +1,7 @@ { "name": "air-quality-ui", "version": "0.0.0", - "lockfileVersion": 3, + "lockfileVersion": 2, "requires": true, "packages": { "": { @@ -11,6 +11,8 @@ "@emotion/react": "^11.13.0", "@emotion/styled": "^11.13.0", "@mui/x-date-pickers": "^7.12.0", + "@react-three/drei": "^9.109.2", + "@react-three/fiber": "^8.16.8", "@tanstack/react-query": "^5.40.1", "@types/echarts": "^4.9.22", "ag-grid-react": "^31.3.2", @@ -23,7 +25,9 @@ "react": "^18.2.0", "react-dom": "^18.2.0", "react-router-dom": "^6.23.1", - "react-select": "^5.8.0" + "react-select": "^5.8.0", + "three": "^0.167.1", + "vite-plugin-glsl": "^1.3.0" }, "devDependencies": { "@playwright/test": "^1.45.0", @@ -770,7 +774,6 @@ "cpu": [ "ppc64" ], - "dev": true, "optional": true, "os": [ "aix" @@ -786,7 +789,6 @@ "cpu": [ "arm" ], - "dev": true, "optional": true, "os": [ "android" @@ -802,7 +804,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "android" @@ -818,7 +819,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "android" @@ -834,7 +834,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "darwin" @@ -850,7 +849,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "darwin" @@ -866,7 +864,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "freebsd" @@ -882,7 +879,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "freebsd" @@ -898,7 +894,6 @@ "cpu": [ "arm" ], - "dev": true, "optional": true, "os": [ "linux" @@ -914,7 +909,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -930,7 +924,6 @@ "cpu": [ "ia32" ], - "dev": true, "optional": true, "os": [ "linux" @@ -946,7 +939,6 @@ "cpu": [ "loong64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -962,7 +954,6 @@ "cpu": [ "mips64el" ], - "dev": true, "optional": true, "os": [ "linux" @@ -978,7 +969,6 @@ "cpu": [ "ppc64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -994,7 +984,6 @@ "cpu": [ "riscv64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -1010,7 +999,6 @@ "cpu": [ "s390x" ], - "dev": true, "optional": true, "os": [ "linux" @@ -1026,7 +1014,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -1042,7 +1029,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "netbsd" @@ -1058,7 +1044,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "openbsd" @@ -1074,7 +1059,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "sunos" @@ -1090,7 +1074,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "win32" @@ -1106,7 +1089,6 @@ "cpu": [ "ia32" ], - "dev": true, "optional": true, "os": [ "win32" @@ -1122,7 +1104,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "win32" @@ -1237,26 +1218,26 @@ } }, "node_modules/@floating-ui/core": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.7.tgz", - "integrity": "sha512-yDzVT/Lm101nQ5TCVeK65LtdN7Tj4Qpr9RTXJ2vPFLqtLxwOrpoxAHAJI8J3yYWUc40J0BDBheaitK5SJmno2g==", + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.6.tgz", + "integrity": "sha512-Vkvsw6EcpMHjvZZdMkSY+djMGFbt7CRssW99Ne8tar2WLnZ/l3dbxeTShbLQj+/s35h+Qb4cmnob+EzwtjrXGQ==", "dependencies": { - "@floating-ui/utils": "^0.2.7" + "@floating-ui/utils": "^0.2.6" } }, "node_modules/@floating-ui/dom": { - "version": "1.6.10", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.10.tgz", - "integrity": "sha512-fskgCFv8J8OamCmyun8MfjB1Olfn+uZKjOKZ0vhYF3gRmEUXcGOjxWL8bBr7i4kIuPZ2KD2S3EUIOxnjC8kl2A==", + "version": "1.6.9", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.9.tgz", + "integrity": "sha512-zB1PcI350t4tkm3rvUhSRKa9sT7vH5CrAbQxW+VaPYJXKAO0gsg4CTueL+6Ajp7XzAQC8CW4Jj1Wgqc0sB6oUQ==", "dependencies": { "@floating-ui/core": "^1.6.0", - "@floating-ui/utils": "^0.2.7" + "@floating-ui/utils": "^0.2.6" } }, "node_modules/@floating-ui/utils": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.7.tgz", - "integrity": "sha512-X8R8Oj771YRl/w+c1HqAC1szL8zWQRwFvgDwT129k9ACdBoud/+/rX9V0qiMl6LWUdP9voC2nDVZYPMQQsb6eA==" + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.6.tgz", + "integrity": "sha512-0KI3zGxIUs1KDR/pjQPdJH4Z8nGBm0yJ5WRoRfdw1Kzeh45jkIfA0rmD0kBF6fKHH+xaH7g8y4jIXyAV5MGK3g==" }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.14", @@ -2194,6 +2175,27 @@ "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-2.0.0.tgz", "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==" }, + "node_modules/@maplibre/maplibre-gl-style-spec/node_modules/tinyqueue": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-2.0.3.tgz", + "integrity": "sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==" + }, + "node_modules/@mediapipe/tasks-vision": { + "version": "0.10.8", + "resolved": "https://registry.npmjs.org/@mediapipe/tasks-vision/-/tasks-vision-0.10.8.tgz", + "integrity": "sha512-Rp7ll8BHrKB3wXaRFKhrltwZl1CiXGdibPxuWXvqGnKTnv8fqa/nvftYNuSbf+pbJWKYCXdBtYTITdAUTGGh0Q==" + }, + "node_modules/@monogrid/gainmap-js": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@monogrid/gainmap-js/-/gainmap-js-3.0.5.tgz", + "integrity": "sha512-53sCTG4FaJBaAq/tcufARtVYDMDGqyBT9i7F453pWGhZ5LqubDHDWtYoHo9VhQqMcHTEexdJqSsR58y+9HVmQA==", + "dependencies": { + "promise-worker-transferable": "^1.0.4" + }, + "peerDependencies": { + "three": ">= 0.159.0" + } + }, "node_modules/@mui/core-downloads-tracker": { "version": "5.16.7", "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.16.7.tgz", @@ -2499,12 +2501,12 @@ } }, "node_modules/@playwright/test": { - "version": "1.46.1", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.46.1.tgz", - "integrity": "sha512-Fq6SwLujA/DOIvNC2EL/SojJnkKf/rAwJ//APpJJHRyMi1PdKrY3Az+4XNQ51N4RTbItbIByQ0jgd1tayq1aeA==", + "version": "1.46.0", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.46.0.tgz", + "integrity": "sha512-/QYft5VArOrGRP5pgkrfKksqsKA6CEFyGQ/gjNe6q0y4tZ1aaPfq4gIjudr1s3D+pXyrPRdsy4opKDrjBabE5w==", "dev": true, "dependencies": { - "playwright": "1.46.1" + "playwright": "1.46.0" }, "bin": { "playwright": "cli.js" @@ -2523,6 +2525,163 @@ "url": "https://opencollective.com/popperjs" } }, + "node_modules/@react-spring/animated": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@react-spring/animated/-/animated-9.6.1.tgz", + "integrity": "sha512-ls/rJBrAqiAYozjLo5EPPLLOb1LM0lNVQcXODTC1SMtS6DbuBCPaKco5svFUQFMP2dso3O+qcC4k9FsKc0KxMQ==", + "dependencies": { + "@react-spring/shared": "~9.6.1", + "@react-spring/types": "~9.6.1" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@react-spring/core": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@react-spring/core/-/core-9.6.1.tgz", + "integrity": "sha512-3HAAinAyCPessyQNNXe5W0OHzRfa8Yo5P748paPcmMowZ/4sMfaZ2ZB6e5x5khQI8NusOHj8nquoutd6FRY5WQ==", + "dependencies": { + "@react-spring/animated": "~9.6.1", + "@react-spring/rafz": "~9.6.1", + "@react-spring/shared": "~9.6.1", + "@react-spring/types": "~9.6.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/react-spring/donate" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@react-spring/rafz": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@react-spring/rafz/-/rafz-9.6.1.tgz", + "integrity": "sha512-v6qbgNRpztJFFfSE3e2W1Uz+g8KnIBs6SmzCzcVVF61GdGfGOuBrbjIcp+nUz301awVmREKi4eMQb2Ab2gGgyQ==" + }, + "node_modules/@react-spring/shared": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@react-spring/shared/-/shared-9.6.1.tgz", + "integrity": "sha512-PBFBXabxFEuF8enNLkVqMC9h5uLRBo6GQhRMQT/nRTnemVENimgRd+0ZT4yFnAQ0AxWNiJfX3qux+bW2LbG6Bw==", + "dependencies": { + "@react-spring/rafz": "~9.6.1", + "@react-spring/types": "~9.6.1" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@react-spring/three": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@react-spring/three/-/three-9.6.1.tgz", + "integrity": "sha512-Tyw2YhZPKJAX3t2FcqvpLRb71CyTe1GvT3V+i+xJzfALgpk10uPGdGaQQ5Xrzmok1340DAeg2pR/MCfaW7b8AA==", + "dependencies": { + "@react-spring/animated": "~9.6.1", + "@react-spring/core": "~9.6.1", + "@react-spring/shared": "~9.6.1", + "@react-spring/types": "~9.6.1" + }, + "peerDependencies": { + "@react-three/fiber": ">=6.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "three": ">=0.126" + } + }, + "node_modules/@react-spring/types": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@react-spring/types/-/types-9.6.1.tgz", + "integrity": "sha512-POu8Mk0hIU3lRXB3bGIGe4VHIwwDsQyoD1F394OK7STTiX9w4dG3cTLljjYswkQN+hDSHRrj4O36kuVa7KPU8Q==" + }, + "node_modules/@react-three/drei": { + "version": "9.109.2", + "resolved": "https://registry.npmjs.org/@react-three/drei/-/drei-9.109.2.tgz", + "integrity": "sha512-oUbfjiyPQeQch4Mi3jZvFKigMlc97/xvazxyjPBCGa8RP8cHZJl187eZI9Ha1WwkVaX80DfgN7bYAWXS4ywxmw==", + "dependencies": { + "@babel/runtime": "^7.11.2", + "@mediapipe/tasks-vision": "0.10.8", + "@monogrid/gainmap-js": "^3.0.5", + "@react-spring/three": "~9.6.1", + "@use-gesture/react": "^10.2.24", + "camera-controls": "^2.4.2", + "cross-env": "^7.0.3", + "detect-gpu": "^5.0.28", + "glsl-noise": "^0.0.0", + "hls.js": "1.3.5", + "maath": "^0.10.7", + "meshline": "^3.1.6", + "react-composer": "^5.0.3", + "stats-gl": "^2.0.0", + "stats.js": "^0.17.0", + "suspend-react": "^0.1.3", + "three-mesh-bvh": "^0.7.0", + "three-stdlib": "^2.29.9", + "troika-three-text": "^0.49.0", + "tunnel-rat": "^0.1.2", + "utility-types": "^3.10.0", + "uuid": "^9.0.1", + "zustand": "^3.7.1" + }, + "peerDependencies": { + "@react-three/fiber": ">=8.0", + "react": ">=18.0", + "react-dom": ">=18.0", + "three": ">=0.137" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/@react-three/fiber": { + "version": "8.16.8", + "resolved": "https://registry.npmjs.org/@react-three/fiber/-/fiber-8.16.8.tgz", + "integrity": "sha512-Lc8fjATtvQEfSd8d5iKdbpHtRm/aPMeFj7jQvp6TNHfpo8IQTW3wwcE1ZMrGGoUH+w2mnyS+0MK1NLPLnuzGkQ==", + "dependencies": { + "@babel/runtime": "^7.17.8", + "@types/react-reconciler": "^0.26.7", + "@types/webxr": "*", + "base64-js": "^1.5.1", + "buffer": "^6.0.3", + "its-fine": "^1.0.6", + "react-reconciler": "^0.27.0", + "react-use-measure": "^2.1.1", + "scheduler": "^0.21.0", + "suspend-react": "^0.1.3", + "zustand": "^3.7.1" + }, + "peerDependencies": { + "expo": ">=43.0", + "expo-asset": ">=8.4", + "expo-file-system": ">=11.0", + "expo-gl": ">=11.0", + "react": ">=18.0", + "react-dom": ">=18.0", + "react-native": ">=0.64", + "three": ">=0.133" + }, + "peerDependenciesMeta": { + "expo": { + "optional": true + }, + "expo-asset": { + "optional": true + }, + "expo-file-system": { + "optional": true + }, + "expo-gl": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, "node_modules/@remix-run/router": { "version": "1.19.1", "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.19.1.tgz", @@ -2531,209 +2690,214 @@ "node": ">=14.0.0" } }, + "node_modules/@rollup/pluginutils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", + "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.0.tgz", - "integrity": "sha512-WTWD8PfoSAJ+qL87lE7votj3syLavxunWhzCnx3XFxFiI/BA/r3X7MUM8dVrH8rb2r4AiO8jJsr3ZjdaftmnfA==", + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.20.0.tgz", + "integrity": "sha512-TSpWzflCc4VGAUJZlPpgAJE1+V60MePDQnBd7PPkpuEmOy8i87aL6tinFGKBFKuEDikYpig72QzdT3QPYIi+oA==", "cpu": [ "arm" ], - "dev": true, "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.21.0.tgz", - "integrity": "sha512-a1sR2zSK1B4eYkiZu17ZUZhmUQcKjk2/j9Me2IDjk1GHW7LB5Z35LEzj9iJch6gtUfsnvZs1ZNyDW2oZSThrkA==", + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.20.0.tgz", + "integrity": "sha512-u00Ro/nok7oGzVuh/FMYfNoGqxU5CPWz1mxV85S2w9LxHR8OoMQBuSk+3BKVIDYgkpeOET5yXkx90OYFc+ytpQ==", "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.21.0.tgz", - "integrity": "sha512-zOnKWLgDld/svhKO5PD9ozmL6roy5OQ5T4ThvdYZLpiOhEGY+dp2NwUmxK0Ld91LrbjrvtNAE0ERBwjqhZTRAA==", + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.20.0.tgz", + "integrity": "sha512-uFVfvzvsdGtlSLuL0ZlvPJvl6ZmrH4CBwLGEFPe7hUmf7htGAN+aXo43R/V6LATyxlKVC/m6UsLb7jbG+LG39Q==", "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.21.0.tgz", - "integrity": "sha512-7doS8br0xAkg48SKE2QNtMSFPFUlRdw9+votl27MvT46vo44ATBmdZdGysOevNELmZlfd+NEa0UYOA8f01WSrg==", + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.20.0.tgz", + "integrity": "sha512-xbrMDdlev53vNXexEa6l0LffojxhqDTBeL+VUxuuIXys4x6xyvbKq5XqTXBCEUA8ty8iEJblHvFaWRJTk/icAQ==", "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.21.0.tgz", - "integrity": "sha512-pWJsfQjNWNGsoCq53KjMtwdJDmh/6NubwQcz52aEwLEuvx08bzcy6tOUuawAOncPnxz/3siRtd8hiQ32G1y8VA==", + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.20.0.tgz", + "integrity": "sha512-jMYvxZwGmoHFBTbr12Xc6wOdc2xA5tF5F2q6t7Rcfab68TT0n+r7dgawD4qhPEvasDsVpQi+MgDzj2faOLsZjA==", "cpu": [ "arm" ], - "dev": true, "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.21.0.tgz", - "integrity": "sha512-efRIANsz3UHZrnZXuEvxS9LoCOWMGD1rweciD6uJQIx2myN3a8Im1FafZBzh7zk1RJ6oKcR16dU3UPldaKd83w==", + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.20.0.tgz", + "integrity": "sha512-1asSTl4HKuIHIB1GcdFHNNZhxAYEdqML/MW4QmPS4G0ivbEcBr1JKlFLKsIRqjSwOBkdItn3/ZDlyvZ/N6KPlw==", "cpu": [ "arm" ], - "dev": true, "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.21.0.tgz", - "integrity": "sha512-ZrPhydkTVhyeGTW94WJ8pnl1uroqVHM3j3hjdquwAcWnmivjAwOYjTEAuEDeJvGX7xv3Z9GAvrBkEzCgHq9U1w==", + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.20.0.tgz", + "integrity": "sha512-COBb8Bkx56KldOYJfMf6wKeYJrtJ9vEgBRAOkfw6Ens0tnmzPqvlpjZiLgkhg6cA3DGzCmLmmd319pmHvKWWlQ==", "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.21.0.tgz", - "integrity": "sha512-cfaupqd+UEFeURmqNP2eEvXqgbSox/LHOyN9/d2pSdV8xTrjdg3NgOFJCtc1vQ/jEke1qD0IejbBfxleBPHnPw==", + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.20.0.tgz", + "integrity": "sha512-+it+mBSyMslVQa8wSPvBx53fYuZK/oLTu5RJoXogjk6x7Q7sz1GNRsXWjn6SwyJm8E/oMjNVwPhmNdIjwP135Q==", "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.21.0.tgz", - "integrity": "sha512-ZKPan1/RvAhrUylwBXC9t7B2hXdpb/ufeu22pG2psV7RN8roOfGurEghw1ySmX/CmDDHNTDDjY3lo9hRlgtaHg==", + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.20.0.tgz", + "integrity": "sha512-yAMvqhPfGKsAxHN8I4+jE0CpLWD8cv4z7CK7BMmhjDuz606Q2tFKkWRY8bHR9JQXYcoLfopo5TTqzxgPUjUMfw==", "cpu": [ "ppc64" ], - "dev": true, "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.21.0.tgz", - "integrity": "sha512-H1eRaCwd5E8eS8leiS+o/NqMdljkcb1d6r2h4fKSsCXQilLKArq6WS7XBLDu80Yz+nMqHVFDquwcVrQmGr28rg==", + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.20.0.tgz", + "integrity": "sha512-qmuxFpfmi/2SUkAw95TtNq/w/I7Gpjurx609OOOV7U4vhvUhBcftcmXwl3rqAek+ADBwSjIC4IVNLiszoj3dPA==", "cpu": [ "riscv64" ], - "dev": true, "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.21.0.tgz", - "integrity": "sha512-zJ4hA+3b5tu8u7L58CCSI0A9N1vkfwPhWd/puGXwtZlsB5bTkwDNW/+JCU84+3QYmKpLi+XvHdmrlwUwDA6kqw==", + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.20.0.tgz", + "integrity": "sha512-I0BtGXddHSHjV1mqTNkgUZLnS3WtsqebAXv11D5BZE/gfw5KoyXSAXVqyJximQXNvNzUo4GKlCK/dIwXlz+jlg==", "cpu": [ "s390x" ], - "dev": true, "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.21.0.tgz", - "integrity": "sha512-e2hrvElFIh6kW/UNBQK/kzqMNY5mO+67YtEh9OA65RM5IJXYTWiXjX6fjIiPaqOkBthYF1EqgiZ6OXKcQsM0hg==", + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.20.0.tgz", + "integrity": "sha512-y+eoL2I3iphUg9tN9GB6ku1FA8kOfmF4oUEWhztDJ4KXJy1agk/9+pejOuZkNFhRwHAOxMsBPLbXPd6mJiCwew==", "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.21.0.tgz", - "integrity": "sha512-1vvmgDdUSebVGXWX2lIcgRebqfQSff0hMEkLJyakQ9JQUbLDkEaMsPTLOmyccyC6IJ/l3FZuJbmrBw/u0A0uCQ==", + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.20.0.tgz", + "integrity": "sha512-hM3nhW40kBNYUkZb/r9k2FKK+/MnKglX7UYd4ZUy5DJs8/sMsIbqWK2piZtVGE3kcXVNj3B2IrUYROJMMCikNg==", "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.21.0.tgz", - "integrity": "sha512-s5oFkZ/hFcrlAyBTONFY1TWndfyre1wOMwU+6KCpm/iatybvrRgmZVM+vCFwxmC5ZhdlgfE0N4XorsDpi7/4XQ==", + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.20.0.tgz", + "integrity": "sha512-psegMvP+Ik/Bg7QRJbv8w8PAytPA7Uo8fpFjXyCRHWm6Nt42L+JtoqH8eDQ5hRP7/XW2UiIriy1Z46jf0Oa1kA==", "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.21.0.tgz", - "integrity": "sha512-G9+TEqRnAA6nbpqyUqgTiopmnfgnMkR3kMukFBDsiyy23LZvUCpiUwjTRx6ezYCjJODXrh52rBR9oXvm+Fp5wg==", + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.20.0.tgz", + "integrity": "sha512-GabekH3w4lgAJpVxkk7hUzUf2hICSQO0a/BLFA11/RMxQT92MabKAqyubzDZmMOC/hcJNlc+rrypzNzYl4Dx7A==", "cpu": [ "ia32" ], - "dev": true, "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.0.tgz", - "integrity": "sha512-2jsCDZwtQvRhejHLfZ1JY6w6kEuEtfF9nzYsZxzSlNVKDX+DpsDJ+Rbjkm74nvg2rdx0gwBS+IMdvwJuq3S9pQ==", + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.20.0.tgz", + "integrity": "sha512-aJ1EJSuTdGnM6qbVC4B5DSmozPTqIag9fSzXRNNo+humQLG89XpPgdt16Ia56ORD7s+H8Pmyx44uczDQ0yDzpg==", "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "win32" @@ -2763,20 +2927,20 @@ } }, "node_modules/@tanstack/query-core": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.52.0.tgz", - "integrity": "sha512-U1DOEgltjUwalN6uWYTewSnA14b+tE7lSylOiASKCAO61ENJeCq9VVD/TXHA6O5u9+6v5+UgGYBSccTKDoyMqw==", + "version": "5.51.21", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.51.21.tgz", + "integrity": "sha512-POQxm42IUp6n89kKWF4IZi18v3fxQWFRolvBA6phNVmA8psdfB1MvDnGacCJdS+EOX12w/CyHM62z//rHmYmvw==", "funding": { "type": "github", "url": "https://github.com/sponsors/tannerlinsley" } }, "node_modules/@tanstack/react-query": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.52.0.tgz", - "integrity": "sha512-T8tLZdPEopSD3A1EBZ/sq7WkI76pKLKKiT82F486K8wf26EPgYCdeiSnJfuayssdQjWwLQMQVl/ROUBNmlWgCQ==", + "version": "5.51.21", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.51.21.tgz", + "integrity": "sha512-Q/V81x3sAYgCsxjwOkfLXfrmoG+FmDhLeHH5okC/Bp8Aaw2c33lbEo/mMcMnkxUPVtB2FLpzHT0tq3c+OlZEbw==", "dependencies": { - "@tanstack/query-core": "5.52.0" + "@tanstack/query-core": "5.51.21" }, "funding": { "type": "github", @@ -3026,6 +3190,11 @@ "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", "dev": true }, + "node_modules/@tweenjs/tween.js": { + "version": "23.1.3", + "resolved": "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-23.1.3.tgz", + "integrity": "sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA==" + }, "node_modules/@types/aria-query": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", @@ -3073,6 +3242,11 @@ "@babel/types": "^7.20.7" } }, + "node_modules/@types/draco3d": { + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/@types/draco3d/-/draco3d-1.4.10.tgz", + "integrity": "sha512-AX22jp8Y7wwaBgAixaSvkoG4M/+PlAcm3Qs4OW8yT9DM4xUpWKeFhLueTAyZF39pviAdcDdeJoACapiAceqNcw==" + }, "node_modules/@types/echarts": { "version": "4.9.22", "resolved": "https://registry.npmjs.org/@types/echarts/-/echarts-4.9.22.tgz", @@ -3084,8 +3258,7 @@ "node_modules/@types/estree": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" }, "node_modules/@types/geojson": { "version": "7946.0.14", @@ -3177,6 +3350,12 @@ "parse5": "^7.0.0" } }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, "node_modules/@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", @@ -3212,6 +3391,11 @@ "undici-types": "~6.19.2" } }, + "node_modules/@types/offscreencanvas": { + "version": "2019.7.3", + "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.7.3.tgz", + "integrity": "sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==" + }, "node_modules/@types/parse-json": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", @@ -3245,6 +3429,14 @@ "@types/react": "*" } }, + "node_modules/@types/react-reconciler": { + "version": "0.26.7", + "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.26.7.tgz", + "integrity": "sha512-mBDYl8x+oyPX/VBb3E638N0B7xG+SPk/EAMcVPeexqus/5aTpTphQi0curhhshOqRrc9t6OPoJfEUkbymse/lQ==", + "dependencies": { + "@types/react": "*" + } + }, "node_modules/@types/react-transition-group": { "version": "4.4.11", "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.11.tgz", @@ -3253,12 +3445,23 @@ "@types/react": "*" } }, + "node_modules/@types/semver": { + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", + "dev": true + }, "node_modules/@types/stack-utils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", "dev": true }, + "node_modules/@types/stats.js": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@types/stats.js/-/stats.js-0.17.3.tgz", + "integrity": "sha512-pXNfAD3KHOdif9EQXZ9deK82HVNaXP5ZIF5RP2QG6OQFNTaY2YIetfrE9t528vEreGQvEPRDDc8muaoYeK0SxQ==" + }, "node_modules/@types/supercluster": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/@types/supercluster/-/supercluster-7.1.3.tgz", @@ -3267,12 +3470,30 @@ "@types/geojson": "*" } }, + "node_modules/@types/three": { + "version": "0.167.1", + "resolved": "https://registry.npmjs.org/@types/three/-/three-0.167.1.tgz", + "integrity": "sha512-OCd2Uv/8/4TbmSaIRFawrCOnDMLdpaa+QGJdhlUBmdfbHjLY8k6uFc0tde2/UvcaHQ6NtLl28onj/vJfofV+Tg==", + "peer": true, + "dependencies": { + "@tweenjs/tween.js": "~23.1.2", + "@types/stats.js": "*", + "@types/webxr": "*", + "fflate": "~0.8.2", + "meshoptimizer": "~0.18.1" + } + }, "node_modules/@types/tough-cookie": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", "dev": true }, + "node_modules/@types/webxr": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.19.tgz", + "integrity": "sha512-4hxA+NwohSgImdTSlPXEqDqqFktNgmTXQ05ff1uWam05tNGroCMp4G+4XVl6qWm1p7GQ/9oD41kAYsSssF6Mzw==" + }, "node_modules/@types/yargs": { "version": "17.0.33", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", @@ -3292,23 +3513,25 @@ "integrity": "sha512-1jZ9bJn2BsfmYFPBHtl5o3uV+ILejAtGrDcYSpT4qaVKEI/0YY+arw3XHU04Ebd8Nca3SQ7uNcLaqiL+tTFVMg==" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.18.0.tgz", - "integrity": "sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.2.0.tgz", + "integrity": "sha512-mdekAHOqS9UjlmyF/LSs6AIEvfceV749GFxoBAjwAv0nkevfKHWQFDMcBZWUiIC5ft6ePWivXoS36aKQ0Cy3sw==", "dev": true, "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "7.18.0", - "@typescript-eslint/type-utils": "7.18.0", - "@typescript-eslint/utils": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0", + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "7.2.0", + "@typescript-eslint/type-utils": "7.2.0", + "@typescript-eslint/utils": "7.2.0", + "@typescript-eslint/visitor-keys": "7.2.0", + "debug": "^4.3.4", "graphemer": "^1.4.0", - "ignore": "^5.3.1", + "ignore": "^5.2.4", "natural-compare": "^1.4.0", - "ts-api-utils": "^1.3.0" + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -3325,19 +3548,19 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.18.0.tgz", - "integrity": "sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.2.0.tgz", + "integrity": "sha512-5FKsVcHTk6TafQKQbuIVkXq58Fnbkd2wDL4LB7AURN7RUOu1utVP+G8+6u3ZhEroW3DF6hyo3ZEXxgKgp4KeCg==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "7.18.0", - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/typescript-estree": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0", + "@typescript-eslint/scope-manager": "7.2.0", + "@typescript-eslint/types": "7.2.0", + "@typescript-eslint/typescript-estree": "7.2.0", + "@typescript-eslint/visitor-keys": "7.2.0", "debug": "^4.3.4" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -3353,16 +3576,16 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz", - "integrity": "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.2.0.tgz", + "integrity": "sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0" + "@typescript-eslint/types": "7.2.0", + "@typescript-eslint/visitor-keys": "7.2.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -3370,18 +3593,18 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz", - "integrity": "sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.2.0.tgz", + "integrity": "sha512-xHi51adBHo9O9330J8GQYQwrKBqbIPJGZZVQTHHmy200hvkLZFWJIFtAG/7IYTWUyun6DE6w5InDReePJYJlJA==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "7.18.0", - "@typescript-eslint/utils": "7.18.0", + "@typescript-eslint/typescript-estree": "7.2.0", + "@typescript-eslint/utils": "7.2.0", "debug": "^4.3.4", - "ts-api-utils": "^1.3.0" + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -3397,12 +3620,12 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz", - "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.2.0.tgz", + "integrity": "sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA==", "dev": true, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -3410,22 +3633,22 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz", - "integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.2.0.tgz", + "integrity": "sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0", + "@typescript-eslint/types": "7.2.0", + "@typescript-eslint/visitor-keys": "7.2.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -3438,18 +3661,21 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.18.0.tgz", - "integrity": "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.2.0.tgz", + "integrity": "sha512-YfHpnMAGb1Eekpm3XRK8hcMwGLGsnT6L+7b2XyRv6ouDuJU1tZir1GS2i0+VXRatMwSI1/UfcyPe53ADkU+IuA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "7.18.0", - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/typescript-estree": "7.18.0" + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "7.2.0", + "@typescript-eslint/types": "7.2.0", + "@typescript-eslint/typescript-estree": "7.2.0", + "semver": "^7.5.4" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -3460,16 +3686,16 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz", - "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.2.0.tgz", + "integrity": "sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.18.0", - "eslint-visitor-keys": "^3.4.3" + "@typescript-eslint/types": "7.2.0", + "eslint-visitor-keys": "^3.4.1" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -3482,6 +3708,22 @@ "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", "dev": true }, + "node_modules/@use-gesture/core": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/@use-gesture/core/-/core-10.3.1.tgz", + "integrity": "sha512-WcINiDt8WjqBdUXye25anHiNxPc0VOrlT8F6LLkU6cycrOGUDyY/yyFmsg3k8i5OLvv25llc0QC45GhR/C8llw==" + }, + "node_modules/@use-gesture/react": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/@use-gesture/react/-/react-10.3.1.tgz", + "integrity": "sha512-Yy19y6O2GJq8f7CHf7L0nxL8bf4PZCPaVOCgJrusOeFHY1LvHgYXnmnXg6N5iwAnbgbZCDjo60SiM6IPJi9C5g==", + "dependencies": { + "@use-gesture/core": "10.3.1" + }, + "peerDependencies": { + "react": ">= 16.8.0" + } + }, "node_modules/@vitejs/plugin-react": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.1.tgz", @@ -4041,6 +4283,33 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bidi-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz", + "integrity": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==", + "dependencies": { + "require-from-string": "^2.0.2" + } + }, "node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", @@ -4115,6 +4384,29 @@ "node-int64": "^0.4.0" } }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -4174,10 +4466,18 @@ "node": ">=6" } }, + "node_modules/camera-controls": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/camera-controls/-/camera-controls-2.8.5.tgz", + "integrity": "sha512-7VTwRk7Nu1nRKsY7bEt9HVBfKt8DETvzyYhLN4OW26OByBayMDB5fUaNcPI+z++vG23RH5yqn6ZRhZcgLQy2rA==", + "peerDependencies": { + "three": ">=0.126.1" + } + }, "node_modules/caniuse-lite": { - "version": "1.0.30001651", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001651.tgz", - "integrity": "sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg==", + "version": "1.0.30001649", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001649.tgz", + "integrity": "sha512-fJegqZZ0ZX8HOWr6rcafGr72+xcgJKI9oWfDW5DrD7ExUtgZC7a7R7ZYmZqplh7XDocFdGeIFn7roAxhOeYrPQ==", "dev": true, "funding": [ { @@ -4430,11 +4730,27 @@ "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", "dev": true }, + "node_modules/cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "bin": { + "cross-env": "src/bin/cross-env.js", + "cross-env-shell": "src/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=10.14", + "npm": ">=6", + "yarn": ">=1" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -4544,6 +4860,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/debounce": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", + "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==" + }, "node_modules/debug": { "version": "4.3.6", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", @@ -4647,6 +4968,14 @@ "node": ">=6" } }, + "node_modules/detect-gpu": { + "version": "5.0.42", + "resolved": "https://registry.npmjs.org/detect-gpu/-/detect-gpu-5.0.42.tgz", + "integrity": "sha512-Vdhe87ZNhxIS+OGesy9DOx8P3YBbCBapoomGR9kH26HuDAZ6c0FohsrK47j9efL972kLCaD22EbNUYHVLkqx/w==", + "dependencies": { + "webgl-constants": "^1.1.1" + } + }, "node_modules/detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", @@ -4726,6 +5055,11 @@ "node": ">=12" } }, + "node_modules/draco3d": { + "version": "1.5.7", + "resolved": "https://registry.npmjs.org/draco3d/-/draco3d-1.5.7.tgz", + "integrity": "sha512-m6WCKt/erDXcw+70IJXnG7M3awwQPAsZvJGX5zY7beBqpELw6RDGkYVU0W43AFxye4pDZ5i2Lbyc/NNGqwjUVQ==" + }, "node_modules/earcut": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/earcut/-/earcut-3.0.0.tgz", @@ -4769,9 +5103,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.13", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.13.tgz", - "integrity": "sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.5.tgz", + "integrity": "sha512-QR7/A7ZkMS8tZuoftC/jfqNkZLQO779SSW3YuZHP4eXpj3EffGLFcB/Xu9AAZQzLccTiCV+EmUo3ha4mQ9wnlA==", "dev": true }, "node_modules/emittery": { @@ -4949,7 +5283,6 @@ "version": "0.21.5", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", - "dev": true, "hasInstallScript": true, "bin": { "esbuild": "bin/esbuild" @@ -5491,6 +5824,11 @@ "node": ">=4.0" } }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -5628,6 +5966,11 @@ "bser": "2.1.1" } }, + "node_modules/fflate": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", + "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==" + }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -5747,7 +6090,6 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, "hasInstallScript": true, "optional": true, "os": [ @@ -6018,6 +6360,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/glsl-noise": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/glsl-noise/-/glsl-noise-0.0.0.tgz", + "integrity": "sha512-b/ZCF6amfAUb7dJM/MxRs7AetQEahYzJ8PtgfrmEdtw6uyGOr+ZSGtgjFm6mfsBkxJ4d2W7kg+Nlqzqvn3Bc0w==" + }, "node_modules/gopd": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", @@ -6126,6 +6473,11 @@ "node": ">= 0.4" } }, + "node_modules/hls.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/hls.js/-/hls.js-1.3.5.tgz", + "integrity": "sha512-uybAvKS6uDe0MnWNEPnO0krWVr+8m2R0hJ/viql8H3MVK+itq8gGQuIYoFHL3rECkIpNH98Lw8YuuWMKZxp3Ew==" + }, "node_modules/hoist-non-react-statics": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", @@ -6245,6 +6597,11 @@ "node": ">= 4" } }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" + }, "node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -6581,6 +6938,11 @@ "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", "dev": true }, + "node_modules/is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" + }, "node_modules/is-regex": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", @@ -6797,6 +7159,25 @@ "node": ">=8" } }, + "node_modules/its-fine": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/its-fine/-/its-fine-1.2.5.tgz", + "integrity": "sha512-fXtDA0X0t0eBYAGLVM5YsgJGsJ5jEmqZEPrGbzdf5awjv0xE7nqv3TVnvtUF060Tkes15DbDAKW/I48vsb6SyA==", + "dependencies": { + "@types/react-reconciler": "^0.28.0" + }, + "peerDependencies": { + "react": ">=18.0" + } + }, + "node_modules/its-fine/node_modules/@types/react-reconciler": { + "version": "0.28.8", + "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.28.8.tgz", + "integrity": "sha512-SN9c4kxXZonFhbX4hJrZy37yw9e7EIxcpHCxQv5JUS18wDE5ovkQKlqQEkufdJCCMfuI9BnjUJvhYeJ9x5Ra7g==", + "dependencies": { + "@types/react": "*" + } + }, "node_modules/jake": { "version": "10.9.2", "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", @@ -8861,6 +9242,14 @@ "node": ">= 0.8.0" } }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dependencies": { + "immediate": "~3.0.5" + } + }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -8936,6 +9325,15 @@ "lz-string": "bin/bin.js" } }, + "node_modules/maath": { + "version": "0.10.8", + "resolved": "https://registry.npmjs.org/maath/-/maath-0.10.8.tgz", + "integrity": "sha512-tRvbDF0Pgqz+9XUa4jjfgAQ8/aPKmQdWXilFu2tMy4GWj4NOsx99HlULO4IeREfbO3a0sA145DZYyvXPkybm0g==", + "peerDependencies": { + "@types/three": ">=0.134.0", + "three": ">=0.134.0" + } + }, "node_modules/make-dir": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", @@ -9026,6 +9424,19 @@ "node": ">= 8" } }, + "node_modules/meshline": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/meshline/-/meshline-3.3.1.tgz", + "integrity": "sha512-/TQj+JdZkeSUOl5Mk2J7eLcYTLiQm2IDzmlSvYm7ov15anEcDJ92GHqqazxTSreeNgfnYu24kiEvvv0WlbCdFQ==", + "peerDependencies": { + "three": ">=0.137" + } + }, + "node_modules/meshoptimizer": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/meshoptimizer/-/meshoptimizer-0.18.1.tgz", + "integrity": "sha512-ZhoIoL7TNV4s5B6+rx5mC//fw8/POGyNxS/DZyCJeiZ12ScLfVwRE/GfsxwiTkMYYD5DmK2/JXnEVXqL4rF+Sw==" + }, "node_modules/micromatch": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", @@ -9079,9 +9490,9 @@ } }, "node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -9115,7 +9526,6 @@ "version": "3.3.7", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "dev": true, "funding": [ { "type": "github", @@ -9412,7 +9822,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, "engines": { "node": ">=8" } @@ -9532,12 +9941,12 @@ } }, "node_modules/playwright": { - "version": "1.46.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.46.1.tgz", - "integrity": "sha512-oPcr1yqoXLCkgKtD5eNUPLiN40rYEM39odNpIb6VE6S7/15gJmA1NzVv6zJYusV0e7tzvkU/utBFNa/Kpxmwng==", + "version": "1.46.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.46.0.tgz", + "integrity": "sha512-XYJ5WvfefWONh1uPAUAi0H2xXV5S3vrtcnXe6uAOgdGi3aSpqOSXX08IAjXW34xitfuOJsvXU5anXZxPSEQiJw==", "dev": true, "dependencies": { - "playwright-core": "1.46.1" + "playwright-core": "1.46.0" }, "bin": { "playwright": "cli.js" @@ -9550,9 +9959,9 @@ } }, "node_modules/playwright-core": { - "version": "1.46.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.46.1.tgz", - "integrity": "sha512-h9LqIQaAv+CYvWzsZ+h3RsrqCStkBHlgo6/TJlFst3cOTlLghBQlJwPOZKQJTKNaD3QIB7aAVQ+gfWbN3NXB7A==", + "version": "1.46.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.46.0.tgz", + "integrity": "sha512-9Y/d5UIwuJk8t3+lhmMSAJyNP1BUC/DqP3cQJDQQL/oWqAiuPTLgy7Q5dzglmTLwcBRdetzgNM/gni7ckfTr6A==", "dev": true, "bin": { "playwright-core": "cli.js" @@ -9588,7 +9997,6 @@ "version": "8.4.41", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz", "integrity": "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==", - "dev": true, "funding": [ { "type": "opencollective", @@ -9684,6 +10092,15 @@ "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", "dev": true }, + "node_modules/promise-worker-transferable": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/promise-worker-transferable/-/promise-worker-transferable-1.0.4.tgz", + "integrity": "sha512-bN+0ehEnrXfxV2ZQvU2PetO0n4gqBD4ulq3MI1WOPLgr7/Mg9yRQkX5+0v1vagr74ZTsl7XtzlaYDo2EuCeYJw==", + "dependencies": { + "is-promise": "^2.1.0", + "lie": "^3.0.2" + } + }, "node_modules/prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", @@ -9790,7 +10207,18 @@ "node": ">=0.10.0" } }, - "node_modules/react-dom": { + "node_modules/react-composer": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/react-composer/-/react-composer-5.0.3.tgz", + "integrity": "sha512-1uWd07EME6XZvMfapwZmc7NgCZqDemcvicRi3wMJzXsQLvZ3L7fTHVyPy1bZdnWXM4iPjYuNE+uJ41MLKeTtnA==", + "dependencies": { + "prop-types": "^15.6.0" + }, + "peerDependencies": { + "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-dom": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", @@ -9802,11 +10230,34 @@ "react": "^18.3.1" } }, + "node_modules/react-dom/node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, "node_modules/react-is": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" }, + "node_modules/react-reconciler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.27.0.tgz", + "integrity": "sha512-HmMDKciQjYmBRGuuhIaKA1ba/7a+UsM5FzOZsMO2JYHt9Jh8reCb7j1eDC95NOyUlKM9KRyvdx0flBuDvYSBoA==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.21.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "peerDependencies": { + "react": "^18.0.0" + } + }, "node_modules/react-refresh": { "version": "0.14.2", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", @@ -9881,6 +10332,18 @@ "react-dom": ">=16.6.0" } }, + "node_modules/react-use-measure": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/react-use-measure/-/react-use-measure-2.1.1.tgz", + "integrity": "sha512-nocZhN26cproIiIduswYpV5y5lQpSQS1y/4KuvUCjSKmw7ZWIS/+g3aFnX3WdBkyuGUtTLif3UTqnLLhbDoQig==", + "dependencies": { + "debounce": "^1.2.1" + }, + "peerDependencies": { + "react": ">=16.13", + "react-dom": ">=16.13" + } + }, "node_modules/redent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", @@ -9926,6 +10389,14 @@ "node": ">=0.10.0" } }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", @@ -10021,10 +10492,9 @@ } }, "node_modules/rollup": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.21.0.tgz", - "integrity": "sha512-vo+S/lfA2lMS7rZ2Qoubi6I5hwZwzXeUIctILZLbHI+laNtvhhOIon2S1JksA5UEDQ7l3vberd0fxK44lTYjbQ==", - "dev": true, + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.20.0.tgz", + "integrity": "sha512-6rbWBChcnSGzIlXeIdNIZTopKYad8ZG8ajhl78lGRLsI2rX8IkaotQhVas2Ma+GPxJav19wrSzvRvuiv0YKzWw==", "dependencies": { "@types/estree": "1.0.5" }, @@ -10036,22 +10506,22 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.21.0", - "@rollup/rollup-android-arm64": "4.21.0", - "@rollup/rollup-darwin-arm64": "4.21.0", - "@rollup/rollup-darwin-x64": "4.21.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.21.0", - "@rollup/rollup-linux-arm-musleabihf": "4.21.0", - "@rollup/rollup-linux-arm64-gnu": "4.21.0", - "@rollup/rollup-linux-arm64-musl": "4.21.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.21.0", - "@rollup/rollup-linux-riscv64-gnu": "4.21.0", - "@rollup/rollup-linux-s390x-gnu": "4.21.0", - "@rollup/rollup-linux-x64-gnu": "4.21.0", - "@rollup/rollup-linux-x64-musl": "4.21.0", - "@rollup/rollup-win32-arm64-msvc": "4.21.0", - "@rollup/rollup-win32-ia32-msvc": "4.21.0", - "@rollup/rollup-win32-x64-msvc": "4.21.0", + "@rollup/rollup-android-arm-eabi": "4.20.0", + "@rollup/rollup-android-arm64": "4.20.0", + "@rollup/rollup-darwin-arm64": "4.20.0", + "@rollup/rollup-darwin-x64": "4.20.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.20.0", + "@rollup/rollup-linux-arm-musleabihf": "4.20.0", + "@rollup/rollup-linux-arm64-gnu": "4.20.0", + "@rollup/rollup-linux-arm64-musl": "4.20.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.20.0", + "@rollup/rollup-linux-riscv64-gnu": "4.20.0", + "@rollup/rollup-linux-s390x-gnu": "4.20.0", + "@rollup/rollup-linux-x64-gnu": "4.20.0", + "@rollup/rollup-linux-x64-musl": "4.20.0", + "@rollup/rollup-win32-arm64-msvc": "4.20.0", + "@rollup/rollup-win32-ia32-msvc": "4.20.0", + "@rollup/rollup-win32-x64-msvc": "4.20.0", "fsevents": "~2.3.2" } }, @@ -10137,9 +10607,9 @@ } }, "node_modules/scheduler": { - "version": "0.23.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", - "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.21.0.tgz", + "integrity": "sha512-1r87x5fz9MXqswA2ERLo0EbOAU74DpIUO090gIasYTqlVoJeMcl+Z1Rg7WHz+qtPujhS/hGIt9kxZOYBV3faRQ==", "dependencies": { "loose-envify": "^1.1.0" } @@ -10206,7 +10676,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, "dependencies": { "shebang-regex": "^3.0.0" }, @@ -10218,7 +10687,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, "engines": { "node": ">=8" } @@ -10311,7 +10779,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -10396,6 +10863,31 @@ "node": ">=8" } }, + "node_modules/stats-gl": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/stats-gl/-/stats-gl-2.2.8.tgz", + "integrity": "sha512-94G5nZvduDmzxBS7K0lYnynYwreZpkknD8g5dZmU6mpwIhy3caCrjAm11Qm1cbyx7mqix7Fp00RkbsonzKWnoQ==", + "dependencies": { + "@types/three": "^0.163.0" + } + }, + "node_modules/stats-gl/node_modules/@types/three": { + "version": "0.163.0", + "resolved": "https://registry.npmjs.org/@types/three/-/three-0.163.0.tgz", + "integrity": "sha512-uIdDhsXRpQiBUkflBS/i1l3JX14fW6Ot9csed60nfbZNXHDTRsnV2xnTVwXcgbvTiboAR4IW+t+lTL5f1rqIqA==", + "dependencies": { + "@tweenjs/tween.js": "~23.1.1", + "@types/stats.js": "*", + "@types/webxr": "*", + "fflate": "~0.8.2", + "meshoptimizer": "~0.18.1" + } + }, + "node_modules/stats.js": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/stats.js/-/stats.js-0.17.0.tgz", + "integrity": "sha512-hNKz8phvYLPEcRkeG1rsGmV5ChMjKDAWU7/OJJdDErPBNChQXxCo3WZurGpnWc6gZhAzEPFad1aVgyOANH1sMw==" + }, "node_modules/string-length": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", @@ -10561,6 +11053,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/suspend-react": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/suspend-react/-/suspend-react-0.1.3.tgz", + "integrity": "sha512-aqldKgX9aZqpoDp3e8/BZ8Dm7x1pJl+qI3ZKxDN0i/IQTWUwBx/ManmlVJ3wowqbno6c2bmiIfs+Um6LbsjJyQ==", + "peerDependencies": { + "react": ">=17.0" + } + }, "node_modules/symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", @@ -10631,6 +11131,45 @@ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, + "node_modules/three": { + "version": "0.167.1", + "resolved": "https://registry.npmjs.org/three/-/three-0.167.1.tgz", + "integrity": "sha512-gYTLJA/UQip6J/tJvl91YYqlZF47+D/kxiWrbTon35ZHlXEN0VOo+Qke2walF1/x92v55H6enomymg4Dak52kw==" + }, + "node_modules/three-mesh-bvh": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/three-mesh-bvh/-/three-mesh-bvh-0.7.6.tgz", + "integrity": "sha512-rCjsnxEqR9r1/C/lCqzGLS67NDty/S/eT6rAJfDvsanrIctTWdNoR4ZOGWewCB13h1QkVo2BpmC0wakj1+0m8A==", + "peerDependencies": { + "three": ">= 0.151.0" + } + }, + "node_modules/three-stdlib": { + "version": "2.32.1", + "resolved": "https://registry.npmjs.org/three-stdlib/-/three-stdlib-2.32.1.tgz", + "integrity": "sha512-ZgxxLAwtEaKkvfGP+hkW4s6IaDzif47evTdBPwVvdvLsOul3M6l0D4vO4/fzFguXT6FdoBlaTLhteOcn3uDzPg==", + "dependencies": { + "@types/draco3d": "^1.4.0", + "@types/offscreencanvas": "^2019.6.4", + "@types/webxr": "^0.5.2", + "draco3d": "^1.4.1", + "fflate": "^0.6.9", + "potpack": "^1.0.1" + }, + "peerDependencies": { + "three": ">=0.128.0" + } + }, + "node_modules/three-stdlib/node_modules/fflate": { + "version": "0.6.10", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.6.10.tgz", + "integrity": "sha512-IQrh3lEPM93wVCEczc9SaAOvkmcoQn/G8Bo1e8ZPlY3X3bnAxWaBdvTdvM1hP62iZp0BXWDy4vTAy4fF0+Dlpg==" + }, + "node_modules/three-stdlib/node_modules/potpack": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/potpack/-/potpack-1.0.2.tgz", + "integrity": "sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ==" + }, "node_modules/tinyqueue": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-3.0.0.tgz", @@ -10689,6 +11228,33 @@ "node": ">=12" } }, + "node_modules/troika-three-text": { + "version": "0.49.1", + "resolved": "https://registry.npmjs.org/troika-three-text/-/troika-three-text-0.49.1.tgz", + "integrity": "sha512-lXGWxgjJP9kw4i4Wh+0k0Q/7cRfS6iOME4knKht/KozPu9GcFA9NnNpRvehIhrUawq9B0ZRw+0oiFHgRO+4Wig==", + "dependencies": { + "bidi-js": "^1.0.2", + "troika-three-utils": "^0.49.0", + "troika-worker-utils": "^0.49.0", + "webgl-sdf-generator": "1.1.1" + }, + "peerDependencies": { + "three": ">=0.125.0" + } + }, + "node_modules/troika-three-utils": { + "version": "0.49.0", + "resolved": "https://registry.npmjs.org/troika-three-utils/-/troika-three-utils-0.49.0.tgz", + "integrity": "sha512-umitFL4cT+Fm/uONmaQEq4oZlyRHWwVClaS6ZrdcueRvwc2w+cpNQ47LlJKJswpqtMFWbEhOLy0TekmcPZOdYA==", + "peerDependencies": { + "three": ">=0.125.0" + } + }, + "node_modules/troika-worker-utils": { + "version": "0.49.0", + "resolved": "https://registry.npmjs.org/troika-worker-utils/-/troika-worker-utils-0.49.0.tgz", + "integrity": "sha512-1xZHoJrG0HFfCvT/iyN41DvI/nRykiBtHqFkGaGgJwq5iXfIZFBiPPEHFpPpgyKM3Oo5ITHXP5wM2TNQszYdVg==" + }, "node_modules/ts-api-utils": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", @@ -10839,6 +11405,41 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" }, + "node_modules/tunnel-rat": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/tunnel-rat/-/tunnel-rat-0.1.2.tgz", + "integrity": "sha512-lR5VHmkPhzdhrM092lI2nACsLO4QubF0/yoOhzX7c+wIpbN1GjHNzCc91QlpxBi+cnx8vVJ+Ur6vL5cEoQPFpQ==", + "dependencies": { + "zustand": "^4.3.2" + } + }, + "node_modules/tunnel-rat/node_modules/zustand": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.4.tgz", + "integrity": "sha512-/BPMyLKJPtFEvVL0E9E9BTUM63MNyhPGlvxk1XjrfWTUlV+BR8jufjsovHzrtR6YNcBEcL7cMHovL1n9xHawEg==", + "dependencies": { + "use-sync-external-store": "1.2.0" + }, + "engines": { + "node": ">=12.7.0" + }, + "peerDependencies": { + "@types/react": ">=16.8", + "immer": ">=9.0.6", + "react": ">=16.8" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "immer": { + "optional": true + }, + "react": { + "optional": true + } + } + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -11076,6 +11677,14 @@ } } }, + "node_modules/use-sync-external-store": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", + "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/util": { "version": "0.12.5", "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", @@ -11089,6 +11698,26 @@ "which-typed-array": "^1.1.2" } }, + "node_modules/utility-types": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz", + "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", @@ -11116,10 +11745,9 @@ "dev": true }, "node_modules/vite": { - "version": "5.4.2", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.2.tgz", - "integrity": "sha512-dDrQTRHp5C1fTFzcSaMxjk6vdpKvT+2/mIdE07Gw2ykehT49O0z/VHS3zZ8iV/Gh8BJJKHWOe5RjaNrW5xf/GA==", - "dev": true, + "version": "5.3.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.5.tgz", + "integrity": "sha512-MdjglKR6AQXQb9JGiS7Rc2wC6uMjcm7Go/NHNO63EwiJXfuk9PgqiP/n5IDJCziMkfw9n4Ubp7lttNwz+8ZVKA==", "dependencies": { "esbuild": "^0.21.3", "postcss": "^8.4.41", @@ -11174,6 +11802,21 @@ } } }, + "node_modules/vite-plugin-glsl": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/vite-plugin-glsl/-/vite-plugin-glsl-1.3.0.tgz", + "integrity": "sha512-SzEoLet9Bp5VSozjrhUiSc3xX1+u7rCTjXAsq4qWM3u8UjilI76A9ucX/T+CRGQCe25j50GSY+9mKSGUVPET1w==", + "dependencies": { + "@rollup/pluginutils": "^5.1.0" + }, + "engines": { + "node": ">= 16.15.1", + "npm": ">= 8.11.0" + }, + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" + } + }, "node_modules/vt-pbf": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/vt-pbf/-/vt-pbf-3.1.3.tgz", @@ -11205,6 +11848,16 @@ "makeerror": "1.0.12" } }, + "node_modules/webgl-constants": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/webgl-constants/-/webgl-constants-1.1.1.tgz", + "integrity": "sha512-LkBXKjU5r9vAW7Gcu3T5u+5cvSvh5WwINdr0C+9jpzVB41cjQAP5ePArDtk/WHYdVj0GefCgM73BA7FlIiNtdg==" + }, + "node_modules/webgl-sdf-generator": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/webgl-sdf-generator/-/webgl-sdf-generator-1.1.1.tgz", + "integrity": "sha512-9Z0JcMTFxeE+b2x1LJTdnaT8rT8aEp7MVxkNwoycNmJWwPdzoXzMh0BjJSh/AEFP+KPYZUli814h8bJZFIZ2jA==" + }, "node_modules/webidl-conversions": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", @@ -11252,7 +11905,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, "dependencies": { "isexe": "^2.0.0" }, @@ -11490,6 +12142,8606 @@ "dependencies": { "tslib": "2.3.0" } + }, + "node_modules/zustand": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-3.7.2.tgz", + "integrity": "sha512-PIJDIZKtokhof+9+60cpockVOq05sJzHCriyvaLBmEJixseQ1a5Kdov6fWZfWOu5SK9c+FhH1jU0tntLxRJYMA==", + "engines": { + "node": ">=12.7.0" + }, + "peerDependencies": { + "react": ">=16.8" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + } + } + } + }, + "dependencies": { + "@adobe/css-tools": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.0.tgz", + "integrity": "sha512-Ff9+ksdQQB3rMncgqDK78uLznstjyfIf2Arnh22pW8kBpLs6rpKDwgnZT46hin5Hl1WzazzK64DOrhSwYpS7bQ==", + "dev": true + }, + "@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "@babel/code-frame": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "requires": { + "@babel/highlight": "^7.24.7", + "picocolors": "^1.0.0" + } + }, + "@babel/compat-data": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.2.tgz", + "integrity": "sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==", + "dev": true + }, + "@babel/core": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", + "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.25.0", + "@babel/helper-compilation-targets": "^7.25.2", + "@babel/helper-module-transforms": "^7.25.2", + "@babel/helpers": "^7.25.0", + "@babel/parser": "^7.25.0", + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.2", + "@babel/types": "^7.25.2", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "dependencies": { + "convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.0.tgz", + "integrity": "sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==", + "requires": { + "@babel/types": "^7.25.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", + "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.25.2", + "@babel/helper-validator-option": "^7.24.8", + "browserslist": "^4.23.1", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "@babel/helper-module-imports": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", + "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", + "requires": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + } + }, + "@babel/helper-module-transforms": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", + "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7", + "@babel/traverse": "^7.25.2" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", + "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", + "dev": true + }, + "@babel/helper-simple-access": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", + "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", + "dev": true, + "requires": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + } + }, + "@babel/helper-string-parser": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", + "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==" + }, + "@babel/helper-validator-identifier": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==" + }, + "@babel/helper-validator-option": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", + "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", + "dev": true + }, + "@babel/helpers": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.0.tgz", + "integrity": "sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==", + "dev": true, + "requires": { + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.0" + } + }, + "@babel/highlight": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", + "requires": { + "@babel/helper-validator-identifier": "^7.24.7", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + } + }, + "@babel/parser": { + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.3.tgz", + "integrity": "sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==", + "requires": { + "@babel/types": "^7.25.2" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz", + "integrity": "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.24.7" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-typescript": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz", + "integrity": "sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.24.7" + } + }, + "@babel/plugin-transform-react-jsx-self": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.7.tgz", + "integrity": "sha512-fOPQYbGSgH0HUp4UJO4sMBFjY6DuWq+2i8rixyUMb3CdGixs/gccURvYOAhajBdKDoGajFr3mUq5rH3phtkGzw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.24.7" + } + }, + "@babel/plugin-transform-react-jsx-source": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.24.7.tgz", + "integrity": "sha512-J2z+MWzZHVOemyLweMqngXrgGC42jQ//R0KdxqkIz/OrbVIIlhFI3WigZ5fO+nwFvBlncr4MGapd8vTyc7RPNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.24.7" + } + }, + "@babel/runtime": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz", + "integrity": "sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==", + "requires": { + "regenerator-runtime": "^0.14.0" + } + }, + "@babel/template": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", + "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", + "requires": { + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.25.0", + "@babel/types": "^7.25.0" + } + }, + "@babel/traverse": { + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.3.tgz", + "integrity": "sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==", + "requires": { + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.25.0", + "@babel/parser": "^7.25.3", + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.2", + "debug": "^4.3.1", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.2.tgz", + "integrity": "sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==", + "requires": { + "@babel/helper-string-parser": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", + "to-fast-properties": "^2.0.0" + } + }, + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "dependencies": { + "@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + } + } + }, + "@emotion/babel-plugin": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.12.0.tgz", + "integrity": "sha512-y2WQb+oP8Jqvvclh8Q55gLUyb7UFvgv7eJfsj7td5TToBrIUtPay2kMrZi4xjq9qw2vD0ZR5fSho0yqoFgX7Rw==", + "requires": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/serialize": "^1.2.0", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + } + }, + "@emotion/cache": { + "version": "11.13.1", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.13.1.tgz", + "integrity": "sha512-iqouYkuEblRcXmylXIwwOodiEK5Ifl7JcX7o6V4jI3iW4mLXX3dmt5xwBtIkJiQEXFAI+pC8X0i67yiPkH9Ucw==", + "requires": { + "@emotion/memoize": "^0.9.0", + "@emotion/sheet": "^1.4.0", + "@emotion/utils": "^1.4.0", + "@emotion/weak-memoize": "^0.4.0", + "stylis": "4.2.0" + } + }, + "@emotion/hash": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz", + "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==" + }, + "@emotion/is-prop-valid": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.3.0.tgz", + "integrity": "sha512-SHetuSLvJDzuNbOdtPVbq6yMMMlLoW5Q94uDqJZqy50gcmAjxFkVqmzqSGEFq9gT2iMuIeKV1PXVWmvUhuZLlQ==", + "requires": { + "@emotion/memoize": "^0.9.0" + } + }, + "@emotion/memoize": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", + "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==" + }, + "@emotion/react": { + "version": "11.13.0", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.13.0.tgz", + "integrity": "sha512-WkL+bw1REC2VNV1goQyfxjx1GYJkcc23CRQkXX+vZNLINyfI7o+uUn/rTGPt/xJ3bJHd5GcljgnxHf4wRw5VWQ==", + "requires": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.12.0", + "@emotion/cache": "^11.13.0", + "@emotion/serialize": "^1.3.0", + "@emotion/use-insertion-effect-with-fallbacks": "^1.1.0", + "@emotion/utils": "^1.4.0", + "@emotion/weak-memoize": "^0.4.0", + "hoist-non-react-statics": "^3.3.1" + } + }, + "@emotion/serialize": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.0.tgz", + "integrity": "sha512-jACuBa9SlYajnpIVXB+XOXnfJHyckDfe6fOpORIM6yhBDlqGuExvDdZYHDQGoDf3bZXGv7tNr+LpLjJqiEQ6EA==", + "requires": { + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/unitless": "^0.9.0", + "@emotion/utils": "^1.4.0", + "csstype": "^3.0.2" + } + }, + "@emotion/sheet": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz", + "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==" + }, + "@emotion/styled": { + "version": "11.13.0", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.13.0.tgz", + "integrity": "sha512-tkzkY7nQhW/zC4hztlwucpT8QEZ6eUzpXDRhww/Eej4tFfO0FxQYWRyg/c5CCXa4d/f174kqeXYjuQRnhzf6dA==", + "requires": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.12.0", + "@emotion/is-prop-valid": "^1.3.0", + "@emotion/serialize": "^1.3.0", + "@emotion/use-insertion-effect-with-fallbacks": "^1.1.0", + "@emotion/utils": "^1.4.0" + } + }, + "@emotion/unitless": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.9.0.tgz", + "integrity": "sha512-TP6GgNZtmtFaFcsOgExdnfxLLpRDla4Q66tnenA9CktvVSdNKDvMVuUah4QvWPIpNjrWsGg3qeGo9a43QooGZQ==" + }, + "@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.1.0.tgz", + "integrity": "sha512-+wBOcIV5snwGgI2ya3u99D7/FJquOIniQT1IKyDsBmEgwvpxMNeS65Oib7OnE2d2aY+3BU4OiH+0Wchf8yk3Hw==", + "requires": {} + }, + "@emotion/utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.0.tgz", + "integrity": "sha512-spEnrA1b6hDR/C68lC2M7m6ALPUHZC0lIY7jAS/B/9DuuO1ZP04eov8SMv/6fwRd8pzmsn2AuJEznRREWlQrlQ==" + }, + "@emotion/weak-memoize": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz", + "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==" + }, + "@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "optional": true + }, + "@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "optional": true + }, + "@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^3.3.0" + } + }, + "@eslint-community/regexpp": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", + "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", + "dev": true + }, + "@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + } + } + }, + "@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "dev": true + }, + "@floating-ui/core": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.6.tgz", + "integrity": "sha512-Vkvsw6EcpMHjvZZdMkSY+djMGFbt7CRssW99Ne8tar2WLnZ/l3dbxeTShbLQj+/s35h+Qb4cmnob+EzwtjrXGQ==", + "requires": { + "@floating-ui/utils": "^0.2.6" + } + }, + "@floating-ui/dom": { + "version": "1.6.9", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.9.tgz", + "integrity": "sha512-zB1PcI350t4tkm3rvUhSRKa9sT7vH5CrAbQxW+VaPYJXKAO0gsg4CTueL+6Ajp7XzAQC8CW4Jj1Wgqc0sB6oUQ==", + "requires": { + "@floating-ui/core": "^1.6.0", + "@floating-ui/utils": "^0.2.6" + } + }, + "@floating-ui/utils": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.6.tgz", + "integrity": "sha512-0KI3zGxIUs1KDR/pjQPdJH4Z8nGBm0yJ5WRoRfdw1Kzeh45jkIfA0rmD0kBF6fKHH+xaH7g8y4jIXyAV5MGK3g==" + }, + "@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true + }, + "@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "dev": true + }, + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } + } + }, + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true + }, + "@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dev": true, + "requires": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dev": true, + "requires": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "requires": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + } + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dev": true, + "requires": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + } + }, + "@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dev": true, + "requires": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + } + }, + "@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dev": true, + "requires": { + "jest-get-type": "^29.6.3" + } + }, + "@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "dev": true, + "requires": { + "@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/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "dev": true, + "requires": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + } + }, + "@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "dev": true, + "requires": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "requires": { + "@sinclair/typebox": "^0.27.8" + } + }, + "@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + } + }, + "@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "dev": true, + "requires": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + } + }, + "@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "dev": true, + "requires": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + } + }, + "@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, + "requires": { + "@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" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "requires": { + "@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" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "requires": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==" + }, + "@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==" + }, + "@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" + }, + "@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "requires": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "@mapbox/geojson-rewind": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@mapbox/geojson-rewind/-/geojson-rewind-0.5.2.tgz", + "integrity": "sha512-tJaT+RbYGJYStt7wI3cq4Nl4SXxG8W7JDG5DMJu97V25RnbNg3QtQtf+KD+VLjNpWKYsRvXDNmNrBgEETr1ifA==", + "requires": { + "get-stream": "^6.0.1", + "minimist": "^1.2.6" + } + }, + "@mapbox/jsonlint-lines-primitives": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.2.tgz", + "integrity": "sha512-rY0o9A5ECsTQRVhv7tL/OyDpGAoUB4tTvLiW1DSzQGq4bvTPhNw1VpSNjDJc5GFZ2XuyOtSWSVN05qOtcD71qQ==" + }, + "@mapbox/point-geometry": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz", + "integrity": "sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ==" + }, + "@mapbox/tiny-sdf": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@mapbox/tiny-sdf/-/tiny-sdf-2.0.6.tgz", + "integrity": "sha512-qMqa27TLw+ZQz5Jk+RcwZGH7BQf5G/TrutJhspsca/3SHwmgKQ1iq+d3Jxz5oysPVYTGP6aXxCo5Lk9Er6YBAA==" + }, + "@mapbox/unitbezier": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-0.0.1.tgz", + "integrity": "sha512-nMkuDXFv60aBr9soUG5q+GvZYL+2KZHVvsqFCzqnkGEf46U2fvmytHaEVc1/YZbiLn8X+eR3QzX1+dwDO1lxlw==" + }, + "@mapbox/vector-tile": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@mapbox/vector-tile/-/vector-tile-1.3.1.tgz", + "integrity": "sha512-MCEddb8u44/xfQ3oD+Srl/tNcQoqTw3goGk2oLsrFxOTc3dUp+kAnby3PvAeeBYSMSjSPD1nd1AJA6W49WnoUw==", + "requires": { + "@mapbox/point-geometry": "~0.1.0" + } + }, + "@mapbox/whoots-js": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@mapbox/whoots-js/-/whoots-js-3.1.0.tgz", + "integrity": "sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q==" + }, + "@maplibre/maplibre-gl-style-spec": { + "version": "20.3.0", + "resolved": "https://registry.npmjs.org/@maplibre/maplibre-gl-style-spec/-/maplibre-gl-style-spec-20.3.0.tgz", + "integrity": "sha512-eSiQ3E5LUSxAOY9ABXGyfNhout2iEa6mUxKeaQ9nJ8NL1NuaQYU7zKqzx/LEYcXe1neT4uYAgM1wYZj3fTSXtA==", + "requires": { + "@mapbox/jsonlint-lines-primitives": "~2.0.2", + "@mapbox/unitbezier": "^0.0.1", + "json-stringify-pretty-compact": "^4.0.0", + "minimist": "^1.2.8", + "quickselect": "^2.0.0", + "rw": "^1.3.3", + "sort-object": "^3.0.3", + "tinyqueue": "^2.0.3" + }, + "dependencies": { + "quickselect": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-2.0.0.tgz", + "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==" + }, + "tinyqueue": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-2.0.3.tgz", + "integrity": "sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==" + } + } + }, + "@mediapipe/tasks-vision": { + "version": "0.10.8", + "resolved": "https://registry.npmjs.org/@mediapipe/tasks-vision/-/tasks-vision-0.10.8.tgz", + "integrity": "sha512-Rp7ll8BHrKB3wXaRFKhrltwZl1CiXGdibPxuWXvqGnKTnv8fqa/nvftYNuSbf+pbJWKYCXdBtYTITdAUTGGh0Q==" + }, + "@monogrid/gainmap-js": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@monogrid/gainmap-js/-/gainmap-js-3.0.5.tgz", + "integrity": "sha512-53sCTG4FaJBaAq/tcufARtVYDMDGqyBT9i7F453pWGhZ5LqubDHDWtYoHo9VhQqMcHTEexdJqSsR58y+9HVmQA==", + "requires": { + "promise-worker-transferable": "^1.0.4" + } + }, + "@mui/core-downloads-tracker": { + "version": "5.16.6", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.16.6.tgz", + "integrity": "sha512-kytg6LheUG42V8H/o/Ptz3olSO5kUXW9zF0ox18VnblX6bO2yif1FPItgc3ey1t5ansb1+gbe7SatntqusQupg==", + "peer": true + }, + "@mui/material": { + "version": "5.16.6", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.16.6.tgz", + "integrity": "sha512-0LUIKBOIjiFfzzFNxXZBRAyr9UQfmTAFzbt6ziOU2FDXhorNN2o3N9/32mNJbCA8zJo2FqFU6d3dtoqUDyIEfA==", + "peer": true, + "requires": { + "@babel/runtime": "^7.23.9", + "@mui/core-downloads-tracker": "^5.16.6", + "@mui/system": "^5.16.6", + "@mui/types": "^7.2.15", + "@mui/utils": "^5.16.6", + "@popperjs/core": "^2.11.8", + "@types/react-transition-group": "^4.4.10", + "clsx": "^2.1.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1", + "react-is": "^18.3.1", + "react-transition-group": "^4.4.5" + } + }, + "@mui/private-theming": { + "version": "5.16.6", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.16.6.tgz", + "integrity": "sha512-rAk+Rh8Clg7Cd7shZhyt2HGTTE5wYKNSJ5sspf28Fqm/PZ69Er9o6KX25g03/FG2dfpg5GCwZh/xOojiTfm3hw==", + "requires": { + "@babel/runtime": "^7.23.9", + "@mui/utils": "^5.16.6", + "prop-types": "^15.8.1" + } + }, + "@mui/styled-engine": { + "version": "5.16.6", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.16.6.tgz", + "integrity": "sha512-zaThmS67ZmtHSWToTiHslbI8jwrmITcN93LQaR2lKArbvS7Z3iLkwRoiikNWutx9MBs8Q6okKvbZq1RQYB3v7g==", + "requires": { + "@babel/runtime": "^7.23.9", + "@emotion/cache": "^11.11.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" + } + }, + "@mui/system": { + "version": "5.16.6", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.16.6.tgz", + "integrity": "sha512-5xgyJjBIMPw8HIaZpfbGAaFYPwImQn7Nyh+wwKWhvkoIeDosQ1ZMVrbTclefi7G8hNmqhip04duYwYpbBFnBgw==", + "requires": { + "@babel/runtime": "^7.23.9", + "@mui/private-theming": "^5.16.6", + "@mui/styled-engine": "^5.16.6", + "@mui/types": "^7.2.15", + "@mui/utils": "^5.16.6", + "clsx": "^2.1.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" + } + }, + "@mui/types": { + "version": "7.2.15", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.15.tgz", + "integrity": "sha512-nbo7yPhtKJkdf9kcVOF8JZHPZTmqXjJ/tI0bdWgHg5tp9AnIN4Y7f7wm9T+0SyGYJk76+GYZ8Q5XaTYAsUHN0Q==", + "requires": {} + }, + "@mui/utils": { + "version": "5.16.6", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.16.6.tgz", + "integrity": "sha512-tWiQqlhxAt3KENNiSRL+DIn9H5xNVK6Jjf70x3PnfQPz1MPBdh7yyIcAyVBT9xiw7hP3SomRhPR7hzBMBCjqEA==", + "requires": { + "@babel/runtime": "^7.23.9", + "@mui/types": "^7.2.15", + "@types/prop-types": "^15.7.12", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "react-is": "^18.3.1" + } + }, + "@mui/x-date-pickers": { + "version": "7.12.0", + "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-7.12.0.tgz", + "integrity": "sha512-WU5C7QNfSpJ9cP8vl2sY7q35NW+0TUMgEy+sl98fcPhLckq3cgV1wnVxoZnQZ3BxVQAtx+7ag/MpefU03vJcVw==", + "requires": { + "@babel/runtime": "^7.25.0", + "@mui/system": "^5.16.5", + "@mui/utils": "^5.16.5", + "@types/react-transition-group": "^4.4.10", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "react-transition-group": "^4.4.5" + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@pkgr/core": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", + "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", + "dev": true + }, + "@playwright/test": { + "version": "1.46.0", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.46.0.tgz", + "integrity": "sha512-/QYft5VArOrGRP5pgkrfKksqsKA6CEFyGQ/gjNe6q0y4tZ1aaPfq4gIjudr1s3D+pXyrPRdsy4opKDrjBabE5w==", + "dev": true, + "requires": { + "playwright": "1.46.0" + } + }, + "@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "peer": true + }, + "@react-spring/animated": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@react-spring/animated/-/animated-9.6.1.tgz", + "integrity": "sha512-ls/rJBrAqiAYozjLo5EPPLLOb1LM0lNVQcXODTC1SMtS6DbuBCPaKco5svFUQFMP2dso3O+qcC4k9FsKc0KxMQ==", + "requires": { + "@react-spring/shared": "~9.6.1", + "@react-spring/types": "~9.6.1" + } + }, + "@react-spring/core": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@react-spring/core/-/core-9.6.1.tgz", + "integrity": "sha512-3HAAinAyCPessyQNNXe5W0OHzRfa8Yo5P748paPcmMowZ/4sMfaZ2ZB6e5x5khQI8NusOHj8nquoutd6FRY5WQ==", + "requires": { + "@react-spring/animated": "~9.6.1", + "@react-spring/rafz": "~9.6.1", + "@react-spring/shared": "~9.6.1", + "@react-spring/types": "~9.6.1" + } + }, + "@react-spring/rafz": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@react-spring/rafz/-/rafz-9.6.1.tgz", + "integrity": "sha512-v6qbgNRpztJFFfSE3e2W1Uz+g8KnIBs6SmzCzcVVF61GdGfGOuBrbjIcp+nUz301awVmREKi4eMQb2Ab2gGgyQ==" + }, + "@react-spring/shared": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@react-spring/shared/-/shared-9.6.1.tgz", + "integrity": "sha512-PBFBXabxFEuF8enNLkVqMC9h5uLRBo6GQhRMQT/nRTnemVENimgRd+0ZT4yFnAQ0AxWNiJfX3qux+bW2LbG6Bw==", + "requires": { + "@react-spring/rafz": "~9.6.1", + "@react-spring/types": "~9.6.1" + } + }, + "@react-spring/three": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@react-spring/three/-/three-9.6.1.tgz", + "integrity": "sha512-Tyw2YhZPKJAX3t2FcqvpLRb71CyTe1GvT3V+i+xJzfALgpk10uPGdGaQQ5Xrzmok1340DAeg2pR/MCfaW7b8AA==", + "requires": { + "@react-spring/animated": "~9.6.1", + "@react-spring/core": "~9.6.1", + "@react-spring/shared": "~9.6.1", + "@react-spring/types": "~9.6.1" + } + }, + "@react-spring/types": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@react-spring/types/-/types-9.6.1.tgz", + "integrity": "sha512-POu8Mk0hIU3lRXB3bGIGe4VHIwwDsQyoD1F394OK7STTiX9w4dG3cTLljjYswkQN+hDSHRrj4O36kuVa7KPU8Q==" + }, + "@react-three/drei": { + "version": "9.109.2", + "resolved": "https://registry.npmjs.org/@react-three/drei/-/drei-9.109.2.tgz", + "integrity": "sha512-oUbfjiyPQeQch4Mi3jZvFKigMlc97/xvazxyjPBCGa8RP8cHZJl187eZI9Ha1WwkVaX80DfgN7bYAWXS4ywxmw==", + "requires": { + "@babel/runtime": "^7.11.2", + "@mediapipe/tasks-vision": "0.10.8", + "@monogrid/gainmap-js": "^3.0.5", + "@react-spring/three": "~9.6.1", + "@use-gesture/react": "^10.2.24", + "camera-controls": "^2.4.2", + "cross-env": "^7.0.3", + "detect-gpu": "^5.0.28", + "glsl-noise": "^0.0.0", + "hls.js": "1.3.5", + "maath": "^0.10.7", + "meshline": "^3.1.6", + "react-composer": "^5.0.3", + "stats-gl": "^2.0.0", + "stats.js": "^0.17.0", + "suspend-react": "^0.1.3", + "three-mesh-bvh": "^0.7.0", + "three-stdlib": "^2.29.9", + "troika-three-text": "^0.49.0", + "tunnel-rat": "^0.1.2", + "utility-types": "^3.10.0", + "uuid": "^9.0.1", + "zustand": "^3.7.1" + } + }, + "@react-three/fiber": { + "version": "8.16.8", + "resolved": "https://registry.npmjs.org/@react-three/fiber/-/fiber-8.16.8.tgz", + "integrity": "sha512-Lc8fjATtvQEfSd8d5iKdbpHtRm/aPMeFj7jQvp6TNHfpo8IQTW3wwcE1ZMrGGoUH+w2mnyS+0MK1NLPLnuzGkQ==", + "requires": { + "@babel/runtime": "^7.17.8", + "@types/react-reconciler": "^0.26.7", + "@types/webxr": "*", + "base64-js": "^1.5.1", + "buffer": "^6.0.3", + "its-fine": "^1.0.6", + "react-reconciler": "^0.27.0", + "react-use-measure": "^2.1.1", + "scheduler": "^0.21.0", + "suspend-react": "^0.1.3", + "zustand": "^3.7.1" + } + }, + "@remix-run/router": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.19.0.tgz", + "integrity": "sha512-zDICCLKEwbVYTS6TjYaWtHXxkdoUvD/QXvyVZjGCsWz5vyH7aFeONlPffPdW+Y/t6KT0MgXb2Mfjun9YpWN1dA==" + }, + "@rollup/pluginutils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", + "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", + "requires": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + } + }, + "@rollup/rollup-android-arm-eabi": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.20.0.tgz", + "integrity": "sha512-TSpWzflCc4VGAUJZlPpgAJE1+V60MePDQnBd7PPkpuEmOy8i87aL6tinFGKBFKuEDikYpig72QzdT3QPYIi+oA==", + "optional": true + }, + "@rollup/rollup-android-arm64": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.20.0.tgz", + "integrity": "sha512-u00Ro/nok7oGzVuh/FMYfNoGqxU5CPWz1mxV85S2w9LxHR8OoMQBuSk+3BKVIDYgkpeOET5yXkx90OYFc+ytpQ==", + "optional": true + }, + "@rollup/rollup-darwin-arm64": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.20.0.tgz", + "integrity": "sha512-uFVfvzvsdGtlSLuL0ZlvPJvl6ZmrH4CBwLGEFPe7hUmf7htGAN+aXo43R/V6LATyxlKVC/m6UsLb7jbG+LG39Q==", + "optional": true + }, + "@rollup/rollup-darwin-x64": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.20.0.tgz", + "integrity": "sha512-xbrMDdlev53vNXexEa6l0LffojxhqDTBeL+VUxuuIXys4x6xyvbKq5XqTXBCEUA8ty8iEJblHvFaWRJTk/icAQ==", + "optional": true + }, + "@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.20.0.tgz", + "integrity": "sha512-jMYvxZwGmoHFBTbr12Xc6wOdc2xA5tF5F2q6t7Rcfab68TT0n+r7dgawD4qhPEvasDsVpQi+MgDzj2faOLsZjA==", + "optional": true + }, + "@rollup/rollup-linux-arm-musleabihf": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.20.0.tgz", + "integrity": "sha512-1asSTl4HKuIHIB1GcdFHNNZhxAYEdqML/MW4QmPS4G0ivbEcBr1JKlFLKsIRqjSwOBkdItn3/ZDlyvZ/N6KPlw==", + "optional": true + }, + "@rollup/rollup-linux-arm64-gnu": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.20.0.tgz", + "integrity": "sha512-COBb8Bkx56KldOYJfMf6wKeYJrtJ9vEgBRAOkfw6Ens0tnmzPqvlpjZiLgkhg6cA3DGzCmLmmd319pmHvKWWlQ==", + "optional": true + }, + "@rollup/rollup-linux-arm64-musl": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.20.0.tgz", + "integrity": "sha512-+it+mBSyMslVQa8wSPvBx53fYuZK/oLTu5RJoXogjk6x7Q7sz1GNRsXWjn6SwyJm8E/oMjNVwPhmNdIjwP135Q==", + "optional": true + }, + "@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.20.0.tgz", + "integrity": "sha512-yAMvqhPfGKsAxHN8I4+jE0CpLWD8cv4z7CK7BMmhjDuz606Q2tFKkWRY8bHR9JQXYcoLfopo5TTqzxgPUjUMfw==", + "optional": true + }, + "@rollup/rollup-linux-riscv64-gnu": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.20.0.tgz", + "integrity": "sha512-qmuxFpfmi/2SUkAw95TtNq/w/I7Gpjurx609OOOV7U4vhvUhBcftcmXwl3rqAek+ADBwSjIC4IVNLiszoj3dPA==", + "optional": true + }, + "@rollup/rollup-linux-s390x-gnu": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.20.0.tgz", + "integrity": "sha512-I0BtGXddHSHjV1mqTNkgUZLnS3WtsqebAXv11D5BZE/gfw5KoyXSAXVqyJximQXNvNzUo4GKlCK/dIwXlz+jlg==", + "optional": true + }, + "@rollup/rollup-linux-x64-gnu": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.20.0.tgz", + "integrity": "sha512-y+eoL2I3iphUg9tN9GB6ku1FA8kOfmF4oUEWhztDJ4KXJy1agk/9+pejOuZkNFhRwHAOxMsBPLbXPd6mJiCwew==", + "optional": true + }, + "@rollup/rollup-linux-x64-musl": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.20.0.tgz", + "integrity": "sha512-hM3nhW40kBNYUkZb/r9k2FKK+/MnKglX7UYd4ZUy5DJs8/sMsIbqWK2piZtVGE3kcXVNj3B2IrUYROJMMCikNg==", + "optional": true + }, + "@rollup/rollup-win32-arm64-msvc": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.20.0.tgz", + "integrity": "sha512-psegMvP+Ik/Bg7QRJbv8w8PAytPA7Uo8fpFjXyCRHWm6Nt42L+JtoqH8eDQ5hRP7/XW2UiIriy1Z46jf0Oa1kA==", + "optional": true + }, + "@rollup/rollup-win32-ia32-msvc": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.20.0.tgz", + "integrity": "sha512-GabekH3w4lgAJpVxkk7hUzUf2hICSQO0a/BLFA11/RMxQT92MabKAqyubzDZmMOC/hcJNlc+rrypzNzYl4Dx7A==", + "optional": true + }, + "@rollup/rollup-win32-x64-msvc": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.20.0.tgz", + "integrity": "sha512-aJ1EJSuTdGnM6qbVC4B5DSmozPTqIag9fSzXRNNo+humQLG89XpPgdt16Ia56ORD7s+H8Pmyx44uczDQ0yDzpg==", + "optional": true + }, + "@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==" + }, + "@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "requires": { + "@sinonjs/commons": "^3.0.0" + } + }, + "@tanstack/query-core": { + "version": "5.51.21", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.51.21.tgz", + "integrity": "sha512-POQxm42IUp6n89kKWF4IZi18v3fxQWFRolvBA6phNVmA8psdfB1MvDnGacCJdS+EOX12w/CyHM62z//rHmYmvw==" + }, + "@tanstack/react-query": { + "version": "5.51.21", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.51.21.tgz", + "integrity": "sha512-Q/V81x3sAYgCsxjwOkfLXfrmoG+FmDhLeHH5okC/Bp8Aaw2c33lbEo/mMcMnkxUPVtB2FLpzHT0tq3c+OlZEbw==", + "requires": { + "@tanstack/query-core": "5.51.21" + } + }, + "@testing-library/dom": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", + "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.3.0", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "dom-accessibility-api": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@testing-library/jest-dom": { + "version": "6.4.8", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.4.8.tgz", + "integrity": "sha512-JD0G+Zc38f5MBHA4NgxQMR5XtO5Jx9g86jqturNTt2WUfRmLDIY7iKkWHDCCTiDuFMre6nxAD5wHw9W5kI4rGw==", + "dev": true, + "requires": { + "@adobe/css-tools": "^4.4.0", + "@babel/runtime": "^7.9.2", + "aria-query": "^5.0.0", + "chalk": "^3.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.6.3", + "lodash": "^4.17.21", + "redent": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@testing-library/react": { + "version": "15.0.7", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-15.0.7.tgz", + "integrity": "sha512-cg0RvEdD1TIhhkm1IeYMQxrzy0MtUNfa3minv4MjbgcYzJAZ7yD0i0lwoPOTPr+INtiXFezt2o8xMSnyHhEn2Q==", + "dev": true, + "requires": { + "@babel/runtime": "^7.12.5", + "@testing-library/dom": "^10.0.0", + "@types/react-dom": "^18.0.0" + } + }, + "@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true + }, + "@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "dev": true + }, + "@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, + "@tweenjs/tween.js": { + "version": "23.1.3", + "resolved": "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-23.1.3.tgz", + "integrity": "sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA==" + }, + "@types/aria-query": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", + "dev": true + }, + "@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "requires": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "@types/babel__generator": { + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@types/babel__traverse": { + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", + "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", + "dev": true, + "requires": { + "@babel/types": "^7.20.7" + } + }, + "@types/draco3d": { + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/@types/draco3d/-/draco3d-1.4.10.tgz", + "integrity": "sha512-AX22jp8Y7wwaBgAixaSvkoG4M/+PlAcm3Qs4OW8yT9DM4xUpWKeFhLueTAyZF39pviAdcDdeJoACapiAceqNcw==" + }, + "@types/echarts": { + "version": "4.9.22", + "resolved": "https://registry.npmjs.org/@types/echarts/-/echarts-4.9.22.tgz", + "integrity": "sha512-7Fo6XdWpoi8jxkwP7BARUOM7riq8bMhmsCtSG8gzUcJmFhLo387tihoBYS/y5j7jl3PENT5RxeWZdN9RiwO7HQ==", + "requires": { + "@types/zrender": "*" + } + }, + "@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" + }, + "@types/geojson": { + "version": "7946.0.14", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.14.tgz", + "integrity": "sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg==" + }, + "@types/geojson-vt": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/@types/geojson-vt/-/geojson-vt-3.2.5.tgz", + "integrity": "sha512-qDO7wqtprzlpe8FfQ//ClPV9xiuoh2nkIgiouIptON9w5jvD/fA4szvP9GBlDVdJ5dldAl0kX/sy3URbWwLx0g==", + "requires": { + "@types/geojson": "*" + } + }, + "@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==" + }, + "@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "@types/jest": { + "version": "29.5.12", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.12.tgz", + "integrity": "sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==", + "dev": true, + "requires": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + }, + "pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "requires": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + } + } + } + }, + "@types/jsdom": { + "version": "20.0.1", + "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-20.0.1.tgz", + "integrity": "sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/tough-cookie": "*", + "parse5": "^7.0.0" + } + }, + "@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true + }, + "@types/luxon": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.4.2.tgz", + "integrity": "sha512-TifLZlFudklWlMBfhubvgqTXRzLDI5pCbGa4P8a3wPyUQSW+1xQ5eDsreP9DWHX3tjq1ke96uYG/nwundroWcA==", + "dev": true + }, + "@types/mapbox__point-geometry": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@types/mapbox__point-geometry/-/mapbox__point-geometry-0.1.4.tgz", + "integrity": "sha512-mUWlSxAmYLfwnRBmgYV86tgYmMIICX4kza8YnE/eIlywGe2XoOxlpVnXWwir92xRLjwyarqwpu2EJKD2pk0IUA==" + }, + "@types/mapbox__vector-tile": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@types/mapbox__vector-tile/-/mapbox__vector-tile-1.3.4.tgz", + "integrity": "sha512-bpd8dRn9pr6xKvuEBQup8pwQfD4VUyqO/2deGjfpe6AwC8YRlyEipvefyRJUSiCJTZuCb8Pl1ciVV5ekqJ96Bg==", + "requires": { + "@types/geojson": "*", + "@types/mapbox__point-geometry": "*", + "@types/pbf": "*" + } + }, + "@types/node": { + "version": "20.14.14", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.14.tgz", + "integrity": "sha512-d64f00982fS9YoOgJkAMolK7MN8Iq3TDdVjchbYHdEmjth/DHowx82GnoA+tVUAN+7vxfYUgAzi+JXbKNd2SDQ==", + "requires": { + "undici-types": "~5.26.4" + } + }, + "@types/offscreencanvas": { + "version": "2019.7.3", + "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.7.3.tgz", + "integrity": "sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==" + }, + "@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==" + }, + "@types/pbf": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/pbf/-/pbf-3.0.5.tgz", + "integrity": "sha512-j3pOPiEcWZ34R6a6mN07mUkM4o4Lwf6hPNt8eilOeZhTFbxFXmKhvXl9Y28jotFPaI1bpPDJsbCprUoNke6OrA==" + }, + "@types/prop-types": { + "version": "15.7.12", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", + "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==" + }, + "@types/react": { + "version": "18.3.3", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz", + "integrity": "sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==", + "requires": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "@types/react-dom": { + "version": "18.3.0", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz", + "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==", + "dev": true, + "requires": { + "@types/react": "*" + } + }, + "@types/react-reconciler": { + "version": "0.26.7", + "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.26.7.tgz", + "integrity": "sha512-mBDYl8x+oyPX/VBb3E638N0B7xG+SPk/EAMcVPeexqus/5aTpTphQi0curhhshOqRrc9t6OPoJfEUkbymse/lQ==", + "requires": { + "@types/react": "*" + } + }, + "@types/react-transition-group": { + "version": "4.4.10", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.10.tgz", + "integrity": "sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==", + "requires": { + "@types/react": "*" + } + }, + "@types/semver": { + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", + "dev": true + }, + "@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true + }, + "@types/stats.js": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@types/stats.js/-/stats.js-0.17.3.tgz", + "integrity": "sha512-pXNfAD3KHOdif9EQXZ9deK82HVNaXP5ZIF5RP2QG6OQFNTaY2YIetfrE9t528vEreGQvEPRDDc8muaoYeK0SxQ==" + }, + "@types/supercluster": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@types/supercluster/-/supercluster-7.1.3.tgz", + "integrity": "sha512-Z0pOY34GDFl3Q6hUFYf3HkTwKEE02e7QgtJppBt+beEAxnyOpJua+voGFvxINBHa06GwLFFym7gRPY2SiKIfIA==", + "requires": { + "@types/geojson": "*" + } + }, + "@types/three": { + "version": "0.167.1", + "resolved": "https://registry.npmjs.org/@types/three/-/three-0.167.1.tgz", + "integrity": "sha512-OCd2Uv/8/4TbmSaIRFawrCOnDMLdpaa+QGJdhlUBmdfbHjLY8k6uFc0tde2/UvcaHQ6NtLl28onj/vJfofV+Tg==", + "peer": true, + "requires": { + "@tweenjs/tween.js": "~23.1.2", + "@types/stats.js": "*", + "@types/webxr": "*", + "fflate": "~0.8.2", + "meshoptimizer": "~0.18.1" + } + }, + "@types/tough-cookie": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", + "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", + "dev": true + }, + "@types/webxr": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.19.tgz", + "integrity": "sha512-4hxA+NwohSgImdTSlPXEqDqqFktNgmTXQ05ff1uWam05tNGroCMp4G+4XVl6qWm1p7GQ/9oD41kAYsSssF6Mzw==" + }, + "@types/yargs": { + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==" + }, + "@types/zrender": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@types/zrender/-/zrender-4.0.6.tgz", + "integrity": "sha512-1jZ9bJn2BsfmYFPBHtl5o3uV+ILejAtGrDcYSpT4qaVKEI/0YY+arw3XHU04Ebd8Nca3SQ7uNcLaqiL+tTFVMg==" + }, + "@typescript-eslint/eslint-plugin": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.2.0.tgz", + "integrity": "sha512-mdekAHOqS9UjlmyF/LSs6AIEvfceV749GFxoBAjwAv0nkevfKHWQFDMcBZWUiIC5ft6ePWivXoS36aKQ0Cy3sw==", + "dev": true, + "requires": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "7.2.0", + "@typescript-eslint/type-utils": "7.2.0", + "@typescript-eslint/utils": "7.2.0", + "@typescript-eslint/visitor-keys": "7.2.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + } + }, + "@typescript-eslint/parser": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.2.0.tgz", + "integrity": "sha512-5FKsVcHTk6TafQKQbuIVkXq58Fnbkd2wDL4LB7AURN7RUOu1utVP+G8+6u3ZhEroW3DF6hyo3ZEXxgKgp4KeCg==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "7.2.0", + "@typescript-eslint/types": "7.2.0", + "@typescript-eslint/typescript-estree": "7.2.0", + "@typescript-eslint/visitor-keys": "7.2.0", + "debug": "^4.3.4" + } + }, + "@typescript-eslint/scope-manager": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.2.0.tgz", + "integrity": "sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "7.2.0", + "@typescript-eslint/visitor-keys": "7.2.0" + } + }, + "@typescript-eslint/type-utils": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.2.0.tgz", + "integrity": "sha512-xHi51adBHo9O9330J8GQYQwrKBqbIPJGZZVQTHHmy200hvkLZFWJIFtAG/7IYTWUyun6DE6w5InDReePJYJlJA==", + "dev": true, + "requires": { + "@typescript-eslint/typescript-estree": "7.2.0", + "@typescript-eslint/utils": "7.2.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + } + }, + "@typescript-eslint/types": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.2.0.tgz", + "integrity": "sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.2.0.tgz", + "integrity": "sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "7.2.0", + "@typescript-eslint/visitor-keys": "7.2.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + } + }, + "@typescript-eslint/utils": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.2.0.tgz", + "integrity": "sha512-YfHpnMAGb1Eekpm3XRK8hcMwGLGsnT6L+7b2XyRv6ouDuJU1tZir1GS2i0+VXRatMwSI1/UfcyPe53ADkU+IuA==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "7.2.0", + "@typescript-eslint/types": "7.2.0", + "@typescript-eslint/typescript-estree": "7.2.0", + "semver": "^7.5.4" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.2.0.tgz", + "integrity": "sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A==", + "dev": true, + "requires": { + "@typescript-eslint/types": "7.2.0", + "eslint-visitor-keys": "^3.4.1" + } + }, + "@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, + "@use-gesture/core": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/@use-gesture/core/-/core-10.3.1.tgz", + "integrity": "sha512-WcINiDt8WjqBdUXye25anHiNxPc0VOrlT8F6LLkU6cycrOGUDyY/yyFmsg3k8i5OLvv25llc0QC45GhR/C8llw==" + }, + "@use-gesture/react": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/@use-gesture/react/-/react-10.3.1.tgz", + "integrity": "sha512-Yy19y6O2GJq8f7CHf7L0nxL8bf4PZCPaVOCgJrusOeFHY1LvHgYXnmnXg6N5iwAnbgbZCDjo60SiM6IPJi9C5g==", + "requires": { + "@use-gesture/core": "10.3.1" + } + }, + "@vitejs/plugin-react": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.1.tgz", + "integrity": "sha512-m/V2syj5CuVnaxcUJOQRel/Wr31FFXRFlnOoq1TVtkCxsY5veGMTEmpWHndrhB2U8ScHtCQB1e+4hWYExQc6Lg==", + "dev": true, + "requires": { + "@babel/core": "^7.24.5", + "@babel/plugin-transform-react-jsx-self": "^7.24.5", + "@babel/plugin-transform-react-jsx-source": "^7.24.1", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.14.2" + } + }, + "abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "dev": true + }, + "acorn": { + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "dev": true + }, + "acorn-globals": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz", + "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==", + "dev": true, + "requires": { + "acorn": "^8.1.0", + "acorn-walk": "^8.0.2" + } + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "requires": {} + }, + "acorn-walk": { + "version": "8.3.3", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.3.tgz", + "integrity": "sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==", + "dev": true, + "requires": { + "acorn": "^8.11.0" + } + }, + "ag-grid-community": { + "version": "31.3.4", + "resolved": "https://registry.npmjs.org/ag-grid-community/-/ag-grid-community-31.3.4.tgz", + "integrity": "sha512-jOxQO86C6eLnk1GdP24HB6aqaouFzMWizgfUwNY5MnetiWzz9ZaAmOGSnW/XBvdjXvC5Fpk3gSbvVKKQ7h9kBw==" + }, + "ag-grid-react": { + "version": "31.3.4", + "resolved": "https://registry.npmjs.org/ag-grid-react/-/ag-grid-react-31.3.4.tgz", + "integrity": "sha512-WmPASHRFGSTxCMRStWG5bRtln0Ugsdqbb3+Y8sEyGHeLw4hXqfpqie3lT9kqCOl7wPWUjCpwmFdXzRnWPmyyeg==", + "requires": { + "ag-grid-community": "31.3.4", + "prop-types": "^15.8.1" + } + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "requires": { + "debug": "4" + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "requires": { + "type-fest": "^0.21.3" + } + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dev": true, + "requires": { + "dequal": "^2.0.3" + } + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==" + }, + "array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dev": true, + "requires": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + } + }, + "array-includes": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "is-string": "^1.0.7" + } + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "array.prototype.findlastindex": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", + "dev": true, + "requires": { + "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.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + } + }, + "array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + } + }, + "arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dev": true, + "requires": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + } + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==" + }, + "async": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "requires": { + "possible-typed-array-names": "^1.0.0" + } + }, + "babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "dev": true, + "requires": { + "@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" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "requires": { + "@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" + }, + "dependencies": { + "istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "requires": { + "@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" + } + }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "dev": true, + "requires": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + } + }, + "babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "requires": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + } + }, + "babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "requires": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@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-top-level-await": "^7.8.3" + } + }, + "babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "dev": true, + "requires": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "bidi-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz", + "integrity": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==", + "requires": { + "require-from-string": "^2.0.2" + } + }, + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "requires": { + "fill-range": "^7.1.1" + } + }, + "browserslist": { + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", + "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001646", + "electron-to-chromium": "^1.5.4", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" + } + }, + "bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "requires": { + "fast-json-stable-stringify": "2.x" + } + }, + "bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "requires": { + "node-int64": "^0.4.0" + } + }, + "buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "bytewise": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/bytewise/-/bytewise-1.1.0.tgz", + "integrity": "sha512-rHuuseJ9iQ0na6UDhnrRVDh8YnWVlU6xM3VH6q/+yHDeUH2zIhUzP+2/h3LIrhLDBtTqzWpE3p3tP/boefskKQ==", + "requires": { + "bytewise-core": "^1.2.2", + "typewise": "^1.0.3" + } + }, + "bytewise-core": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/bytewise-core/-/bytewise-core-1.2.3.tgz", + "integrity": "sha512-nZD//kc78OOxeYtRlVk8/zXqTB4gf/nlguL1ggWA8FuchMyOxcyHR4QPQZMUmA7czC+YnaBrPUCubqAWe50DaA==", + "requires": { + "typewise-core": "^1.2" + } + }, + "call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dev": true, + "requires": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "camera-controls": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/camera-controls/-/camera-controls-2.8.5.tgz", + "integrity": "sha512-7VTwRk7Nu1nRKsY7bEt9HVBfKt8DETvzyYhLN4OW26OByBayMDB5fUaNcPI+z++vG23RH5yqn6ZRhZcgLQy2rA==", + "requires": {} + }, + "caniuse-lite": { + "version": "1.0.30001649", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001649.tgz", + "integrity": "sha512-fJegqZZ0ZX8HOWr6rcafGr72+xcgJKI9oWfDW5DrD7ExUtgZC7a7R7ZYmZqplh7XDocFdGeIFn7roAxhOeYrPQ==", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" + } + } + }, + "char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true + }, + "ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==" + }, + "cjs-module-lexer": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz", + "integrity": "sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==", + "dev": true + }, + "cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + } + }, + "clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==" + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true + }, + "collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "dev": true + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + }, + "cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + } + }, + "create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "requires": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "requires": { + "cross-spawn": "^7.0.1" + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", + "dev": true + }, + "cssom": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", + "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", + "dev": true + }, + "cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "requires": { + "cssom": "~0.3.6" + }, + "dependencies": { + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + } + } + }, + "csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + }, + "data-urls": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", + "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", + "dev": true, + "requires": { + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0" + } + }, + "data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dev": true, + "requires": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + } + }, + "data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + } + }, + "data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "requires": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + } + }, + "debounce": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", + "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==" + }, + "debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "requires": { + "ms": "2.1.2" + } + }, + "decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", + "dev": true + }, + "dedent": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", + "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", + "dev": true, + "requires": {} + }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true + }, + "define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "requires": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + } + }, + "define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "requires": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true + }, + "dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true + }, + "detect-gpu": { + "version": "5.0.42", + "resolved": "https://registry.npmjs.org/detect-gpu/-/detect-gpu-5.0.42.tgz", + "integrity": "sha512-Vdhe87ZNhxIS+OGesy9DOx8P3YBbCBapoomGR9kH26HuDAZ6c0FohsrK47j9efL972kLCaD22EbNUYHVLkqx/w==", + "requires": { + "webgl-constants": "^1.1.1" + } + }, + "detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true + }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, + "diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "dom-accessibility-api": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", + "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", + "dev": true + }, + "dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "requires": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "domexception": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", + "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", + "dev": true, + "requires": { + "webidl-conversions": "^7.0.0" + } + }, + "draco3d": { + "version": "1.5.7", + "resolved": "https://registry.npmjs.org/draco3d/-/draco3d-1.5.7.tgz", + "integrity": "sha512-m6WCKt/erDXcw+70IJXnG7M3awwQPAsZvJGX5zY7beBqpELw6RDGkYVU0W43AFxye4pDZ5i2Lbyc/NNGqwjUVQ==" + }, + "earcut": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/earcut/-/earcut-3.0.0.tgz", + "integrity": "sha512-41Fs7Q/PLq1SDbqjsgcY7GA42T0jvaCNGXgGtsNdvg+Yv8eIu06bxv4/PoREkZ9nMDNwnUSG9OFB9+yv8eKhDg==" + }, + "echarts": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/echarts/-/echarts-5.5.1.tgz", + "integrity": "sha512-Fce8upazaAXUVUVsjgV6mBnGuqgO+JNDlcgF79Dksy4+wgGpQB2lmYoO4TSweFg/mZITdpGHomw/cNBJZj1icA==", + "requires": { + "tslib": "2.3.0", + "zrender": "5.6.0" + } + }, + "echarts-for-react": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/echarts-for-react/-/echarts-for-react-3.0.2.tgz", + "integrity": "sha512-DRwIiTzx8JfwPOVgGttDytBqdp5VzCSyMRIxubgU/g2n9y3VLUmF2FK7Icmg/sNVkv4+rktmrLN9w22U2yy3fA==", + "requires": { + "fast-deep-equal": "^3.1.3", + "size-sensor": "^1.0.1" + } + }, + "ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "dev": true, + "requires": { + "jake": "^10.8.5" + } + }, + "electron-to-chromium": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.5.tgz", + "integrity": "sha512-QR7/A7ZkMS8tZuoftC/jfqNkZLQO779SSW3YuZHP4eXpj3EffGLFcB/Xu9AAZQzLccTiCV+EmUo3ha4mQ9wnlA==", + "dev": true + }, + "emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "dev": true, + "requires": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.3", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.15" + } + }, + "es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.2.4" + } + }, + "es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true + }, + "es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "requires": { + "es-errors": "^1.3.0" + } + }, + "es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + } + }, + "es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dev": true, + "requires": { + "hasown": "^2.0.0" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "requires": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "dev": true + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" + }, + "escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, + "requires": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + } + } + }, + "eslint": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", + "@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" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + } + } + }, + "eslint-config-prettier": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", + "dev": true, + "requires": {} + }, + "eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "requires": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "eslint-module-utils": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", + "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", + "dev": true, + "requires": { + "debug": "^3.2.7" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "eslint-plugin-import": { + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", + "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", + "dev": true, + "requires": { + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.8.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", + "semver": "^6.3.1", + "tsconfig-paths": "^3.15.0" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "eslint-plugin-prettier": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.1.tgz", + "integrity": "sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==", + "dev": true, + "requires": { + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.9.1" + } + }, + "eslint-plugin-react-hooks": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", + "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", + "dev": true, + "requires": {} + }, + "eslint-plugin-react-refresh": { + "version": "0.4.9", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.9.tgz", + "integrity": "sha512-QK49YrBAo5CLNLseZ7sZgvgTy21E6NEw22eZqc4teZfH8pxV3yXc9XXOYfUI6JNpw7mfHNkAeWtBxrTyykB6HA==", + "dev": true, + "requires": {} + }, + "eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true + }, + "espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "requires": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true + }, + "expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dev": true, + "requires": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true + }, + "fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "requires": { + "bser": "2.1.1" + } + }, + "fflate": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", + "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==" + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dev": true, + "requires": { + "minimatch": "^5.0.1" + }, + "dependencies": { + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "requires": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true + }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "requires": { + "is-callable": "^1.1.3" + } + }, + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "optional": true + }, + "function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" + }, + "function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + } + }, + "functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true + }, + "geojson-vt": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/geojson-vt/-/geojson-vt-4.0.2.tgz", + "integrity": "sha512-AV9ROqlNqoZEIJGfm1ncNjEXfkz2hdFlZf0qkVfmkwdKa8vj7H16YUOT81rJw1rdFhyEDlN2Tds91p/glzbl5A==" + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dev": true, + "requires": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + } + }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" + }, + "get-symbol-description": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "dev": true, + "requires": { + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==" + }, + "gl-matrix": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.4.3.tgz", + "integrity": "sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "requires": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "dependencies": { + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" + }, + "globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "requires": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + } + }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + } + }, + "glsl-noise": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/glsl-noise/-/glsl-noise-0.0.0.tgz", + "integrity": "sha512-b/ZCF6amfAUb7dJM/MxRs7AetQEahYzJ8PtgfrmEdtw6uyGOr+ZSGtgjFm6mfsBkxJ4d2W7kg+Nlqzqvn3Bc0w==" + }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.3" + } + }, + "graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "harmony-reflect": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", + "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==", + "dev": true + }, + "has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" + }, + "has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "requires": { + "es-define-property": "^1.0.0" + } + }, + "has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "dev": true + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true + }, + "has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.3" + } + }, + "hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "requires": { + "function-bind": "^1.1.2" + } + }, + "hls.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/hls.js/-/hls.js-1.3.5.tgz", + "integrity": "sha512-uybAvKS6uDe0MnWNEPnO0krWVr+8m2R0hJ/viql8H3MVK+itq8gGQuIYoFHL3rECkIpNH98Lw8YuuWMKZxp3Ew==" + }, + "hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "requires": { + "react-is": "^16.7.0" + }, + "dependencies": { + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + } + } + }, + "html-encoding-sniffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "dev": true, + "requires": { + "whatwg-encoding": "^2.0.0" + } + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "requires": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + } + }, + "https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true + }, + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, + "identity-obj-proxy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", + "integrity": "sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==", + "dev": true, + "requires": { + "harmony-reflect": "^1.4.6" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, + "ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "dev": true + }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "dev": true, + "requires": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "internal-slot": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "dev": true, + "requires": { + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + } + }, + "is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "requires": { + "has-bigints": "^1.0.1" + } + }, + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true + }, + "is-core-module": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.0.tgz", + "integrity": "sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==", + "requires": { + "hasown": "^2.0.2" + } + }, + "is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dev": true, + "requires": { + "is-typed-array": "^1.1.13" + } + }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==" + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true + }, + "is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "requires": { + "isobject": "^3.0.1" + } + }, + "is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true + }, + "is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" + }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-shared-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "dev": true, + "requires": { + "call-bind": "^1.0.7" + } + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dev": true, + "requires": { + "which-typed-array": "^1.1.14" + } + }, + "is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==" + }, + "istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "dev": true, + "requires": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + } + }, + "istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "istanbul-reports": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "its-fine": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/its-fine/-/its-fine-1.2.5.tgz", + "integrity": "sha512-fXtDA0X0t0eBYAGLVM5YsgJGsJ5jEmqZEPrGbzdf5awjv0xE7nqv3TVnvtUF060Tkes15DbDAKW/I48vsb6SyA==", + "requires": { + "@types/react-reconciler": "^0.28.0" + }, + "dependencies": { + "@types/react-reconciler": { + "version": "0.28.8", + "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.28.8.tgz", + "integrity": "sha512-SN9c4kxXZonFhbX4hJrZy37yw9e7EIxcpHCxQv5JUS18wDE5ovkQKlqQEkufdJCCMfuI9BnjUJvhYeJ9x5Ra7g==", + "requires": { + "@types/react": "*" + } + } + } + }, + "jake": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", + "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", + "dev": true, + "requires": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "dev": true, + "requires": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + } + }, + "jest-changed-files": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "dev": true, + "requires": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + } + }, + "jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "dev": true, + "requires": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "requires": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + } + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "dev": true, + "requires": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "dev": true, + "requires": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "requires": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + } + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "requires": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + } + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "dev": true, + "requires": { + "detect-newline": "^3.0.0" + } + }, + "jest-each": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "requires": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "requires": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==" + } + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-environment-jsdom": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.7.0.tgz", + "integrity": "sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==", + "dev": true, + "requires": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/jsdom": "^20.0.0", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0", + "jsdom": "^20.0.0" + } + }, + "jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "dev": true, + "requires": { + "@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": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==" + }, + "jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, + "requires": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "fsevents": "^2.3.2", + "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" + } + }, + "jest-leak-detector": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "dev": true, + "requires": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + }, + "pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "requires": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + } + } + } + }, + "jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "requires": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + } + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, + "requires": { + "@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" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "requires": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + } + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "requires": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + } + }, + "jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "requires": {} + }, + "jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true + }, + "jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "dev": true, + "requires": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + } + }, + "jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "dev": true, + "requires": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "requires": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "dev": true, + "requires": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "requires": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + } + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "requires": { + "@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" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "dev": true, + "requires": { + "@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" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "requires": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + } + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "dev": true, + "requires": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "requires": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "js-sha1": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/js-sha1/-/js-sha1-0.7.0.tgz", + "integrity": "sha512-oQZ1Mo7440BfLSv9TX87VNEyU52pXPVG19F9PL3gTgNt0tVxlZ8F4O6yze3CLuLx28TxotxvlyepCNaaV0ZjMw==" + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "jsdom": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.3.tgz", + "integrity": "sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==", + "dev": true, + "requires": { + "abab": "^2.0.6", + "acorn": "^8.8.1", + "acorn-globals": "^7.0.0", + "cssom": "^0.5.0", + "cssstyle": "^2.3.0", + "data-urls": "^3.0.2", + "decimal.js": "^10.4.2", + "domexception": "^4.0.0", + "escodegen": "^2.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.2", + "parse5": "^7.1.1", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.2", + "w3c-xmlserializer": "^4.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0", + "ws": "^8.11.0", + "xml-name-validator": "^4.0.0" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" + }, + "json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "json-stringify-pretty-compact": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/json-stringify-pretty-compact/-/json-stringify-pretty-compact-4.0.0.tgz", + "integrity": "sha512-3CNZ2DnrpByG9Nqj6Xo8vqbjT4F6N+tb4Gb28ESAZjYZ5yqvmc56J+/kuIwkaAMOyblTQhUW7PxMkUb8Q36N3Q==" + }, + "json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true + }, + "kdbush": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/kdbush/-/kdbush-4.0.2.tgz", + "integrity": "sha512-WbCVYJ27Sz8zi9Q7Q0xHC+05iwkm3Znipc2XTlrnJbsHMYktW4hPhXUE8Ys1engBrvffoSCqbil1JQAa7clRpA==" + }, + "keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "requires": { + "json-buffer": "3.0.1" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + }, + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "requires": { + "immediate": "~3.0.5" + } + }, + "lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "luxon": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.5.0.tgz", + "integrity": "sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ==" + }, + "lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "dev": true + }, + "maath": { + "version": "0.10.8", + "resolved": "https://registry.npmjs.org/maath/-/maath-0.10.8.tgz", + "integrity": "sha512-tRvbDF0Pgqz+9XUa4jjfgAQ8/aPKmQdWXilFu2tMy4GWj4NOsx99HlULO4IeREfbO3a0sA145DZYyvXPkybm0g==", + "requires": {} + }, + "make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "requires": { + "semver": "^7.5.3" + } + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "requires": { + "tmpl": "1.0.5" + } + }, + "maplibre-gl": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/maplibre-gl/-/maplibre-gl-4.5.1.tgz", + "integrity": "sha512-pKFDK8ZU2atwZWC8gdPVhN7Bf5HIPgtA+IG/iQ7J6WgmqSwCSmylc5q3stahWqXfx9PYUwVNJITrp1Hw96SUiA==", + "requires": { + "@mapbox/geojson-rewind": "^0.5.2", + "@mapbox/jsonlint-lines-primitives": "^2.0.2", + "@mapbox/point-geometry": "^0.1.0", + "@mapbox/tiny-sdf": "^2.0.6", + "@mapbox/unitbezier": "^0.0.1", + "@mapbox/vector-tile": "^1.3.1", + "@mapbox/whoots-js": "^3.1.0", + "@maplibre/maplibre-gl-style-spec": "^20.3.0", + "@types/geojson": "^7946.0.14", + "@types/geojson-vt": "3.2.5", + "@types/mapbox__point-geometry": "^0.1.4", + "@types/mapbox__vector-tile": "^1.3.4", + "@types/pbf": "^3.0.5", + "@types/supercluster": "^7.1.3", + "earcut": "^3.0.0", + "geojson-vt": "^4.0.2", + "gl-matrix": "^3.4.3", + "global-prefix": "^3.0.0", + "kdbush": "^4.0.2", + "murmurhash-js": "^1.0.0", + "pbf": "^3.3.0", + "potpack": "^2.0.0", + "quickselect": "^3.0.0", + "supercluster": "^8.0.1", + "tinyqueue": "^3.0.0", + "vt-pbf": "^3.1.3" + } + }, + "memoize-one": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", + "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==" + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "meshline": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/meshline/-/meshline-3.3.1.tgz", + "integrity": "sha512-/TQj+JdZkeSUOl5Mk2J7eLcYTLiQm2IDzmlSvYm7ov15anEcDJ92GHqqazxTSreeNgfnYu24kiEvvv0WlbCdFQ==", + "requires": {} + }, + "meshoptimizer": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/meshoptimizer/-/meshoptimizer-0.18.1.tgz", + "integrity": "sha512-ZhoIoL7TNV4s5B6+rx5mC//fw8/POGyNxS/DZyCJeiZ12ScLfVwRE/GfsxwiTkMYYD5DmK2/JXnEVXqL4rF+Sw==" + }, + "micromatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", + "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "dev": true, + "requires": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + } + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "requires": { + "mime-db": "1.52.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true + }, + "minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "murmurhash-js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/murmurhash-js/-/murmurhash-js-1.0.0.tgz", + "integrity": "sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw==" + }, + "nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==" + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node-releases": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", + "dev": true + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "nwsapi": { + "version": "2.2.12", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.12.tgz", + "integrity": "sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" + }, + "object-inspect": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + } + }, + "object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + } + }, + "object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + } + }, + "object.values": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "requires": { + "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" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dev": true, + "requires": { + "entities": "^4.4.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" + }, + "pbf": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/pbf/-/pbf-3.3.0.tgz", + "integrity": "sha512-XDF38WCH3z5OV/OVa8GKUNtLAyneuzbCisx7QUCF8Q6Nutx0WnJrQe5O+kOtBlLfRNUws98Y58Lblp+NJG5T4Q==", + "requires": { + "ieee754": "^1.1.12", + "resolve-protobuf-schema": "^2.1.0" + } + }, + "picocolors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + }, + "pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + } + } + }, + "playwright": { + "version": "1.46.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.46.0.tgz", + "integrity": "sha512-XYJ5WvfefWONh1uPAUAi0H2xXV5S3vrtcnXe6uAOgdGi3aSpqOSXX08IAjXW34xitfuOJsvXU5anXZxPSEQiJw==", + "dev": true, + "requires": { + "fsevents": "2.3.2", + "playwright-core": "1.46.0" + }, + "dependencies": { + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + } + } + }, + "playwright-core": { + "version": "1.46.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.46.0.tgz", + "integrity": "sha512-9Y/d5UIwuJk8t3+lhmMSAJyNP1BUC/DqP3cQJDQQL/oWqAiuPTLgy7Q5dzglmTLwcBRdetzgNM/gni7ckfTr6A==", + "dev": true + }, + "possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true + }, + "postcss": { + "version": "8.4.41", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz", + "integrity": "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==", + "requires": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.1", + "source-map-js": "^1.2.0" + } + }, + "potpack": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/potpack/-/potpack-2.0.0.tgz", + "integrity": "sha512-Q+/tYsFU9r7xoOJ+y/ZTtdVQwTWfzjbiXBDMM/JKUux3+QPP02iUuIoeBQ+Ot6oEDlC+/PGjB/5A3K7KKb7hcw==" + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "prettier": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", + "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==" + }, + "prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "requires": { + "fast-diff": "^1.1.2" + } + }, + "pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + }, + "react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true + } + } + }, + "promise-worker-transferable": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/promise-worker-transferable/-/promise-worker-transferable-1.0.4.tgz", + "integrity": "sha512-bN+0ehEnrXfxV2ZQvU2PetO0n4gqBD4ulq3MI1WOPLgr7/Mg9yRQkX5+0v1vagr74ZTsl7XtzlaYDo2EuCeYJw==", + "requires": { + "is-promise": "^2.1.0", + "lie": "^3.0.2" + } + }, + "prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + } + }, + "prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + }, + "dependencies": { + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + } + } + }, + "protocol-buffers-schema": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz", + "integrity": "sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw==" + }, + "psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true + }, + "punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true + }, + "pure-rand": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "dev": true + }, + "querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "quickselect": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-3.0.0.tgz", + "integrity": "sha512-XdjUArbK4Bm5fLLvlm5KpTFOiOThgfWWI4axAZDWg4E/0mKdZyI9tNEfds27qCi1ze/vwTR16kvmmGhRra3c2g==" + }, + "react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "requires": { + "loose-envify": "^1.1.0" + } + }, + "react-composer": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/react-composer/-/react-composer-5.0.3.tgz", + "integrity": "sha512-1uWd07EME6XZvMfapwZmc7NgCZqDemcvicRi3wMJzXsQLvZ3L7fTHVyPy1bZdnWXM4iPjYuNE+uJ41MLKeTtnA==", + "requires": { + "prop-types": "^15.6.0" + } + }, + "react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "requires": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "dependencies": { + "scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "requires": { + "loose-envify": "^1.1.0" + } + } + } + }, + "react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" + }, + "react-reconciler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.27.0.tgz", + "integrity": "sha512-HmMDKciQjYmBRGuuhIaKA1ba/7a+UsM5FzOZsMO2JYHt9Jh8reCb7j1eDC95NOyUlKM9KRyvdx0flBuDvYSBoA==", + "requires": { + "loose-envify": "^1.1.0", + "scheduler": "^0.21.0" + } + }, + "react-refresh": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", + "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", + "dev": true + }, + "react-router": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.26.0.tgz", + "integrity": "sha512-wVQq0/iFYd3iZ9H2l3N3k4PL8EEHcb0XlU2Na8nEwmiXgIUElEH6gaJDtUQxJ+JFzmIXaQjfdpcGWaM6IoQGxg==", + "requires": { + "@remix-run/router": "1.19.0" + } + }, + "react-router-dom": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.26.0.tgz", + "integrity": "sha512-RRGUIiDtLrkX3uYcFiCIxKFWMcWQGMojpYZfcstc63A1+sSnVgILGIm9gNUA6na3Fm1QuPGSBQH2EMbAZOnMsQ==", + "requires": { + "@remix-run/router": "1.19.0", + "react-router": "6.26.0" + } + }, + "react-select": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/react-select/-/react-select-5.8.0.tgz", + "integrity": "sha512-TfjLDo58XrhP6VG5M/Mi56Us0Yt8X7xD6cDybC7yoRMUNm7BGO7qk8J0TLQOua/prb8vUOtsfnXZwfm30HGsAA==", + "requires": { + "@babel/runtime": "^7.12.0", + "@emotion/cache": "^11.4.0", + "@emotion/react": "^11.8.1", + "@floating-ui/dom": "^1.0.1", + "@types/react-transition-group": "^4.4.0", + "memoize-one": "^6.0.0", + "prop-types": "^15.6.0", + "react-transition-group": "^4.3.0", + "use-isomorphic-layout-effect": "^1.1.2" + } + }, + "react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "requires": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + } + }, + "react-use-measure": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/react-use-measure/-/react-use-measure-2.1.1.tgz", + "integrity": "sha512-nocZhN26cproIiIduswYpV5y5lQpSQS1y/4KuvUCjSKmw7ZWIS/+g3aFnX3WdBkyuGUtTLif3UTqnLLhbDoQig==", + "requires": { + "debounce": "^1.2.1" + } + }, + "redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "requires": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + } + }, + "regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + }, + "regexp.prototype.flags": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "dev": true, + "requires": { + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, + "resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "requires": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "requires": { + "resolve-from": "^5.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" + }, + "resolve-protobuf-schema": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz", + "integrity": "sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==", + "requires": { + "protocol-buffers-schema": "^3.3.1" + } + }, + "resolve.exports": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "rollup": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.20.0.tgz", + "integrity": "sha512-6rbWBChcnSGzIlXeIdNIZTopKYad8ZG8ajhl78lGRLsI2rX8IkaotQhVas2Ma+GPxJav19wrSzvRvuiv0YKzWw==", + "requires": { + "@rollup/rollup-android-arm-eabi": "4.20.0", + "@rollup/rollup-android-arm64": "4.20.0", + "@rollup/rollup-darwin-arm64": "4.20.0", + "@rollup/rollup-darwin-x64": "4.20.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.20.0", + "@rollup/rollup-linux-arm-musleabihf": "4.20.0", + "@rollup/rollup-linux-arm64-gnu": "4.20.0", + "@rollup/rollup-linux-arm64-musl": "4.20.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.20.0", + "@rollup/rollup-linux-riscv64-gnu": "4.20.0", + "@rollup/rollup-linux-s390x-gnu": "4.20.0", + "@rollup/rollup-linux-x64-gnu": "4.20.0", + "@rollup/rollup-linux-x64-musl": "4.20.0", + "@rollup/rollup-win32-arm64-msvc": "4.20.0", + "@rollup/rollup-win32-ia32-msvc": "4.20.0", + "@rollup/rollup-win32-x64-msvc": "4.20.0", + "@types/estree": "1.0.5", + "fsevents": "~2.3.2" + } + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" + }, + "safe-array-concat": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + } + }, + "safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "dev": true, + "requires": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "requires": { + "xmlchars": "^2.2.0" + } + }, + "scheduler": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.21.0.tgz", + "integrity": "sha512-1r87x5fz9MXqswA2ERLo0EbOAU74DpIUO090gIasYTqlVoJeMcl+Z1Rg7WHz+qtPujhS/hGIt9kxZOYBV3faRQ==", + "requires": { + "loose-envify": "^1.1.0" + } + }, + "semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true + }, + "set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "requires": { + "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": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "requires": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + } + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + }, + "side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + } + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "size-sensor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/size-sensor/-/size-sensor-1.0.2.tgz", + "integrity": "sha512-2NCmWxY7A9pYKGXNBfteo4hy14gWu47rg5692peVMst6lQLPKrVjhY+UTEsPI5ceFRJSl3gVgMYaUi/hKuaiKw==" + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "sort-asc": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/sort-asc/-/sort-asc-0.2.0.tgz", + "integrity": "sha512-umMGhjPeHAI6YjABoSTrFp2zaBtXBej1a0yKkuMUyjjqu6FJsTF+JYwCswWDg+zJfk/5npWUUbd33HH/WLzpaA==" + }, + "sort-desc": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/sort-desc/-/sort-desc-0.2.0.tgz", + "integrity": "sha512-NqZqyvL4VPW+RAxxXnB8gvE1kyikh8+pR+T+CXLksVRN9eiQqkQlPwqWYU0mF9Jm7UnctShlxLyAt1CaBOTL1w==" + }, + "sort-object": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sort-object/-/sort-object-3.0.3.tgz", + "integrity": "sha512-nK7WOY8jik6zaG9CRwZTaD5O7ETWDLZYMM12pqY8htll+7dYeqGfEUPcUBHOpSJg2vJOrvFIY2Dl5cX2ih1hAQ==", + "requires": { + "bytewise": "^1.1.0", + "get-value": "^2.0.2", + "is-extendable": "^0.1.1", + "sort-asc": "^0.2.0", + "sort-desc": "^0.2.0", + "union-value": "^1.0.1" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==" + }, + "source-map-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==" + }, + "source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "requires": { + "extend-shallow": "^3.0.0" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "requires": { + "escape-string-regexp": "^2.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true + } + } + }, + "stats-gl": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/stats-gl/-/stats-gl-2.2.8.tgz", + "integrity": "sha512-94G5nZvduDmzxBS7K0lYnynYwreZpkknD8g5dZmU6mpwIhy3caCrjAm11Qm1cbyx7mqix7Fp00RkbsonzKWnoQ==", + "requires": { + "@types/three": "^0.163.0" + }, + "dependencies": { + "@types/three": { + "version": "0.163.0", + "resolved": "https://registry.npmjs.org/@types/three/-/three-0.163.0.tgz", + "integrity": "sha512-uIdDhsXRpQiBUkflBS/i1l3JX14fW6Ot9csed60nfbZNXHDTRsnV2xnTVwXcgbvTiboAR4IW+t+lTL5f1rqIqA==", + "requires": { + "@tweenjs/tween.js": "~23.1.1", + "@types/stats.js": "*", + "@types/webxr": "*", + "fflate": "~0.8.2", + "meshoptimizer": "~0.18.1" + } + } + } + }, + "stats.js": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/stats.js/-/stats.js-0.17.0.tgz", + "integrity": "sha512-hNKz8phvYLPEcRkeG1rsGmV5ChMjKDAWU7/OJJdDErPBNChQXxCo3WZurGpnWc6gZhAzEPFad1aVgyOANH1sMw==" + }, + "string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "requires": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + } + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "string.prototype.trim": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" + } + }, + "string.prototype.trimend": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + } + }, + "string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, + "strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "requires": { + "min-indent": "^1.0.0" + } + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" + }, + "supercluster": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/supercluster/-/supercluster-8.0.1.tgz", + "integrity": "sha512-IiOea5kJ9iqzD2t7QJq/cREyLHTtSmUT6gQsweojg9WH2sYJqZK9SswTu6jrscO6D1G5v5vYZ9ru/eq85lXeZQ==", + "requires": { + "kdbush": "^4.0.2" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "suspend-react": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/suspend-react/-/suspend-react-0.1.3.tgz", + "integrity": "sha512-aqldKgX9aZqpoDp3e8/BZ8Dm7x1pJl+qI3ZKxDN0i/IQTWUwBx/ManmlVJ3wowqbno6c2bmiIfs+Um6LbsjJyQ==", + "requires": {} + }, + "symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, + "synckit": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.1.tgz", + "integrity": "sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==", + "dev": true, + "requires": { + "@pkgr/core": "^0.1.0", + "tslib": "^2.6.2" + }, + "dependencies": { + "tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", + "dev": true + } + } + }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "three": { + "version": "0.167.1", + "resolved": "https://registry.npmjs.org/three/-/three-0.167.1.tgz", + "integrity": "sha512-gYTLJA/UQip6J/tJvl91YYqlZF47+D/kxiWrbTon35ZHlXEN0VOo+Qke2walF1/x92v55H6enomymg4Dak52kw==" + }, + "three-mesh-bvh": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/three-mesh-bvh/-/three-mesh-bvh-0.7.6.tgz", + "integrity": "sha512-rCjsnxEqR9r1/C/lCqzGLS67NDty/S/eT6rAJfDvsanrIctTWdNoR4ZOGWewCB13h1QkVo2BpmC0wakj1+0m8A==", + "requires": {} + }, + "three-stdlib": { + "version": "2.32.1", + "resolved": "https://registry.npmjs.org/three-stdlib/-/three-stdlib-2.32.1.tgz", + "integrity": "sha512-ZgxxLAwtEaKkvfGP+hkW4s6IaDzif47evTdBPwVvdvLsOul3M6l0D4vO4/fzFguXT6FdoBlaTLhteOcn3uDzPg==", + "requires": { + "@types/draco3d": "^1.4.0", + "@types/offscreencanvas": "^2019.6.4", + "@types/webxr": "^0.5.2", + "draco3d": "^1.4.1", + "fflate": "^0.6.9", + "potpack": "^1.0.1" + }, + "dependencies": { + "fflate": { + "version": "0.6.10", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.6.10.tgz", + "integrity": "sha512-IQrh3lEPM93wVCEczc9SaAOvkmcoQn/G8Bo1e8ZPlY3X3bnAxWaBdvTdvM1hP62iZp0BXWDy4vTAy4fF0+Dlpg==" + }, + "potpack": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/potpack/-/potpack-1.0.2.tgz", + "integrity": "sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ==" + } + } + }, + "tinyqueue": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-3.0.0.tgz", + "integrity": "sha512-gRa9gwYU3ECmQYv3lslts5hxuIa90veaEcxDYuu3QGOIAEM2mOZkVHp48ANJuu1CURtRdHKUBY5Lm1tHV+sD4g==" + }, + "tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==" + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "tough-cookie": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", + "dev": true, + "requires": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + } + }, + "tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "dev": true, + "requires": { + "punycode": "^2.1.1" + } + }, + "troika-three-text": { + "version": "0.49.1", + "resolved": "https://registry.npmjs.org/troika-three-text/-/troika-three-text-0.49.1.tgz", + "integrity": "sha512-lXGWxgjJP9kw4i4Wh+0k0Q/7cRfS6iOME4knKht/KozPu9GcFA9NnNpRvehIhrUawq9B0ZRw+0oiFHgRO+4Wig==", + "requires": { + "bidi-js": "^1.0.2", + "troika-three-utils": "^0.49.0", + "troika-worker-utils": "^0.49.0", + "webgl-sdf-generator": "1.1.1" + } + }, + "troika-three-utils": { + "version": "0.49.0", + "resolved": "https://registry.npmjs.org/troika-three-utils/-/troika-three-utils-0.49.0.tgz", + "integrity": "sha512-umitFL4cT+Fm/uONmaQEq4oZlyRHWwVClaS6ZrdcueRvwc2w+cpNQ47LlJKJswpqtMFWbEhOLy0TekmcPZOdYA==", + "requires": {} + }, + "troika-worker-utils": { + "version": "0.49.0", + "resolved": "https://registry.npmjs.org/troika-worker-utils/-/troika-worker-utils-0.49.0.tgz", + "integrity": "sha512-1xZHoJrG0HFfCvT/iyN41DvI/nRykiBtHqFkGaGgJwq5iXfIZFBiPPEHFpPpgyKM3Oo5ITHXP5wM2TNQszYdVg==" + }, + "ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "dev": true, + "requires": {} + }, + "ts-jest": { + "version": "29.2.4", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.2.4.tgz", + "integrity": "sha512-3d6tgDyhCI29HlpwIq87sNuI+3Q6GLTTCeYRHCs7vDz+/3GCMwEtV9jezLyl4ZtnBgx00I7hm8PCP8cTksMGrw==", + "dev": true, + "requires": { + "bs-logger": "0.x", + "ejs": "^3.1.10", + "fast-json-stable-stringify": "2.x", + "jest-util": "^29.0.0", + "json5": "^2.2.3", + "lodash.memoize": "4.x", + "make-error": "1.x", + "semver": "^7.5.3", + "yargs-parser": "^21.0.1" + } + }, + "ts-jest-mock-import-meta": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ts-jest-mock-import-meta/-/ts-jest-mock-import-meta-1.2.0.tgz", + "integrity": "sha512-r2+TH6d8LHBXqLTXjJh1KfTZoMvGV0hdn9gwickNVcwS2Co2/mewGjj0XDVEPLg5MVfZVHUFQ9O09anURA3KCw==", + "dev": true, + "requires": {} + }, + "ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, + "requires": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + } + }, + "tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "requires": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true + } + } + }, + "tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + }, + "tunnel-rat": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/tunnel-rat/-/tunnel-rat-0.1.2.tgz", + "integrity": "sha512-lR5VHmkPhzdhrM092lI2nACsLO4QubF0/yoOhzX7c+wIpbN1GjHNzCc91QlpxBi+cnx8vVJ+Ur6vL5cEoQPFpQ==", + "requires": { + "zustand": "^4.3.2" + }, + "dependencies": { + "zustand": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.4.tgz", + "integrity": "sha512-/BPMyLKJPtFEvVL0E9E9BTUM63MNyhPGlvxk1XjrfWTUlV+BR8jufjsovHzrtR6YNcBEcL7cMHovL1n9xHawEg==", + "requires": { + "use-sync-external-store": "1.2.0" + } + } + } + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true + }, + "typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + } + }, + "typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + } + }, + "typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + } + }, + "typed-array-length": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + } + }, + "typescript": { + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", + "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", + "dev": true + }, + "typewise": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typewise/-/typewise-1.0.3.tgz", + "integrity": "sha512-aXofE06xGhaQSPzt8hlTY+/YWQhm9P0jYUp1f2XtmW/3Bk0qzXcyFWAtPoo2uTGQj1ZwbDuSyuxicq+aDo8lCQ==", + "requires": { + "typewise-core": "^1.2.0" + } + }, + "typewise-core": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/typewise-core/-/typewise-core-1.2.0.tgz", + "integrity": "sha512-2SCC/WLzj2SbUwzFOzqMCkz5amXLlxtJqDKTICqg30x+2DZxcfZN2MvQZmGfXWKNWaKK9pBPsvkcwv8bF/gxKg==" + }, + "unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + } + }, + "undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true + }, + "update-browserslist-db": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", + "dev": true, + "requires": { + "escalade": "^3.1.2", + "picocolors": "^1.0.1" + } + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "use-isomorphic-layout-effect": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz", + "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==", + "requires": {} + }, + "use-sync-external-store": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", + "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", + "requires": {} + }, + "util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, + "utility-types": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz", + "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==" + }, + "uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==" + }, + "v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "v8-to-istanbul": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "dependencies": { + "convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + } + } + }, + "vite": { + "version": "5.3.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.5.tgz", + "integrity": "sha512-MdjglKR6AQXQb9JGiS7Rc2wC6uMjcm7Go/NHNO63EwiJXfuk9PgqiP/n5IDJCziMkfw9n4Ubp7lttNwz+8ZVKA==", + "requires": { + "esbuild": "^0.21.3", + "fsevents": "~2.3.3", + "postcss": "^8.4.39", + "rollup": "^4.13.0" + } + }, + "vite-plugin-glsl": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/vite-plugin-glsl/-/vite-plugin-glsl-1.3.0.tgz", + "integrity": "sha512-SzEoLet9Bp5VSozjrhUiSc3xX1+u7rCTjXAsq4qWM3u8UjilI76A9ucX/T+CRGQCe25j50GSY+9mKSGUVPET1w==", + "requires": { + "@rollup/pluginutils": "^5.1.0" + } + }, + "vt-pbf": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/vt-pbf/-/vt-pbf-3.1.3.tgz", + "integrity": "sha512-2LzDFzt0mZKZ9IpVF2r69G9bXaP2Q2sArJCmcCgvfTdCCZzSyz4aCLoQyUilu37Ll56tCblIZrXFIjNUpGIlmA==", + "requires": { + "@mapbox/point-geometry": "0.1.0", + "@mapbox/vector-tile": "^1.3.1", + "pbf": "^3.2.1" + } + }, + "w3c-xmlserializer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", + "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", + "dev": true, + "requires": { + "xml-name-validator": "^4.0.0" + } + }, + "walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "requires": { + "makeerror": "1.0.12" + } + }, + "webgl-constants": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/webgl-constants/-/webgl-constants-1.1.1.tgz", + "integrity": "sha512-LkBXKjU5r9vAW7Gcu3T5u+5cvSvh5WwINdr0C+9jpzVB41cjQAP5ePArDtk/WHYdVj0GefCgM73BA7FlIiNtdg==" + }, + "webgl-sdf-generator": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/webgl-sdf-generator/-/webgl-sdf-generator-1.1.1.tgz", + "integrity": "sha512-9Z0JcMTFxeE+b2x1LJTdnaT8rT8aEp7MVxkNwoycNmJWwPdzoXzMh0BjJSh/AEFP+KPYZUli814h8bJZFIZ2jA==" + }, + "webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true + }, + "whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "dev": true, + "requires": { + "iconv-lite": "0.6.3" + } + }, + "whatwg-mimetype": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "dev": true + }, + "whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "dev": true, + "requires": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "requires": { + "isexe": "^2.0.0" + } + }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "which-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" + } + }, + "word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + } + }, + "ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "dev": true, + "requires": {} + }, + "xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true + }, + "xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" + }, + "yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "requires": { + "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" + } + }, + "yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true + }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true + }, + "zrender": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/zrender/-/zrender-5.6.0.tgz", + "integrity": "sha512-uzgraf4njmmHAbEUxMJ8Oxg+P3fT04O+9p7gY+wJRVxo8Ge+KmYv0WJev945EH4wFuc4OY2NLXz46FZrWS9xJg==", + "requires": { + "tslib": "2.3.0" + } + }, + "zustand": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-3.7.2.tgz", + "integrity": "sha512-PIJDIZKtokhof+9+60cpockVOq05sJzHCriyvaLBmEJixseQ1a5Kdov6fWZfWOu5SK9c+FhH1jU0tntLxRJYMA==", + "requires": {} } } } diff --git a/air-quality-ui/package.json b/air-quality-ui/package.json index 79d7ab83..4cb8bc79 100644 --- a/air-quality-ui/package.json +++ b/air-quality-ui/package.json @@ -17,6 +17,8 @@ "@emotion/react": "^11.13.0", "@emotion/styled": "^11.13.0", "@mui/x-date-pickers": "^7.12.0", + "@react-three/drei": "^9.109.2", + "@react-three/fiber": "^8.16.8", "@tanstack/react-query": "^5.40.1", "@types/echarts": "^4.9.22", "ag-grid-react": "^31.3.2", @@ -29,7 +31,9 @@ "react": "^18.2.0", "react-dom": "^18.2.0", "react-router-dom": "^6.23.1", - "react-select": "^5.8.0" + "react-select": "^5.8.0", + "three": "^0.167.1", + "vite-plugin-glsl": "^1.3.0" }, "devDependencies": { "@playwright/test": "^1.45.0", diff --git a/air-quality-ui/public/Maximum_Voltage_Regular.json b/air-quality-ui/public/Maximum_Voltage_Regular.json new file mode 100644 index 00000000..ac076524 --- /dev/null +++ b/air-quality-ui/public/Maximum_Voltage_Regular.json @@ -0,0 +1 @@ +{"glyphs":{"0":{"ha":949,"x_min":0,"x_max":949,"o":"m 475 0 q 139 139 278 0 q 0 475 0 278 q 139 810 0 671 q 475 949 278 949 q 810 810 671 949 q 949 475 949 671 q 810 139 949 278 q 475 0 671 0 m 475 271 q 618 331 559 271 q 678 475 678 391 q 618 618 678 559 q 475 678 559 678 q 331 618 391 678 q 271 475 271 559 q 331 331 271 391 q 475 271 391 271 z "},"1":{"ha":407,"x_min":68,"x_max":340,"o":"m 340 949 l 340 0 l 68 0 l 68 949 l 340 949 z "},"2":{"ha":882,"x_min":68,"x_max":882,"o":"m 814 0 l 68 0 l 68 311 q 475 610 68 610 l 543 610 q 610 638 610 610 q 543 678 610 678 l 136 678 l 136 949 l 475 949 q 882 638 882 949 q 475 339 882 339 q 339 311 339 339 l 339 271 l 814 271 l 814 0 z "},"3":{"ha":882,"x_min":68,"x_max":814,"o":"m 271 339 l 271 610 l 475 610 q 543 644 543 610 q 475 678 543 678 l 68 678 l 68 949 l 475 949 q 814 644 814 949 q 746 475 814 534 q 814 305 814 416 q 475 0 814 0 l 68 0 l 68 271 l 475 271 q 543 305 543 271 q 475 339 543 339 l 271 339 z "},"4":{"ha":882,"x_min":0,"x_max":882,"o":"m 746 339 l 746 0 l 475 0 l 475 339 l 0 339 l 136 949 l 407 949 l 339 610 l 475 610 l 475 949 l 746 949 l 746 610 l 882 610 l 882 339 l 746 339 z "},"5":{"ha":882,"x_min":68,"x_max":882,"o":"m 136 0 l 136 271 l 543 271 q 610 305 610 271 q 543 339 610 339 l 68 339 l 68 949 l 814 949 l 814 678 l 339 678 l 339 610 l 610 610 q 882 311 882 610 q 610 0 882 0 l 136 0 z "},"6":{"ha":882,"x_min":63,"x_max":877,"o":"m 402 678 q 334 610 334 678 l 538 610 q 877 305 877 610 q 538 0 877 0 l 402 0 q 63 305 63 0 l 63 644 q 402 949 63 949 l 814 949 l 814 678 l 402 678 m 538 271 q 606 305 606 271 q 538 339 606 339 l 402 339 q 334 305 334 339 q 402 271 334 271 l 538 271 z "},"7":{"ha":886,"x_min":136,"x_max":850,"o":"m 443 678 l 136 678 l 136 949 l 850 949 l 475 0 l 172 0 l 443 678 z "},"8":{"ha":949,"x_min":68,"x_max":882,"o":"m 543 610 q 610 644 610 610 q 543 678 610 678 l 407 678 q 339 644 339 678 q 407 610 339 610 l 543 610 m 543 949 q 882 644 882 949 q 814 475 882 534 q 882 305 882 416 q 543 0 882 0 l 407 0 q 68 305 68 0 q 136 475 68 416 q 68 644 68 534 q 407 949 68 949 l 543 949 m 543 271 q 610 305 610 271 l 610 307 q 545 339 610 339 l 409 339 q 339 305 341 339 q 407 271 339 271 l 543 271 z "},"9":{"ha":949,"x_min":68,"x_max":882,"o":"m 543 271 q 610 339 610 271 l 407 339 q 68 644 68 339 q 407 949 68 949 l 543 949 q 882 644 882 949 l 882 305 q 543 0 882 0 l 131 0 l 131 271 l 543 271 m 407 678 q 339 644 339 678 q 407 610 339 610 l 543 610 q 610 644 610 610 q 543 678 610 678 l 407 678 z "},"\u0000":{"ha":0,"x_min":0,"x_max":0,"o":""},"\u001d":{"ha":0,"x_min":0,"x_max":0,"o":""}," ":{"ha":543,"x_min":0,"x_max":0,"o":""}," ":{"ha":543,"x_min":0,"x_max":0,"o":""},"!":{"ha":543,"x_min":102,"x_max":441,"o":"m 136 339 l 102 949 l 441 949 l 408 339 l 136 339 m 136 0 l 136 271 l 408 271 l 408 0 l 136 0 z "},"\"":{"ha":625,"x_min":8,"x_max":618,"o":"m 279 949 l 245 543 l 42 543 l 8 949 l 279 949 m 618 949 l 585 543 l 381 543 l 347 949 l 618 949 z "},"#":{"ha":1085,"x_min":68,"x_max":1017,"o":"m 203 407 l 203 543 l 68 543 l 68 814 l 203 814 l 203 949 l 475 949 l 475 814 l 610 814 l 610 949 l 882 949 l 882 814 l 1017 814 l 1017 543 l 882 543 l 882 407 l 1017 407 l 1017 136 l 882 136 l 882 0 l 610 0 l 610 136 l 475 136 l 475 0 l 203 0 l 203 136 l 68 136 l 68 407 l 203 407 m 475 543 l 475 407 l 610 407 l 610 543 l 475 543 z "},"$":{"ha":814,"x_min":-1,"x_max":813,"o":"m 339 949 l 339 1085 l 475 1085 l 475 949 l 678 949 l 679 678 l 338 678 q 271 647 271 678 q 338 610 271 610 l 474 610 q 813 308 813 610 q 475 0 813 0 l 475 -136 l 339 -136 l 339 0 l 56 0 l 56 271 l 474 271 q 542 308 542 271 q 474 339 542 339 l 338 339 q -1 647 -1 339 q 338 949 -1 949 l 339 949 z "},"%":{"ha":919,"x_min":24,"x_max":906,"o":"m 906 949 l 330 0 l 24 0 l 603 949 l 906 949 m 296 610 l 24 610 l 24 882 l 296 882 l 296 610 m 906 68 l 635 68 l 635 339 l 906 339 l 906 68 z "},"&":{"ha":949,"x_min":68,"x_max":949,"o":"m 543 610 q 610 644 610 610 q 543 678 610 678 l 407 678 q 339 644 339 678 q 407 610 339 610 l 543 610 m 543 271 q 610 305 610 271 l 610 307 q 545 339 610 339 l 409 339 q 339 305 341 339 q 407 271 339 271 l 543 271 m 407 0 q 68 305 68 0 q 136 475 68 416 q 68 644 68 534 q 407 949 68 949 l 543 949 q 882 644 882 949 q 814 475 882 534 q 882 305 882 416 q 880 271 882 288 l 949 271 l 949 0 l 407 0 z "},"'":{"ha":287,"x_min":8,"x_max":279,"o":"m 279 949 l 245 543 l 42 543 l 8 949 l 279 949 z "},"(":{"ha":543,"x_min":68,"x_max":543,"o":"m 68 610 q 543 1085 68 1085 l 543 814 q 339 610 339 814 l 339 339 q 543 136 339 136 l 543 -136 q 68 339 68 -136 l 68 610 z "},")":{"ha":543,"x_min":68,"x_max":543,"o":"m 543 339 q 68 -136 543 -136 l 68 136 q 271 339 271 136 l 271 610 q 68 814 271 814 l 68 1085 q 543 610 543 1085 l 543 339 z "},"*":{"ha":678,"x_min":0,"x_max":678,"o":"m 407 775 l 530 899 l 626 804 l 502 678 l 678 678 l 678 543 l 502 543 l 626 417 l 530 321 l 407 446 l 407 271 l 271 271 l 271 446 l 149 321 l 52 417 l 176 543 l 0 543 l 0 678 l 176 678 l 52 804 l 149 899 l 271 775 l 271 949 l 407 949 l 407 775 z "},"+":{"ha":678,"x_min":0,"x_max":678,"o":"m 475 610 l 678 610 l 678 339 l 475 339 l 475 136 l 203 136 l 203 339 l 0 339 l 0 610 l 203 610 l 203 814 l 475 814 l 475 610 z "},",":{"ha":407,"x_min":-68,"x_max":339,"o":"m 339 136 l -68 -271 l 68 136 l 339 136 z "},"-":{"ha":543,"x_min":0,"x_max":543,"o":"m 543 610 l 543 339 l 0 339 l 0 610 l 543 610 z "},"­":{"ha":543,"x_min":0,"x_max":543,"o":"m 543 610 l 543 339 l 0 339 l 0 610 l 543 610 z "},".":{"ha":407,"x_min":68,"x_max":339,"o":"m 339 0 l 68 0 l 68 271 l 339 271 l 339 0 z "},"/":{"ha":678,"x_min":-104,"x_max":787,"o":"m 787 1085 l 179 -136 l -104 -136 l 512 1085 l 787 1085 z "},":":{"ha":407,"x_min":68,"x_max":339,"o":"m 339 543 l 68 543 l 68 814 l 339 814 l 339 543 m 339 136 l 68 136 l 68 407 l 339 407 l 339 136 z "},";":{"ha":407,"x_min":-68,"x_max":339,"o":"m 339 814 l 339 543 l 68 543 l 68 814 l 339 814 m 339 271 l -68 -271 l 68 271 l 339 271 z "},";":{"ha":407,"x_min":-68,"x_max":339,"o":"m 339 814 l 339 543 l 68 543 l 68 814 l 339 814 m 339 271 l -68 -271 l 68 271 l 339 271 z "},"<":{"ha":745,"x_min":0,"x_max":746,"o":"m 0 610 l 746 949 l 746 678 l 271 475 l 746 271 l 746 0 l 0 339 l 0 610 z "},"=":{"ha":746,"x_min":68,"x_max":678,"o":"m 678 814 l 678 543 l 68 543 l 68 814 l 678 814 m 678 407 l 678 136 l 68 136 l 68 407 l 678 407 z "},">":{"ha":814,"x_min":68,"x_max":814,"o":"m 814 339 l 68 0 l 68 271 l 543 475 l 68 678 l 68 949 l 814 610 l 814 339 z "},"?":{"ha":781,"x_min":68,"x_max":778,"o":"m 168 610 l 405 610 q 473 638 473 610 q 405 678 473 678 l 68 678 l 68 949 l 371 949 q 778 638 778 949 q 439 409 778 427 l 439 339 l 168 339 l 168 610 m 439 0 l 168 0 l 168 271 l 439 271 l 439 0 z "},"@":{"ha":949,"x_min":0,"x_max":956,"o":"m 488 288 q 352 243 435 243 q 239 288 275 243 q 213 365 213 319 q 218 409 213 385 q 345 625 243 531 q 566 719 447 719 q 733 667 627 719 q 644 469 657 507 q 625 404 631 431 q 623 388 623 395 q 632 374 623 374 q 728 437 682 374 q 792 587 774 500 q 804 663 804 629 q 769 757 804 722 q 614 813 713 813 q 328 694 456 813 q 163 395 201 576 q 155 323 155 357 q 190 206 155 254 q 350 135 242 135 q 467 155 407 135 q 581 222 528 174 l 643 111 q 478 28 570 57 q 309 0 387 0 q 58 106 141 0 q 0 286 0 180 q 11 382 0 331 q 244 786 62 624 q 655 948 426 948 q 900 857 820 948 q 956 695 956 792 q 946 607 956 654 q 818 358 916 467 q 597 250 720 250 q 488 288 514 250 m 537 601 q 441 543 490 601 q 377 416 392 484 q 375 397 375 406 q 398 372 375 372 q 459 399 430 372 q 508 473 488 426 q 556 595 527 519 q 537 601 551 601 z "},"A":{"ha":780,"x_min":-197,"x_max":882,"o":"m 407 1289 l 882 0 l 291 0 l 394 271 l 519 271 l 407 610 l 68 -271 l -197 -271 l 253 903 l 407 1289 z "},"B":{"ha":882,"x_min":-68,"x_max":882,"o":"m 407 610 l 475 610 q 543 661 543 610 q 475 712 543 712 l 340 712 l 340 271 l 543 271 q 611 339 611 271 q 543 407 611 407 l 407 407 l 407 610 m 475 949 q 764 814 679 949 q 802 690 802 752 q 747 543 802 616 q 882 339 882 475 q 543 0 882 0 l 68 0 l 68 814 l -68 949 l 475 949 z "},"C":{"ha":814,"x_min":0,"x_max":746,"o":"m 475 949 l 746 949 l 746 678 l 475 678 q 331 618 391 678 q 271 475 271 559 q 331 331 271 391 q 475 271 391 271 l 746 271 l 746 0 l 475 0 q 139 139 278 0 q 0 475 0 278 q 139 810 0 671 q 475 949 278 949 z "},"D":{"ha":882,"x_min":1,"x_max":882,"o":"m 340 271 l 408 271 q 551 331 492 271 q 611 475 611 391 q 551 618 611 559 q 408 678 492 678 l 340 678 l 340 271 m 408 949 q 743 810 604 949 q 882 475 882 671 q 743 139 882 278 q 408 0 604 0 l 68 0 l 68 882 l 1 949 l 408 949 z "},"E":{"ha":814,"x_min":-68,"x_max":746,"o":"m 407 610 l 746 610 l 746 339 l 407 339 l 407 610 m 746 949 l 746 678 l 340 678 l 340 271 l 746 271 l 746 0 l 68 0 l 68 814 l -68 949 l 746 949 z "},"F":{"ha":814,"x_min":-68,"x_max":746,"o":"m 407 610 l 746 610 l 746 339 l 407 339 l 407 610 m 746 949 l 746 678 l 340 678 l 339 -271 l 68 -271 l 68 814 l -68 949 l 746 949 z "},"G":{"ha":814,"x_min":0,"x_max":746,"o":"m 475 271 l 475 610 l 746 610 l 746 -271 l 475 -271 l 475 0 q 139 139 278 0 q 0 475 0 278 q 139 810 0 671 q 475 949 278 949 l 746 949 l 746 678 l 475 678 q 331 618 391 678 q 271 475 271 559 q 331 331 271 391 q 475 271 391 271 z "},"H":{"ha":1017,"x_min":-68,"x_max":950,"o":"m 950 949 l 950 0 l 679 0 l 679 339 l 340 339 l 340 0 l 68 0 l 68 814 l -68 949 l 340 949 l 340 610 l 679 610 l 678 814 l 543 949 l 950 949 z "},"I":{"ha":407,"x_min":68,"x_max":340,"o":"m 340 949 l 340 0 l 68 0 l 68 949 l 340 949 z "},"J":{"ha":543,"x_min":0,"x_max":473,"o":"m 473 949 l 473 475 q 0 0 473 0 l 0 271 l 66 271 q 201 475 201 271 l 201 804 l 68 949 l 473 949 z "},"K":{"ha":949,"x_min":-68,"x_max":1086,"o":"m 340 949 l 340 509 l 641 949 l 950 949 l 610 434 l 1086 -271 l 781 -271 l 340 351 l 340 0 l 68 0 l 68 813 l -68 949 l 340 949 z "},"L":{"ha":610,"x_min":-68,"x_max":610,"o":"m 340 949 l 340 271 l 610 271 l 610 0 l 68 0 l 68 814 l -68 949 l 340 949 z "},"M":{"ha":1221,"x_min":68,"x_max":1154,"o":"m 68 1103 l 610 339 l 1153 1085 l 1154 0 l 882 0 l 882 271 l 611 -136 l 339 271 l 340 0 l 68 0 l 68 882 l 68 1103 z "},"N":{"ha":1017,"x_min":68,"x_max":949,"o":"m 949 949 l 949 -136 l 339 407 l 339 0 l 68 0 l 68 1085 l 678 509 l 678 814 l 543 949 l 949 949 z "},"O":{"ha":949,"x_min":0,"x_max":949,"o":"m 475 0 q 139 139 278 0 q 0 475 0 278 q 139 810 0 671 q 475 949 278 949 q 810 810 671 949 q 949 475 949 671 q 810 139 949 278 q 475 0 671 0 m 475 271 q 618 331 559 271 q 678 475 678 391 q 618 618 678 559 q 475 678 559 678 q 331 618 391 678 q 271 475 271 559 q 331 331 271 391 q 475 271 391 271 z "},"P":{"ha":882,"x_min":-68,"x_max":881,"o":"m 542 949 q 881 610 881 949 q 542 271 881 271 l 406 271 l 406 543 l 542 543 q 610 610 610 543 q 542 678 610 678 l 338 678 l 339 -271 l 68 -271 l 67 814 l -68 949 l 542 949 z "},"Q":{"ha":949,"x_min":0,"x_max":1153,"o":"m 618 331 q 648 361 618 331 q 678 475 678 391 q 618 618 678 559 q 475 678 559 678 q 331 618 391 678 q 271 475 271 559 q 331 331 271 391 q 475 271 391 271 q 618 331 559 271 m 650 32 q 475 0 569 0 q 139 139 278 0 q 0 475 0 278 q 139 810 0 671 q 475 949 278 949 q 810 810 671 949 q 949 475 949 671 q 861 197 949 318 l 1153 -271 l 846 -271 l 650 32 z "},"R":{"ha":882,"x_min":-68,"x_max":1084,"o":"m 542 949 q 881 610 881 949 q 745 304 881 339 l 1084 -271 l 782 -271 l 406 300 l 405 543 l 542 543 q 610 610 610 543 q 542 678 610 678 l 338 678 l 338 0 l 67 0 l 67 814 l -68 949 l 542 949 z "},"S":{"ha":814,"x_min":-1,"x_max":813,"o":"m 338 339 q -1 647 -1 339 q 338 949 -1 949 l 678 949 l 679 678 l 338 678 q 271 647 271 678 q 338 610 271 610 l 474 610 q 813 308 813 610 q 474 0 813 0 l 56 0 l 56 271 l 474 271 q 542 308 542 271 q 474 339 542 339 l 338 339 z "},"T":{"ha":678,"x_min":-3,"x_max":678,"o":"m -3 949 l 678 949 l 678 678 l 475 678 l 475 -271 l 203 -271 l 203 678 l 0 678 l -3 949 z "},"U":{"ha":949,"x_min":-68,"x_max":882,"o":"m 339 949 l 339 475 q 475 271 339 271 q 610 475 610 271 l 610 814 l 475 949 l 882 949 l 882 475 q 475 0 882 0 q 68 475 68 0 l 68 814 l -68 949 l 339 949 z "},"V":{"ha":882,"x_min":-35,"x_max":920,"o":"m 920 949 l 446 -271 l -35 949 l 242 949 l 446 407 l 620 872 l 543 949 l 920 949 z "},"W":{"ha":1289,"x_min":-30,"x_max":1329,"o":"m 1329 949 l 893 -271 l 647 300 l 407 -271 l -30 949 l 244 949 l 448 407 l 651 1017 l 854 407 l 1028 871 l 949 949 l 1329 949 z "},"X":{"ha":867,"x_min":-32,"x_max":918,"o":"m 291 475 l -32 949 l 275 949 l 441 703 l 610 949 l 918 949 l 599 473 l 918 0 l 616 0 l 439 245 l 278 0 l -32 0 l 291 475 z "},"Y":{"ha":832,"x_min":-68,"x_max":882,"o":"m 269 441 l -68 949 l 239 949 l 405 703 l 574 949 l 882 949 l 541 441 l 541 -271 l 269 -271 l 269 441 z "},"Z":{"ha":882,"x_min":-64,"x_max":954,"o":"m 814 0 l -64 0 l 445 678 l 132 678 l 136 949 l 954 949 l 479 271 l 814 271 l 814 0 z "},"[":{"ha":543,"x_min":68,"x_max":543,"o":"m 543 1085 l 543 814 l 339 814 l 339 136 l 543 136 l 543 -136 l 68 -136 l 68 1085 l 543 1085 z "},"\\":{"ha":949,"x_min":34,"x_max":926,"o":"m 309 1085 l 926 -136 l 642 -136 l 34 1085 l 309 1085 z "},"]":{"ha":543,"x_min":68,"x_max":543,"o":"m 543 1085 l 543 -136 l 68 -136 l 68 136 l 271 136 l 271 814 l 68 814 l 68 1085 l 543 1085 z "},"^":{"ha":746,"x_min":34,"x_max":712,"o":"m 576 949 l 712 610 l 441 610 l 373 780 l 305 610 l 34 610 l 170 949 l 576 949 z "},"_":{"ha":882,"x_min":68,"x_max":814,"o":"m 814 271 l 814 0 l 68 0 l 68 271 l 814 271 z "},"`":{"ha":475,"x_min":34,"x_max":441,"o":"m 34 1356 l 305 1356 l 441 1017 l 170 1017 l 34 1356 z "},"a":{"ha":780,"x_min":-197,"x_max":882,"o":"m 407 1289 l 882 0 l 291 0 l 394 271 l 519 271 l 407 610 l 68 -271 l -197 -271 l 253 903 l 407 1289 z "},"b":{"ha":882,"x_min":-68,"x_max":882,"o":"m 407 610 l 475 610 q 543 661 543 610 q 475 712 543 712 l 340 712 l 340 271 l 543 271 q 611 339 611 271 q 543 407 611 407 l 407 407 l 407 610 m 475 949 q 764 814 679 949 q 802 690 802 752 q 747 543 802 616 q 882 339 882 475 q 543 0 882 0 l 68 0 l 68 814 l -68 949 l 475 949 z "},"c":{"ha":814,"x_min":0,"x_max":746,"o":"m 475 949 l 746 949 l 746 678 l 475 678 q 331 618 391 678 q 271 475 271 559 q 331 331 271 391 q 475 271 391 271 l 746 271 l 746 0 l 475 0 q 139 139 278 0 q 0 475 0 278 q 139 810 0 671 q 475 949 278 949 z "},"d":{"ha":882,"x_min":1,"x_max":882,"o":"m 340 271 l 408 271 q 551 331 492 271 q 611 475 611 391 q 551 618 611 559 q 408 678 492 678 l 340 678 l 340 271 m 408 949 q 743 810 604 949 q 882 475 882 671 q 743 139 882 278 q 408 0 604 0 l 68 0 l 68 882 l 1 949 l 408 949 z "},"e":{"ha":814,"x_min":-68,"x_max":746,"o":"m 407 610 l 746 610 l 746 339 l 407 339 l 407 610 m 746 949 l 746 678 l 340 678 l 340 271 l 746 271 l 746 0 l 68 0 l 68 814 l -68 949 l 746 949 z "},"f":{"ha":814,"x_min":-68,"x_max":746,"o":"m 407 610 l 746 610 l 746 339 l 407 339 l 407 610 m 746 949 l 746 678 l 340 678 l 339 -271 l 68 -271 l 68 814 l -68 949 l 746 949 z "},"g":{"ha":814,"x_min":0,"x_max":746,"o":"m 475 271 l 475 610 l 746 610 l 746 -271 l 475 -271 l 475 0 q 139 139 278 0 q 0 475 0 278 q 139 810 0 671 q 475 949 278 949 l 746 949 l 746 678 l 475 678 q 331 618 391 678 q 271 475 271 559 q 331 331 271 391 q 475 271 391 271 z "},"h":{"ha":1017,"x_min":-68,"x_max":950,"o":"m 950 949 l 950 0 l 679 0 l 679 339 l 340 339 l 340 0 l 68 0 l 68 814 l -68 949 l 340 949 l 340 610 l 679 610 l 678 814 l 543 949 l 950 949 z "},"i":{"ha":407,"x_min":68,"x_max":340,"o":"m 340 949 l 340 0 l 68 0 l 68 949 l 340 949 z "},"j":{"ha":543,"x_min":0,"x_max":473,"o":"m 473 949 l 473 475 q 0 0 473 0 l 0 271 l 66 271 q 201 475 201 271 l 201 804 l 68 949 l 473 949 z "},"k":{"ha":949,"x_min":-68,"x_max":1086,"o":"m 340 949 l 340 509 l 641 949 l 950 949 l 610 434 l 1086 -271 l 781 -271 l 340 351 l 340 0 l 68 0 l 68 813 l -68 949 l 340 949 z "},"l":{"ha":610,"x_min":-68,"x_max":610,"o":"m 340 949 l 340 271 l 610 271 l 610 0 l 68 0 l 68 814 l -68 949 l 340 949 z "},"m":{"ha":1221,"x_min":68,"x_max":1154,"o":"m 68 1103 l 610 339 l 1153 1085 l 1154 0 l 882 0 l 882 271 l 611 -136 l 339 271 l 340 0 l 68 0 l 68 882 l 68 1103 z "},"n":{"ha":1017,"x_min":68,"x_max":949,"o":"m 949 949 l 949 -136 l 339 407 l 339 0 l 68 0 l 68 1085 l 678 509 l 678 814 l 543 949 l 949 949 z "},"o":{"ha":949,"x_min":0,"x_max":949,"o":"m 475 0 q 139 139 278 0 q 0 475 0 278 q 139 810 0 671 q 475 949 278 949 q 810 810 671 949 q 949 475 949 671 q 810 139 949 278 q 475 0 671 0 m 475 271 q 618 331 559 271 q 678 475 678 391 q 618 618 678 559 q 475 678 559 678 q 331 618 391 678 q 271 475 271 559 q 331 331 271 391 q 475 271 391 271 z "},"p":{"ha":882,"x_min":-68,"x_max":881,"o":"m 542 949 q 881 610 881 949 q 542 271 881 271 l 406 271 l 406 543 l 542 543 q 610 610 610 543 q 542 678 610 678 l 338 678 l 339 -271 l 68 -271 l 67 814 l -68 949 l 542 949 z "},"q":{"ha":949,"x_min":0,"x_max":1153,"o":"m 618 331 q 648 361 618 331 q 678 475 678 391 q 618 618 678 559 q 475 678 559 678 q 331 618 391 678 q 271 475 271 559 q 331 331 271 391 q 475 271 391 271 q 618 331 559 271 m 650 32 q 475 0 569 0 q 139 139 278 0 q 0 475 0 278 q 139 810 0 671 q 475 949 278 949 q 810 810 671 949 q 949 475 949 671 q 861 197 949 318 l 1153 -271 l 846 -271 l 650 32 z "},"r":{"ha":882,"x_min":-68,"x_max":1084,"o":"m 907 29 l 1084 -271 l 782 -271 l 585 28 l 907 29 m 585 28 l 406 300 l 405 543 l 542 543 q 610 610 610 543 q 542 678 610 678 l 338 678 l 338 0 l 67 0 l 67 814 l -68 949 l 542 949 q 881 610 881 949 q 745 304 881 339 l 907 29 l 585 28 z "},"s":{"ha":814,"x_min":-1,"x_max":813,"o":"m 338 339 q -1 647 -1 339 q 338 949 -1 949 l 678 949 l 679 678 l 338 678 q 271 647 271 678 q 338 610 271 610 l 474 610 q 813 308 813 610 q 474 0 813 0 l 56 0 l 56 271 l 474 271 q 542 308 542 271 q 474 339 542 339 l 338 339 z "},"t":{"ha":678,"x_min":-3,"x_max":678,"o":"m -3 949 l 678 949 l 678 678 l 475 678 l 475 -271 l 203 -271 l 203 678 l 0 678 l -3 949 z "},"u":{"ha":949,"x_min":-68,"x_max":882,"o":"m 339 949 l 339 475 q 475 271 339 271 q 610 475 610 271 l 610 814 l 475 949 l 882 949 l 882 475 q 475 0 882 0 q 68 475 68 0 l 68 814 l -68 949 l 339 949 z "},"v":{"ha":882,"x_min":-35,"x_max":920,"o":"m 920 949 l 446 -271 l -35 949 l 242 949 l 446 407 l 620 872 l 543 949 l 920 949 z "},"w":{"ha":1289,"x_min":-30,"x_max":1329,"o":"m 1329 949 l 893 -271 l 647 300 l 407 -271 l -30 949 l 244 949 l 448 407 l 651 1017 l 854 407 l 1028 871 l 949 949 l 1329 949 z "},"x":{"ha":867,"x_min":-32,"x_max":918,"o":"m 291 475 l -32 949 l 275 949 l 441 703 l 610 949 l 918 949 l 599 473 l 918 0 l 616 0 l 439 245 l 278 0 l -32 0 l 291 475 z "},"y":{"ha":832,"x_min":-68,"x_max":882,"o":"m 269 441 l -68 949 l 239 949 l 405 703 l 574 949 l 882 949 l 541 441 l 541 -271 l 269 -271 l 269 441 z "},"z":{"ha":882,"x_min":-64,"x_max":954,"o":"m 814 0 l -64 0 l 445 678 l 132 678 l 136 949 l 954 949 l 479 271 l 814 271 l 814 0 z "},"{":{"ha":678,"x_min":68,"x_max":678,"o":"m 203 610 q 678 1085 203 1085 l 678 814 q 475 610 475 814 l 475 339 q 678 136 475 136 l 678 -136 q 203 339 203 -136 l 68 339 l 68 610 l 203 610 z "},"|":{"ha":407,"x_min":68,"x_max":339,"o":"m 339 1085 l 339 -136 l 68 -136 l 68 1085 l 339 1085 z "},"}":{"ha":678,"x_min":68,"x_max":678,"o":"m 543 339 q 68 -136 543 -136 l 68 136 q 271 339 271 136 l 271 610 q 68 814 271 814 l 68 1085 q 543 610 543 1085 l 678 610 l 678 339 l 543 339 z "},"~":{"ha":746,"x_min":68,"x_max":746,"o":"m 68 294 l 68 565 q 254 599 170 599 q 407 565 339 599 q 505 543 452 543 q 746 633 610 543 l 746 361 q 505 271 610 271 q 407 294 452 271 q 254 328 339 328 q 68 294 170 328 z "},"¡":{"ha":407,"x_min":34,"x_max":373,"o":"m 339 610 l 373 0 l 34 0 l 68 610 l 339 610 m 339 678 l 68 678 l 68 949 l 339 949 l 339 678 z "},"¢":{"ha":968,"x_min":68,"x_max":968,"o":"m 475 945 l 475 1085 l 610 1085 l 610 945 q 878 810 764 925 q 968 689 935 754 l 726 564 q 686 618 711 593 q 543 678 627 678 q 399 618 458 678 q 339 475 339 559 q 399 331 339 391 q 543 271 458 271 q 686 331 627 271 q 715 367 703 348 l 945 221 q 878 139 917 178 q 610 4 764 24 l 610 -136 l 475 -136 l 475 4 q 207 139 321 24 q 68 475 68 278 q 207 810 68 671 q 475 945 321 925 z "},"£":{"ha":882,"x_min":68,"x_max":882,"o":"m 656 610 l 655 610 q 543 678 621 678 q 431 610 465 678 l 610 610 l 610 339 l 407 339 l 407 270 l 882 270 l 882 0 l 136 0 l 136 339 l 68 339 l 68 610 l 145 610 q 543 949 199 949 q 844 836 741 949 l 712 678 l 656 610 z "},"¤":{"ha":916,"x_min":34,"x_max":882,"o":"m 576 374 q 600 398 576 374 q 625 492 625 422 q 576 610 625 561 q 458 659 527 659 q 340 610 389 659 q 291 492 291 561 q 340 374 291 422 q 458 325 389 325 q 576 374 527 325 m 258 156 l 140 8 l 34 93 l 155 245 q 68 492 68 351 q 145 726 68 625 l 34 865 l 140 949 l 244 819 q 458 882 338 882 q 671 819 578 882 l 776 949 l 882 865 l 770 726 q 848 492 848 625 q 760 245 848 351 l 882 93 l 776 8 l 658 156 q 458 102 569 102 q 258 156 347 102 z "},"¥":{"ha":1017,"x_min":34,"x_max":983,"o":"m 373 203 l 373 271 l 203 271 l 203 407 l 373 407 l 34 949 l 323 949 l 509 678 l 694 949 l 983 949 l 644 407 l 814 407 l 814 271 l 644 271 l 644 203 l 814 203 l 814 68 l 644 68 l 644 0 l 373 0 l 373 68 l 203 68 l 203 203 l 373 203 z "},"¦":{"ha":407,"x_min":68,"x_max":339,"o":"m 68 509 l 68 1085 l 339 1085 l 339 509 l 68 509 m 339 441 l 339 -136 l 68 -136 l 68 441 l 339 441 z "},"§":{"ha":814,"x_min":-1,"x_max":813,"o":"m 338 339 q -1 647 -1 339 q 338 949 -1 949 l 678 949 l 679 678 l 338 678 q 271 647 271 678 q 338 610 271 610 l 474 610 q 813 308 813 610 q 474 0 813 0 l 56 0 l 56 271 l 474 271 q 542 308 542 271 q 474 339 542 339 l 338 339 z "},"¨":{"ha":678,"x_min":34,"x_max":644,"o":"m 305 1017 l 34 1017 l 34 1289 l 305 1289 l 305 1017 m 644 1017 l 373 1017 l 373 1289 l 644 1289 l 644 1017 z "},"©":{"ha":926,"x_min":-7,"x_max":942,"o":"m 467 0 q 132 139 271 0 q -7 475 -7 278 q 132 810 -7 671 q 467 949 271 949 q 803 810 664 949 q 942 475 942 671 q 803 139 942 278 q 467 0 664 0 m 469 136 q 708 234 609 136 q 806 473 806 333 q 708 712 806 613 q 469 810 609 810 q 230 712 329 810 q 132 473 132 613 q 230 234 132 333 q 469 136 329 136 m 484 712 l 603 712 l 620 576 l 484 576 q 412 547 442 576 q 382 475 382 517 q 412 403 382 433 q 484 373 442 373 l 603 373 l 620 237 l 484 237 q 316 307 386 237 q 247 475 247 376 q 316 643 247 573 q 484 712 386 712 z "},"«":{"ha":1526,"x_min":34,"x_max":1492,"o":"m 34 610 l 780 949 l 780 678 l 305 475 l 780 271 l 780 0 l 34 339 l 34 610 m 746 610 l 1492 949 l 1492 678 l 1017 475 l 1492 271 l 1492 0 l 746 339 l 746 610 z "},"®":{"ha":1017,"x_min":34,"x_max":983,"o":"m 509 0 q 173 139 312 0 q 34 475 34 278 q 173 810 34 671 q 509 949 312 949 q 844 810 705 949 q 983 475 983 671 q 844 139 983 278 q 509 0 705 0 m 511 136 q 749 234 650 136 q 848 473 848 333 q 749 712 848 613 q 511 810 650 810 q 272 712 370 810 q 173 473 173 613 q 272 234 173 333 q 511 136 370 136 m 457 577 l 457 509 l 559 509 q 593 543 593 509 q 559 577 593 577 l 457 577 m 479 373 l 457 373 l 457 237 l 321 237 l 321 713 l 559 713 q 729 543 729 713 q 626 381 729 410 l 729 237 l 576 237 l 479 373 z "},"¯":{"ha":610,"x_min":34,"x_max":576,"o":"m 576 1289 l 576 1017 l 34 1017 l 34 1289 l 576 1289 z "},"°":{"ha":339,"x_min":34,"x_max":305,"o":"m 305 1017 l 34 1017 l 34 1289 l 305 1289 l 305 1017 z "},"±":{"ha":746,"x_min":34,"x_max":712,"o":"m 509 610 l 712 610 l 712 339 l 509 339 l 509 136 l 237 136 l 237 339 l 34 339 l 34 610 l 237 610 l 237 814 l 509 814 l 509 610 m 712 -203 l 34 -203 l 34 68 l 712 68 l 712 -203 z "},"´":{"ha":475,"x_min":34,"x_max":441,"o":"m 305 1017 l 34 1017 l 170 1356 l 441 1356 l 305 1017 z "},"µ":{"ha":882,"x_min":34,"x_max":848,"o":"m 305 475 q 441 271 305 271 q 576 475 576 271 l 576 949 l 848 949 l 848 475 q 441 0 848 0 q 305 16 366 0 l 305 -203 l 34 -203 l 34 949 l 305 949 l 305 475 z "},"¶":{"ha":882,"x_min":34,"x_max":848,"o":"m 848 949 l 848 678 l 780 678 l 780 -203 l 509 -203 l 509 678 l 373 678 l 373 -203 l 102 -203 l 102 441 l 34 441 l 34 949 l 848 949 z "},"»":{"ha":1526,"x_min":34,"x_max":1492,"o":"m 1492 610 l 1492 339 l 746 0 l 746 271 l 1221 475 l 746 678 l 746 949 l 1492 610 m 780 610 l 780 339 l 34 0 l 34 271 l 509 475 l 34 678 l 34 949 l 780 610 z "},"¼":{"ha":1085,"x_min":34,"x_max":1051,"o":"m 271 947 l 271 475 l 136 475 l 136 812 l 102 812 l 119 947 l 271 947 m 916 949 l 340 0 l 34 0 l 612 949 l 916 949 m 983 170 l 983 0 l 848 0 l 848 170 l 610 170 l 678 475 l 814 475 l 780 305 l 848 305 l 848 475 l 983 475 l 983 305 l 1034 305 l 1051 170 l 983 170 z "},"½":{"ha":1085,"x_min":34,"x_max":1051,"o":"m 271 947 l 271 475 l 136 475 l 136 812 l 102 812 l 119 947 l 271 947 m 916 949 l 340 0 l 34 0 l 612 949 l 916 949 m 848 475 q 1051 319 1051 475 q 848 170 1051 170 q 780 156 780 170 l 780 136 l 1034 136 l 1051 0 l 644 0 l 644 156 q 848 305 644 305 l 882 305 q 916 319 916 305 q 882 339 916 339 l 678 339 l 661 475 l 848 475 z "},"¾":{"ha":1153,"x_min":34,"x_max":1119,"o":"m 983 949 l 408 0 l 102 0 l 680 949 l 983 949 m 1051 170 l 1051 0 l 916 0 l 916 170 l 678 170 l 746 475 l 882 475 l 848 305 l 916 305 l 916 475 l 1051 475 l 1051 305 l 1102 305 l 1119 170 l 1051 170 m 136 643 l 136 779 l 238 779 q 273 796 273 779 q 238 813 273 813 l 51 813 l 34 949 l 238 949 q 408 796 408 949 q 374 711 408 741 q 408 626 408 682 q 238 473 408 473 l 51 473 l 34 609 l 238 609 q 273 626 273 609 q 238 643 273 643 l 136 643 z "},"¿":{"ha":882,"x_min":68,"x_max":814,"o":"m 203 339 l 203 610 l 475 610 l 475 541 q 814 311 814 522 q 407 0 814 0 l 68 0 l 68 271 l 441 271 q 509 311 509 271 q 441 339 509 339 l 203 339 m 475 949 l 475 678 l 203 678 l 203 949 l 475 949 z "},"À":{"ha":780,"x_min":-197,"x_max":882,"o":"m 452 1165 l 882 0 l 291 0 l 394 271 l 519 271 l 407 610 l 68 -271 l -197 -271 l 253 903 l 357 1165 l 314 1165 l 246 1369 l 450 1369 l 517 1165 l 452 1165 z "},"Á":{"ha":780,"x_min":-197,"x_max":882,"o":"m 457 1153 l 882 0 l 291 0 l 394 271 l 519 271 l 407 610 l 68 -271 l -197 -271 l 253 903 l 353 1153 l 293 1153 l 361 1356 l 564 1356 l 496 1153 l 457 1153 z "},"Â":{"ha":780,"x_min":-197,"x_max":882,"o":"m 482 1085 l 882 0 l 291 0 l 394 271 l 519 271 l 407 610 l 68 -271 l -197 -271 l 253 903 l 326 1085 l 136 1085 l 407 1356 l 678 1085 l 482 1085 z "},"Ã":{"ha":780,"x_min":-197,"x_max":882,"o":"m 465 1132 l 882 0 l 291 0 l 394 271 l 519 271 l 407 610 l 68 -271 l -197 -271 l 253 903 l 358 1167 q 285 1176 324 1176 q 136 1149 217 1176 l 136 1369 q 285 1396 217 1396 q 407 1369 353 1396 q 486 1351 444 1351 q 678 1424 570 1351 l 678 1204 q 486 1131 570 1131 q 465 1132 475 1131 z "},"Ä":{"ha":780,"x_min":-197,"x_max":882,"o":"m 407 1289 l 882 0 l 291 0 l 394 271 l 519 271 l 407 610 l 68 -271 l -197 -271 l 253 903 l 407 1289 m 237 1153 q 165 1183 195 1153 q 136 1255 136 1213 q 165 1326 136 1297 q 237 1356 195 1356 q 309 1326 279 1356 q 339 1255 339 1297 q 309 1183 339 1213 q 237 1153 279 1153 m 576 1153 q 505 1183 534 1153 q 475 1255 475 1213 q 505 1326 475 1297 q 576 1356 534 1356 q 648 1326 618 1356 q 678 1255 678 1297 q 648 1183 678 1213 q 576 1153 618 1153 z "},"Å":{"ha":780,"x_min":-197,"x_max":882,"o":"m 407 1121 q 455 1141 435 1121 q 475 1189 475 1161 q 455 1237 475 1217 q 407 1257 435 1257 q 359 1237 379 1257 q 339 1189 339 1217 q 359 1141 339 1161 q 407 1121 379 1121 m 497 1043 l 882 0 l 291 0 l 394 271 l 519 271 l 407 610 l 68 -271 l -197 -271 l 253 903 l 311 1047 q 287 1067 298 1055 q 237 1187 237 1116 q 287 1307 237 1257 q 407 1356 336 1356 q 527 1307 477 1356 q 576 1187 576 1257 q 527 1067 576 1116 q 497 1043 513 1053 z "},"Æ":{"ha":1289,"x_min":-197,"x_max":1221,"o":"m 514 949 l 1221 949 l 1221 678 l 814 678 l 814 271 l 1221 271 l 1221 0 l 291 0 l 394 271 l 519 271 l 407 610 l 68 -271 l -197 -271 l 253 903 l 407 1289 l 514 949 m 882 610 l 1221 610 l 1221 339 l 882 339 l 882 610 z "},"Ç":{"ha":814,"x_min":0,"x_max":746,"o":"m 441 1 q 139 139 266 12 q 0 475 0 278 q 139 810 0 671 q 475 949 278 949 l 746 949 l 746 678 l 475 678 q 331 618 391 678 q 271 475 271 559 q 331 331 271 391 q 475 271 391 271 l 746 271 l 746 0 l 509 0 l 509 -24 q 644 -126 644 -24 q 509 -228 644 -228 l 407 -228 l 407 -160 l 475 -160 q 559 -143 543 -160 q 568 -126 568 -134 q 555 -105 568 -117 q 441 -92 543 -92 l 441 1 z "},"È":{"ha":814,"x_min":-68,"x_max":746,"o":"m 407 610 l 746 610 l 746 339 l 407 339 l 407 610 m 746 949 l 746 678 l 340 678 l 340 271 l 746 271 l 746 0 l 68 0 l 68 814 l -68 949 l 746 949 m 305 1017 l 237 1221 l 441 1221 l 509 1017 l 305 1017 z "},"É":{"ha":814,"x_min":-68,"x_max":746,"o":"m 407 610 l 746 610 l 746 339 l 407 339 l 407 610 m 746 949 l 746 678 l 340 678 l 340 271 l 746 271 l 746 0 l 68 0 l 68 814 l -68 949 l 746 949 m 509 1017 l 305 1017 l 373 1221 l 576 1221 l 509 1017 z "},"Ê":{"ha":814,"x_min":-68,"x_max":746,"o":"m 407 610 l 746 610 l 746 339 l 407 339 l 407 610 m 746 949 l 746 678 l 340 678 l 340 271 l 746 271 l 746 0 l 68 0 l 68 814 l -68 949 l 746 949 m 407 1289 l 678 1017 l 475 1017 l 407 1085 l 339 1017 l 136 1017 l 407 1289 z "},"Ë":{"ha":814,"x_min":-68,"x_max":746,"o":"m 407 610 l 746 610 l 746 339 l 407 339 l 407 610 m 746 949 l 746 678 l 340 678 l 340 271 l 746 271 l 746 0 l 68 0 l 68 814 l -68 949 l 746 949 m 274 1017 q 202 1047 232 1017 q 172 1119 172 1077 q 202 1191 172 1161 q 274 1221 232 1221 q 346 1191 316 1221 q 376 1119 376 1161 q 346 1047 376 1077 q 274 1017 316 1017 m 545 1017 q 473 1047 503 1017 q 444 1119 444 1077 q 473 1191 444 1161 q 545 1221 503 1221 q 617 1191 587 1221 q 647 1119 647 1161 q 617 1047 647 1077 q 545 1017 587 1017 z "},"Ì":{"ha":407,"x_min":68,"x_max":340,"o":"m 340 949 l 340 0 l 68 0 l 68 949 l 340 949 m 136 1017 l 68 1221 l 271 1221 l 339 1017 l 136 1017 z "},"Í":{"ha":407,"x_min":68,"x_max":340,"o":"m 340 949 l 340 0 l 68 0 l 68 949 l 340 949 m 271 1017 l 68 1017 l 136 1221 l 339 1221 l 271 1017 z "},"Î":{"ha":407,"x_min":-68,"x_max":475,"o":"m 340 949 l 340 0 l 68 0 l 68 949 l 340 949 m 203 1289 l 475 1017 l 271 1017 l 203 1085 l 136 1017 l -68 1017 l 203 1289 z "},"Ï":{"ha":407,"x_min":-35,"x_max":440,"o":"m 340 949 l 340 0 l 68 0 l 68 949 l 340 949 m 67 1017 q -5 1047 25 1017 q -35 1119 -35 1077 q -5 1191 -35 1161 q 67 1221 25 1221 q 139 1191 109 1221 q 169 1119 169 1161 q 139 1047 169 1077 q 67 1017 109 1017 m 338 1017 q 267 1047 296 1017 q 237 1119 237 1077 q 267 1191 237 1161 q 338 1221 296 1221 q 410 1191 380 1221 q 440 1119 440 1161 q 410 1047 440 1077 q 338 1017 380 1017 z "},"Ð":{"ha":882,"x_min":-68,"x_max":882,"o":"m 68 543 l 68 882 l 1 949 l 408 949 q 743 810 604 949 q 882 475 882 671 q 743 139 882 278 q 408 0 604 0 l 68 0 l 68 407 l -68 407 l -68 543 l 68 543 m 340 543 l 475 543 l 475 407 l 340 407 l 340 271 l 408 271 q 551 331 492 271 q 611 475 611 391 q 551 618 611 559 q 408 678 492 678 l 340 678 l 340 543 z "},"Ñ":{"ha":1017,"x_min":68,"x_max":949,"o":"m 949 949 l 949 -136 l 339 407 l 339 0 l 68 0 l 68 1085 l 678 509 l 678 814 l 543 949 l 949 949 m 235 1036 l 235 1256 q 384 1283 316 1283 q 506 1256 452 1283 q 585 1238 543 1238 q 777 1311 669 1238 l 777 1090 q 585 1017 669 1017 q 506 1036 543 1017 q 384 1063 452 1063 q 235 1036 316 1063 z "},"Ò":{"ha":949,"x_min":0,"x_max":949,"o":"m 475 0 q 139 139 278 0 q 0 475 0 278 q 139 810 0 671 q 475 949 278 949 q 810 810 671 949 q 949 475 949 671 q 810 139 949 278 q 475 0 671 0 m 475 271 q 618 331 559 271 q 678 475 678 391 q 618 618 678 559 q 475 678 559 678 q 331 618 391 678 q 271 475 271 559 q 331 331 271 391 q 475 271 391 271 m 407 1017 l 339 1221 l 543 1221 l 610 1017 l 407 1017 z "},"Ó":{"ha":949,"x_min":0,"x_max":949,"o":"m 475 0 q 139 139 278 0 q 0 475 0 278 q 139 810 0 671 q 475 949 278 949 q 810 810 671 949 q 949 475 949 671 q 810 139 949 278 q 475 0 671 0 m 475 271 q 618 331 559 271 q 678 475 678 391 q 618 618 678 559 q 475 678 559 678 q 331 618 391 678 q 271 475 271 559 q 331 331 271 391 q 475 271 391 271 m 543 1017 l 339 1017 l 407 1221 l 610 1221 l 543 1017 z "},"Ô":{"ha":949,"x_min":0,"x_max":949,"o":"m 475 0 q 139 139 278 0 q 0 475 0 278 q 139 810 0 671 q 475 949 278 949 q 810 810 671 949 q 949 475 949 671 q 810 139 949 278 q 475 0 671 0 m 475 271 q 618 331 559 271 q 678 475 678 391 q 618 618 678 559 q 475 678 559 678 q 331 618 391 678 q 271 475 271 559 q 331 331 271 391 q 475 271 391 271 m 475 1289 l 746 1017 l 543 1017 l 475 1085 l 407 1017 l 203 1017 l 475 1289 z "},"Õ":{"ha":949,"x_min":0,"x_max":949,"o":"m 475 0 q 139 139 278 0 q 0 475 0 278 q 139 810 0 671 q 475 949 278 949 q 810 810 671 949 q 949 475 949 671 q 810 139 949 278 q 475 0 671 0 m 475 271 q 618 331 559 271 q 678 475 678 391 q 618 618 678 559 q 475 678 559 678 q 331 618 391 678 q 271 475 271 559 q 331 331 271 391 q 475 271 391 271 m 203 1013 l 203 1234 q 353 1261 285 1261 q 475 1234 420 1261 q 553 1215 511 1215 q 746 1289 637 1215 l 746 1068 q 553 995 637 995 q 475 1013 511 995 q 353 1040 420 1040 q 203 1013 285 1040 z "},"Ö":{"ha":949,"x_min":0,"x_max":949,"o":"m 618 331 q 648 361 618 331 q 678 475 678 391 q 618 618 678 559 q 475 678 559 678 q 331 618 391 678 q 271 475 271 559 q 331 331 271 391 q 475 271 391 271 q 618 331 559 271 m 475 0 q 139 139 278 0 q 0 475 0 278 q 139 810 0 671 q 475 949 278 949 q 810 810 671 949 q 949 475 949 671 q 810 139 949 278 q 475 0 671 0 m 340 1017 q 269 1047 298 1017 q 239 1119 239 1077 q 269 1191 239 1161 q 340 1221 298 1221 q 412 1191 382 1221 q 442 1119 442 1161 q 412 1047 442 1077 q 340 1017 382 1017 m 612 1017 q 540 1047 570 1017 q 510 1119 510 1077 q 540 1191 510 1161 q 612 1221 570 1221 q 684 1191 654 1221 q 713 1119 713 1161 q 684 1047 713 1077 q 612 1017 654 1017 z "},"×":{"ha":826,"x_min":34,"x_max":792,"o":"m 405 245 l 341 136 l 34 136 l 257 475 l 35 814 l 341 814 l 407 703 l 482 813 l 792 814 l 565 473 l 792 136 l 477 136 l 405 245 z "},"Ø":{"ha":951,"x_min":-3,"x_max":946,"o":"m 435 675 q 328 618 374 665 q 268 475 268 559 q 288 385 268 425 l 435 675 m 514 275 q 615 331 571 287 q 675 475 675 391 q 656 561 675 522 l 514 275 m 789 827 q 807 810 798 819 q 946 475 946 671 q 807 139 946 278 q 471 0 668 0 q 380 8 425 0 l 309 -136 l 26 -136 l 155 121 q 136 139 145 130 q -3 475 -3 278 q 136 810 -3 671 q 471 949 275 949 q 569 940 522 949 l 642 1085 l 918 1085 l 789 827 z "},"Ù":{"ha":949,"x_min":-68,"x_max":882,"o":"m 339 949 l 339 475 q 475 271 339 271 q 610 475 610 271 l 610 814 l 475 949 l 882 949 l 882 475 q 475 0 882 0 q 68 475 68 0 l 68 814 l -68 949 l 339 949 m 339 1017 l 271 1221 l 475 1221 l 543 1017 l 339 1017 z "},"Ú":{"ha":949,"x_min":-68,"x_max":882,"o":"m 339 949 l 339 475 q 475 271 339 271 q 610 475 610 271 l 610 814 l 475 949 l 882 949 l 882 475 q 475 0 882 0 q 68 475 68 0 l 68 814 l -68 949 l 339 949 m 543 1017 l 339 1017 l 407 1221 l 610 1221 l 543 1017 z "},"Û":{"ha":949,"x_min":-68,"x_max":882,"o":"m 339 949 l 339 475 q 475 271 339 271 q 610 475 610 271 l 610 814 l 475 949 l 882 949 l 882 475 q 475 0 882 0 q 68 475 68 0 l 68 814 l -68 949 l 339 949 m 475 1289 l 746 1017 l 543 1017 l 475 1085 l 407 1017 l 203 1017 l 475 1289 z "},"Ü":{"ha":949,"x_min":-68,"x_max":882,"o":"m 339 949 l 339 475 q 475 271 339 271 q 610 475 610 271 l 610 814 l 475 949 l 882 949 l 882 475 q 475 0 882 0 q 68 475 68 0 l 68 814 l -68 949 l 339 949 m 339 1017 q 267 1047 297 1017 q 237 1119 237 1077 q 267 1191 237 1161 q 339 1221 297 1221 q 411 1191 381 1221 q 441 1119 441 1161 q 411 1047 441 1077 q 339 1017 381 1017 m 610 1017 q 538 1047 568 1017 q 509 1119 509 1077 q 538 1191 509 1161 q 610 1221 568 1221 q 682 1191 652 1221 q 712 1119 712 1161 q 682 1047 712 1077 q 610 1017 652 1017 z "},"Ý":{"ha":832,"x_min":-68,"x_max":882,"o":"m 269 441 l -68 949 l 239 949 l 405 703 l 574 949 l 882 949 l 541 441 l 541 -271 l 269 -271 l 269 441 m 499 1017 l 296 1017 l 363 1221 l 567 1221 l 499 1017 z "},"Þ":{"ha":883,"x_min":73,"x_max":887,"o":"m 345 916 l 548 916 q 887 543 887 916 q 548 170 887 170 l 345 170 l 345 0 l 73 0 l 73 1051 l 345 1051 l 345 916 m 345 441 l 548 441 q 616 543 616 441 q 548 644 616 644 l 345 644 l 345 441 z "},"ß":{"ha":881,"x_min":73,"x_max":887,"o":"m 480 610 q 548 661 548 610 q 480 712 548 712 l 345 712 l 345 610 l 480 610 m 345 0 l 73 0 l 73 949 l 480 949 q 768 814 684 949 q 807 690 807 752 q 751 543 807 616 q 887 339 887 475 q 548 0 887 0 l 412 0 l 412 271 l 548 271 q 616 339 616 271 q 548 407 616 407 l 345 407 l 345 0 z "},"à":{"ha":780,"x_min":-197,"x_max":882,"o":"m 452 1165 l 882 0 l 291 0 l 394 271 l 519 271 l 407 610 l 68 -271 l -197 -271 l 253 903 l 357 1165 l 314 1165 l 246 1369 l 450 1369 l 517 1165 l 452 1165 z "},"á":{"ha":780,"x_min":-197,"x_max":882,"o":"m 457 1153 l 882 0 l 291 0 l 394 271 l 519 271 l 407 610 l 68 -271 l -197 -271 l 253 903 l 353 1153 l 293 1153 l 361 1356 l 564 1356 l 496 1153 l 457 1153 z "},"â":{"ha":780,"x_min":-197,"x_max":882,"o":"m 482 1085 l 882 0 l 291 0 l 394 271 l 519 271 l 407 610 l 68 -271 l -197 -271 l 253 903 l 326 1085 l 136 1085 l 407 1356 l 678 1085 l 482 1085 z "},"ã":{"ha":780,"x_min":-197,"x_max":882,"o":"m 465 1132 l 882 0 l 291 0 l 394 271 l 519 271 l 407 610 l 68 -271 l -197 -271 l 253 903 l 358 1167 q 285 1176 324 1176 q 136 1149 217 1176 l 136 1369 q 285 1396 217 1396 q 407 1369 353 1396 q 486 1351 444 1351 q 678 1424 570 1351 l 678 1204 q 486 1131 570 1131 q 465 1132 475 1131 z "},"ä":{"ha":780,"x_min":-197,"x_max":882,"o":"m 407 1289 l 882 0 l 291 0 l 394 271 l 519 271 l 407 610 l 68 -271 l -197 -271 l 253 903 l 407 1289 m 237 1153 q 165 1183 195 1153 q 136 1255 136 1213 q 165 1326 136 1297 q 237 1356 195 1356 q 309 1326 279 1356 q 339 1255 339 1297 q 309 1183 339 1213 q 237 1153 279 1153 m 576 1153 q 505 1183 534 1153 q 475 1255 475 1213 q 505 1326 475 1297 q 576 1356 534 1356 q 648 1326 618 1356 q 678 1255 678 1297 q 648 1183 678 1213 q 576 1153 618 1153 z "},"å":{"ha":780,"x_min":-197,"x_max":882,"o":"m 407 1121 q 455 1141 435 1121 q 475 1189 475 1161 q 455 1237 475 1217 q 407 1257 435 1257 q 359 1237 379 1257 q 339 1189 339 1217 q 359 1141 339 1161 q 407 1121 379 1121 m 497 1043 l 882 0 l 291 0 l 394 271 l 519 271 l 407 610 l 68 -271 l -197 -271 l 253 903 l 311 1047 q 287 1067 298 1055 q 237 1187 237 1116 q 287 1307 237 1257 q 407 1356 336 1356 q 527 1307 477 1356 q 576 1187 576 1257 q 527 1067 576 1116 q 497 1043 513 1053 z "},"æ":{"ha":1289,"x_min":-197,"x_max":1221,"o":"m 514 949 l 1221 949 l 1221 678 l 814 678 l 814 271 l 1221 271 l 1221 0 l 291 0 l 394 271 l 519 271 l 407 610 l 68 -271 l -197 -271 l 253 903 l 407 1289 l 514 949 m 882 610 l 1221 610 l 1221 339 l 882 339 l 882 610 z "},"ç":{"ha":814,"x_min":0,"x_max":746,"o":"m 441 1 q 139 139 266 12 q 0 475 0 278 q 139 810 0 671 q 475 949 278 949 l 746 949 l 746 678 l 475 678 q 331 618 391 678 q 271 475 271 559 q 331 331 271 391 q 475 271 391 271 l 746 271 l 746 0 l 509 0 l 509 -24 q 644 -126 644 -24 q 509 -228 644 -228 l 407 -228 l 407 -160 l 475 -160 q 559 -143 543 -160 q 568 -126 568 -134 q 555 -105 568 -117 q 441 -92 543 -92 l 441 1 z "},"è":{"ha":814,"x_min":-68,"x_max":746,"o":"m 407 610 l 746 610 l 746 339 l 407 339 l 407 610 m 746 949 l 746 678 l 340 678 l 340 271 l 746 271 l 746 0 l 68 0 l 68 814 l -68 949 l 746 949 m 305 1017 l 237 1221 l 441 1221 l 509 1017 l 305 1017 z "},"é":{"ha":814,"x_min":-68,"x_max":746,"o":"m 407 610 l 746 610 l 746 339 l 407 339 l 407 610 m 746 949 l 746 678 l 340 678 l 340 271 l 746 271 l 746 0 l 68 0 l 68 814 l -68 949 l 746 949 m 509 1017 l 305 1017 l 373 1221 l 576 1221 l 509 1017 z "},"ê":{"ha":814,"x_min":-68,"x_max":746,"o":"m 407 610 l 746 610 l 746 339 l 407 339 l 407 610 m 746 949 l 746 678 l 340 678 l 340 271 l 746 271 l 746 0 l 68 0 l 68 814 l -68 949 l 746 949 m 407 1289 l 678 1017 l 475 1017 l 407 1085 l 339 1017 l 136 1017 l 407 1289 z "},"ë":{"ha":814,"x_min":-68,"x_max":746,"o":"m 407 610 l 746 610 l 746 339 l 407 339 l 407 610 m 746 949 l 746 678 l 340 678 l 340 271 l 746 271 l 746 0 l 68 0 l 68 814 l -68 949 l 746 949 m 274 1017 q 202 1047 232 1017 q 172 1119 172 1077 q 202 1191 172 1161 q 274 1221 232 1221 q 346 1191 316 1221 q 376 1119 376 1161 q 346 1047 376 1077 q 274 1017 316 1017 m 545 1017 q 473 1047 503 1017 q 444 1119 444 1077 q 473 1191 444 1161 q 545 1221 503 1221 q 617 1191 587 1221 q 647 1119 647 1161 q 617 1047 647 1077 q 545 1017 587 1017 z "},"ì":{"ha":407,"x_min":68,"x_max":340,"o":"m 340 949 l 340 0 l 68 0 l 68 949 l 340 949 m 136 1017 l 68 1221 l 271 1221 l 339 1017 l 136 1017 z "},"í":{"ha":407,"x_min":68,"x_max":340,"o":"m 340 949 l 340 0 l 68 0 l 68 949 l 340 949 m 271 1017 l 68 1017 l 136 1221 l 339 1221 l 271 1017 z "},"î":{"ha":407,"x_min":-68,"x_max":475,"o":"m 340 949 l 340 0 l 68 0 l 68 949 l 340 949 m 203 1289 l 475 1017 l 271 1017 l 203 1085 l 136 1017 l -68 1017 l 203 1289 z "},"ï":{"ha":407,"x_min":-35,"x_max":440,"o":"m 340 949 l 340 0 l 68 0 l 68 949 l 340 949 m 67 1017 q -5 1047 25 1017 q -35 1119 -35 1077 q -5 1191 -35 1161 q 67 1221 25 1221 q 139 1191 109 1221 q 169 1119 169 1161 q 139 1047 169 1077 q 67 1017 109 1017 m 338 1017 q 267 1047 296 1017 q 237 1119 237 1077 q 267 1191 237 1161 q 338 1221 296 1221 q 410 1191 380 1221 q 440 1119 440 1161 q 410 1047 440 1077 q 338 1017 380 1017 z "},"ð":{"ha":949,"x_min":0,"x_max":949,"o":"m 678 475 q 618 618 678 559 q 475 678 559 678 q 331 618 391 678 q 271 475 271 559 q 331 331 271 391 q 475 271 391 271 q 618 331 559 271 q 678 475 678 391 m 503 1144 l 834 787 l 833 786 q 949 475 949 654 q 810 139 949 278 q 475 0 671 0 q 139 139 278 0 q 0 475 0 278 q 139 810 0 671 q 337 930 227 898 l 296 976 l 197 897 l 79 1032 l 178 1111 l 115 1178 l 315 1343 l 379 1278 l 473 1352 l 604 1225 l 503 1144 z "},"ñ":{"ha":1017,"x_min":68,"x_max":949,"o":"m 949 949 l 949 -136 l 339 407 l 339 0 l 68 0 l 68 1085 l 678 509 l 678 814 l 543 949 l 949 949 m 235 1036 l 235 1256 q 384 1283 316 1283 q 506 1256 452 1283 q 585 1238 543 1238 q 777 1311 669 1238 l 777 1090 q 585 1017 669 1017 q 506 1036 543 1017 q 384 1063 452 1063 q 235 1036 316 1063 z "},"ò":{"ha":949,"x_min":0,"x_max":949,"o":"m 475 0 q 139 139 278 0 q 0 475 0 278 q 139 810 0 671 q 475 949 278 949 q 810 810 671 949 q 949 475 949 671 q 810 139 949 278 q 475 0 671 0 m 475 271 q 618 331 559 271 q 678 475 678 391 q 618 618 678 559 q 475 678 559 678 q 331 618 391 678 q 271 475 271 559 q 331 331 271 391 q 475 271 391 271 m 407 1017 l 339 1221 l 543 1221 l 610 1017 l 407 1017 z "},"ó":{"ha":949,"x_min":0,"x_max":949,"o":"m 475 0 q 139 139 278 0 q 0 475 0 278 q 139 810 0 671 q 475 949 278 949 q 810 810 671 949 q 949 475 949 671 q 810 139 949 278 q 475 0 671 0 m 475 271 q 618 331 559 271 q 678 475 678 391 q 618 618 678 559 q 475 678 559 678 q 331 618 391 678 q 271 475 271 559 q 331 331 271 391 q 475 271 391 271 m 543 1017 l 339 1017 l 407 1221 l 610 1221 l 543 1017 z "},"ô":{"ha":949,"x_min":0,"x_max":949,"o":"m 475 0 q 139 139 278 0 q 0 475 0 278 q 139 810 0 671 q 475 949 278 949 q 810 810 671 949 q 949 475 949 671 q 810 139 949 278 q 475 0 671 0 m 475 271 q 618 331 559 271 q 678 475 678 391 q 618 618 678 559 q 475 678 559 678 q 331 618 391 678 q 271 475 271 559 q 331 331 271 391 q 475 271 391 271 m 475 1289 l 746 1017 l 543 1017 l 475 1085 l 407 1017 l 203 1017 l 475 1289 z "},"õ":{"ha":949,"x_min":0,"x_max":949,"o":"m 475 0 q 139 139 278 0 q 0 475 0 278 q 139 810 0 671 q 475 949 278 949 q 810 810 671 949 q 949 475 949 671 q 810 139 949 278 q 475 0 671 0 m 475 271 q 618 331 559 271 q 678 475 678 391 q 618 618 678 559 q 475 678 559 678 q 331 618 391 678 q 271 475 271 559 q 331 331 271 391 q 475 271 391 271 m 203 1013 l 203 1234 q 353 1261 285 1261 q 475 1234 420 1261 q 553 1215 511 1215 q 746 1289 637 1215 l 746 1068 q 553 995 637 995 q 475 1013 511 995 q 353 1040 420 1040 q 203 1013 285 1040 z "},"ö":{"ha":949,"x_min":0,"x_max":949,"o":"m 618 331 q 648 361 618 331 q 678 475 678 391 q 618 618 678 559 q 475 678 559 678 q 331 618 391 678 q 271 475 271 559 q 331 331 271 391 q 475 271 391 271 q 618 331 559 271 m 475 0 q 139 139 278 0 q 0 475 0 278 q 139 810 0 671 q 475 949 278 949 q 810 810 671 949 q 949 475 949 671 q 810 139 949 278 q 475 0 671 0 m 340 1017 q 269 1047 298 1017 q 239 1119 239 1077 q 269 1191 239 1161 q 340 1221 298 1221 q 412 1191 382 1221 q 442 1119 442 1161 q 412 1047 442 1077 q 340 1017 382 1017 m 612 1017 q 540 1047 570 1017 q 510 1119 510 1077 q 540 1191 510 1161 q 612 1221 570 1221 q 684 1191 654 1221 q 713 1119 713 1161 q 684 1047 713 1077 q 612 1017 654 1017 z "},"÷":{"ha":814,"x_min":68,"x_max":746,"o":"m 746 610 l 746 339 l 68 339 l 68 610 l 746 610 m 543 678 l 271 678 l 271 949 l 543 949 l 543 678 m 543 0 l 271 0 l 271 271 l 543 271 l 543 0 z "},"ø":{"ha":951,"x_min":-3,"x_max":946,"o":"m 435 675 q 328 618 374 665 q 268 475 268 559 q 288 385 268 425 l 435 675 m 514 275 q 615 331 571 287 q 675 475 675 391 q 656 561 675 522 l 514 275 m 789 827 q 807 810 798 819 q 946 475 946 671 q 807 139 946 278 q 471 0 668 0 q 380 8 425 0 l 309 -136 l 26 -136 l 155 121 q 136 139 145 130 q -3 475 -3 278 q 136 810 -3 671 q 471 949 275 949 q 569 940 522 949 l 642 1085 l 918 1085 l 789 827 z "},"ù":{"ha":949,"x_min":-68,"x_max":882,"o":"m 339 949 l 339 475 q 475 271 339 271 q 610 475 610 271 l 610 814 l 475 949 l 882 949 l 882 475 q 475 0 882 0 q 68 475 68 0 l 68 814 l -68 949 l 339 949 m 339 1017 l 271 1221 l 475 1221 l 543 1017 l 339 1017 z "},"ú":{"ha":949,"x_min":-68,"x_max":882,"o":"m 339 949 l 339 475 q 475 271 339 271 q 610 475 610 271 l 610 814 l 475 949 l 882 949 l 882 475 q 475 0 882 0 q 68 475 68 0 l 68 814 l -68 949 l 339 949 m 543 1017 l 339 1017 l 407 1221 l 610 1221 l 543 1017 z "},"û":{"ha":949,"x_min":-68,"x_max":882,"o":"m 339 949 l 339 475 q 475 271 339 271 q 610 475 610 271 l 610 814 l 475 949 l 882 949 l 882 475 q 475 0 882 0 q 68 475 68 0 l 68 814 l -68 949 l 339 949 m 475 1289 l 746 1017 l 543 1017 l 475 1085 l 407 1017 l 203 1017 l 475 1289 z "},"ü":{"ha":949,"x_min":-68,"x_max":882,"o":"m 339 949 l 339 475 q 475 271 339 271 q 610 475 610 271 l 610 814 l 475 949 l 882 949 l 882 475 q 475 0 882 0 q 68 475 68 0 l 68 814 l -68 949 l 339 949 m 339 1017 q 267 1047 297 1017 q 237 1119 237 1077 q 267 1191 237 1161 q 339 1221 297 1221 q 411 1191 381 1221 q 441 1119 441 1161 q 411 1047 441 1077 q 339 1017 381 1017 m 610 1017 q 538 1047 568 1017 q 509 1119 509 1077 q 538 1191 509 1161 q 610 1221 568 1221 q 682 1191 652 1221 q 712 1119 712 1161 q 682 1047 712 1077 q 610 1017 652 1017 z "},"ý":{"ha":832,"x_min":-68,"x_max":882,"o":"m 269 441 l -68 949 l 239 949 l 405 703 l 574 949 l 882 949 l 541 441 l 541 -271 l 269 -271 l 269 441 m 499 1017 l 296 1017 l 363 1221 l 567 1221 l 499 1017 z "},"þ":{"ha":872,"x_min":73,"x_max":887,"o":"m 345 916 l 548 916 q 887 543 887 916 q 548 170 887 170 l 345 170 l 345 0 l 73 0 l 73 1051 l 345 1051 l 345 916 m 345 441 l 548 441 q 616 543 616 441 q 548 644 616 644 l 345 644 l 345 441 z "},"ÿ":{"ha":832,"x_min":-68,"x_max":882,"o":"m 269 441 l -68 949 l 239 949 l 405 703 l 574 949 l 882 949 l 541 441 l 541 -271 l 269 -271 l 269 441 m 271 1017 q 199 1047 229 1017 q 170 1119 170 1077 q 199 1191 170 1161 q 271 1221 229 1221 q 343 1191 313 1221 q 373 1119 373 1161 q 343 1047 373 1077 q 271 1017 313 1017 m 543 1017 q 471 1047 500 1017 q 441 1119 441 1077 q 471 1191 441 1161 q 543 1221 500 1221 q 614 1191 585 1221 q 644 1119 644 1161 q 614 1047 644 1077 q 543 1017 585 1017 z "},"Œ":{"ha":1424,"x_min":0,"x_max":1356,"o":"m 618 331 q 648 361 618 331 q 678 475 678 391 q 618 618 678 559 q 475 678 559 678 q 331 618 391 678 q 271 475 271 559 q 331 331 271 391 q 475 271 391 271 q 618 331 559 271 m 1017 610 l 1356 610 l 1356 339 l 1017 339 l 1017 610 m 678 44 q 475 0 586 0 q 139 139 278 0 q 0 475 0 278 q 139 810 0 671 q 475 949 278 949 q 678 905 586 949 l 678 949 l 1356 949 l 1356 678 l 950 678 l 950 271 l 1356 271 l 1356 0 l 678 0 l 678 44 z "},"œ":{"ha":1424,"x_min":0,"x_max":1356,"o":"m 618 331 q 648 361 618 331 q 678 475 678 391 q 618 618 678 559 q 475 678 559 678 q 331 618 391 678 q 271 475 271 559 q 331 331 271 391 q 475 271 391 271 q 618 331 559 271 m 1017 610 l 1356 610 l 1356 339 l 1017 339 l 1017 610 m 678 44 q 475 0 586 0 q 139 139 278 0 q 0 475 0 278 q 139 810 0 671 q 475 949 278 949 q 678 905 586 949 l 678 949 l 1356 949 l 1356 678 l 950 678 l 950 271 l 1356 271 l 1356 0 l 678 0 l 678 44 z "},"ɶ":{"ha":1424,"x_min":0,"x_max":1356,"o":"m 618 331 q 648 361 618 331 q 678 475 678 391 q 618 618 678 559 q 475 678 559 678 q 331 618 391 678 q 271 475 271 559 q 331 331 271 391 q 475 271 391 271 q 618 331 559 271 m 1017 610 l 1356 610 l 1356 339 l 1017 339 l 1017 610 m 678 44 q 475 0 586 0 q 139 139 278 0 q 0 475 0 278 q 139 810 0 671 q 475 949 278 949 q 678 905 586 949 l 678 949 l 1356 949 l 1356 678 l 950 678 l 950 271 l 1356 271 l 1356 0 l 678 0 l 678 44 z "},"ˆ":{"ha":746,"x_min":34,"x_max":712,"o":"m 576 1356 l 712 1017 l 441 1017 l 373 1187 l 305 1017 l 34 1017 l 170 1356 l 576 1356 z "},"ˇ":{"ha":746,"x_min":34,"x_max":712,"o":"m 373 1187 l 441 1356 l 712 1356 l 576 1017 l 170 1017 l 34 1356 l 305 1356 l 373 1187 z "},"ˉ":{"ha":610,"x_min":34,"x_max":576,"o":"m 576 1289 l 576 1017 l 34 1017 l 34 1289 l 576 1289 z "},"˙":{"ha":339,"x_min":34,"x_max":305,"o":"m 305 1017 l 34 1017 l 34 1289 l 305 1289 l 305 1017 z "},"˜":{"ha":746,"x_min":68,"x_max":610,"o":"m 68 1013 l 68 1234 q 217 1261 149 1261 q 339 1234 285 1261 q 418 1215 376 1215 q 610 1289 502 1215 l 610 1068 q 418 995 502 995 q 339 1013 376 995 q 217 1040 285 1040 q 68 1013 149 1040 z "},"˝":{"ha":845,"x_min":34,"x_max":811,"o":"m 305 610 l 34 610 l 170 949 l 441 949 l 305 610 m 675 610 l 404 610 l 540 949 l 811 949 l 675 610 z "},"̀":{"ha":475,"x_min":136,"x_max":407,"o":"m 203 1017 l 136 1221 l 339 1221 l 407 1017 l 203 1017 z "},"́":{"ha":475,"x_min":136,"x_max":407,"o":"m 339 1017 l 136 1017 l 203 1221 l 407 1221 l 339 1017 z "},"̂":{"ha":610,"x_min":0,"x_max":543,"o":"m 271 1289 l 543 1017 l 339 1017 l 271 1085 l 203 1017 l 0 1017 l 271 1289 z "},"̃":{"ha":746,"x_min":68,"x_max":610,"o":"m 68 1013 l 68 1234 q 217 1261 149 1261 q 339 1234 285 1261 q 418 1215 376 1215 q 610 1289 502 1215 l 610 1068 q 418 995 502 995 q 339 1013 376 995 q 217 1040 285 1040 q 68 1013 149 1040 z "},"̄":{"ha":610,"x_min":34,"x_max":576,"o":"m 576 1289 l 576 1017 l 34 1017 l 34 1289 l 576 1289 z "},"̅":{"ha":610,"x_min":34,"x_max":576,"o":"m 576 1289 l 576 1017 l 34 1017 l 34 1289 l 576 1289 z "},"̆":{"ha":610,"x_min":34,"x_max":576,"o":"m 543 1289 l 576 1017 q 305 983 441 983 q 34 1017 170 983 l 68 1289 q 305 1255 186 1255 q 543 1289 424 1255 z "},"̇":{"ha":339,"x_min":34,"x_max":305,"o":"m 305 1017 l 34 1017 l 34 1289 l 305 1289 l 305 1017 z "},"̈":{"ha":678,"x_min":34,"x_max":644,"o":"m 305 1017 l 34 1017 l 34 1289 l 305 1289 l 305 1017 m 644 1017 l 373 1017 l 373 1289 l 644 1289 l 644 1017 z "},"̉":{"ha":358,"x_min":34,"x_max":324,"o":"m 237 1221 q 170 1289 237 1289 q 102 1187 102 1289 l 34 1187 q 186 1356 34 1356 q 324 1246 324 1356 q 315 1160 324 1234 q 203 1017 305 1085 l 136 1017 q 237 1221 237 1153 z "},"̊":{"ha":373,"x_min":34,"x_max":339,"o":"m 186 1017 q 79 1060 123 1017 q 34 1162 34 1103 q 79 1265 34 1223 q 186 1308 123 1308 q 294 1265 250 1308 q 339 1162 339 1223 q 294 1060 339 1103 q 186 1017 250 1017 m 186 1085 q 247 1110 222 1085 q 271 1170 271 1135 q 247 1230 271 1205 q 186 1255 222 1255 q 126 1230 151 1255 q 102 1170 102 1205 q 126 1110 102 1135 q 186 1085 151 1085 z "},"̋":{"ha":845,"x_min":34,"x_max":811,"o":"m 305 1017 l 34 1017 l 170 1356 l 441 1356 l 305 1017 m 675 1017 l 404 1017 l 540 1356 l 811 1356 l 675 1017 z "},"̌":{"ha":746,"x_min":34,"x_max":712,"o":"m 373 1187 l 441 1356 l 712 1356 l 576 1017 l 170 1017 l 34 1356 l 305 1356 l 373 1187 z "},"̧":{"ha":305,"x_min":34,"x_max":271,"o":"m 68 -102 l 68 34 l 136 34 l 136 -34 q 271 -136 271 -34 q 136 -237 271 -237 l 34 -237 l 34 -170 l 102 -170 q 186 -153 170 -170 q 195 -136 195 -144 q 182 -114 195 -127 q 68 -102 170 -102 z "},"؉":{"ha":1289,"x_min":34,"x_max":1255,"o":"m 916 949 l 340 0 l 34 0 l 612 949 l 916 949 m 305 610 l 34 610 l 34 882 l 305 882 l 305 610 m 916 68 l 644 68 l 644 339 l 916 339 l 916 68 m 1255 68 l 983 68 l 983 339 l 1255 339 l 1255 68 z "},"–":{"ha":814,"x_min":68,"x_max":746,"o":"m 746 610 l 746 339 l 68 339 l 68 610 l 746 610 z "},"—":{"ha":1424,"x_min":68,"x_max":1356,"o":"m 1356 610 l 1356 339 l 68 339 l 68 610 l 1356 610 z "},"‘":{"ha":339,"x_min":34,"x_max":305,"o":"m 305 949 l 271 543 l 68 543 l 34 949 l 305 949 z "},"’":{"ha":339,"x_min":34,"x_max":305,"o":"m 305 949 l 271 543 l 68 543 l 34 949 l 305 949 z "},"‚":{"ha":339,"x_min":34,"x_max":305,"o":"m 305 136 l 305 -271 l 34 -271 l 34 136 l 305 136 z "},"“":{"ha":678,"x_min":34,"x_max":644,"o":"m 305 949 l 271 543 l 68 543 l 34 949 l 305 949 m 644 949 l 610 543 l 407 543 l 373 949 l 644 949 z "},"”":{"ha":678,"x_min":34,"x_max":644,"o":"m 305 949 l 271 543 l 68 543 l 34 949 l 305 949 m 644 949 l 610 543 l 407 543 l 373 949 l 644 949 z "},"„":{"ha":678,"x_min":34,"x_max":644,"o":"m 305 136 l 305 -271 l 34 -271 l 34 136 l 305 136 m 644 136 l 644 -271 l 373 -271 l 373 136 l 644 136 z "},"•":{"ha":339,"x_min":34,"x_max":305,"o":"m 170 339 q 74 379 113 339 q 34 475 34 418 q 74 571 34 531 q 170 610 113 610 q 266 571 226 610 q 305 475 305 531 q 266 379 305 418 q 170 339 226 339 z "},"…":{"ha":1153,"x_min":34,"x_max":1119,"o":"m 305 0 l 34 0 l 34 271 l 305 271 l 305 0 m 712 0 l 441 0 l 441 271 l 712 271 l 712 0 m 1119 0 l 848 0 l 848 271 l 1119 271 l 1119 0 z "},"‹":{"ha":882,"x_min":68,"x_max":814,"o":"m 68 610 l 814 949 l 814 678 l 339 475 l 814 271 l 814 0 l 68 339 l 68 610 z "},"›":{"ha":882,"x_min":68,"x_max":814,"o":"m 814 339 l 68 0 l 68 271 l 543 475 l 68 678 l 68 949 l 814 610 l 814 339 z "},"€":{"ha":968,"x_min":-68,"x_max":968,"o":"m 77 575 q 207 810 104 708 q 475 945 321 925 q 543 951 509 951 q 610 945 576 951 q 878 810 764 925 q 968 689 935 754 l 726 564 q 686 618 711 593 q 543 678 627 678 q 399 618 458 678 q 365 575 378 598 l 610 575 l 610 507 l 341 507 q 339 475 339 492 q 342 439 339 456 l 610 439 l 610 372 l 367 372 q 399 331 380 350 q 543 271 458 271 q 686 331 627 271 q 715 367 703 348 l 945 221 q 878 139 917 178 q 610 4 764 24 q 543 0 576 0 q 475 4 509 0 q 207 139 321 24 q 78 372 106 240 l -68 372 l -68 439 l 69 439 q 68 475 68 457 q 68 507 68 491 l -68 507 l -68 575 l 77 575 z "},"™":{"ha":796,"x_min":34,"x_max":762,"o":"m 239 853 l 239 610 l 142 610 l 142 853 l 34 853 l 34 950 l 349 950 l 349 853 l 239 853 m 762 950 l 762 610 l 665 610 l 665 772 l 616 610 l 519 610 l 471 772 l 471 610 l 374 610 l 374 950 l 495 950 l 568 756 l 641 950 l 762 950 z "},"−":{"ha":746,"x_min":34,"x_max":712,"o":"m 712 610 l 712 339 l 34 339 l 34 610 l 712 610 z "}},"familyName":"Maximum Voltage","ascender":1424,"descender":-271,"underlinePosition":-147,"underlineThickness":102,"boundingBox":{"yMin":-271,"xMin":-197,"yMax":1424,"xMax":1492},"resolution":1000,"original_font_information":{"format":0,"copyright":"Typeface © Darrell Flood. 2024. All Rights Reserved","fontFamily":"Maximum Voltage","fontSubfamily":"Regular","uniqueID":"Maximum Voltage:Version 1.00","fullName":"Maximum Voltage","version":"Version 1.00;June 23, 2024;FontCreator 12.0.0.2567 64-bit","postScriptName":"MaximumVoltage","description":"This font was created using FontCreator 12 from High-Logic.com"},"cssFontWeight":"normal","cssFontStyle":"normal"} \ No newline at end of file diff --git a/air-quality-ui/public/NaturalEarthCoastline2.jpg b/air-quality-ui/public/NaturalEarthCoastline2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a7aa80dfa7dcabf27f951e19a58943e1192fa795 GIT binary patch literal 155744 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

+ {/* Location Marker Button */} + + {/* Globe Button */} + {/* Checkerboard Button */} + + + {/* Step Curve Button */} + + + {/* Variable Selection Dropdown */} + ); }; @@ -131,8 +199,8 @@ const styles = { display: 'flex', justifyContent: 'center', alignItems: 'center', - fontSize: '32px', // Control the size of the button and the icon - backgroundColor: 'lightgray', // Remove the background color + fontSize: '32px', + backgroundColor: 'lightgray', border: 'none', borderRadius: '20%', cursor: 'pointer', @@ -145,20 +213,39 @@ const styles = { slider: { width: '500px', }, - globeButton: { + dropdown: { + width: '100px', + height: '40px', + fontSize: '16px', + borderRadius: '5px', + border: '1px solid lightgray', + padding: '5px', + cursor: 'pointer', + }, + icon: { + fontSize: '28px', + lineHeight: '32px', + }, + checkerboardButton: { width: '40px', height: '40px', display: 'flex', justifyContent: 'center', alignItems: 'center', - fontSize: '32px', // Adjust the font size for the globe icon - backgroundColor: 'lightgray', // Remove background + fontSize: '32px', + backgroundColor: 'gray', border: 'none', borderRadius: '20%', cursor: 'pointer', + backgroundImage: `linear-gradient(45deg, #ccc 25%, transparent 25%), + linear-gradient(-45deg, #ccc 25%, transparent 25%), + linear-gradient(45deg, transparent 75%, #ccc 75%), + linear-gradient(-45deg, transparent 75%, #ccc 75%)`, + backgroundSize: '20px 20px', + backgroundPosition: '0 0, 0 10px, 10px -10px, -10px 0px', }, - icon: { - fontSize: '28px', // Make the icons fill the button + stepIcon: { + fontSize: '28px', lineHeight: '32px', }, }; diff --git a/air-quality-ui/src/components/globe/LocationMarker copy.tsx b/air-quality-ui/src/components/globe/LocationMarker copy.tsx new file mode 100644 index 00000000..597882de --- /dev/null +++ b/air-quality-ui/src/components/globe/LocationMarker copy.tsx @@ -0,0 +1,305 @@ +import { useRef, forwardRef, useImperativeHandle } from 'react'; +import { Mesh } from 'three'; +import CustomShaderMaterial from 'three-custom-shader-material'; +import * as THREE from 'three'; +import { useThree, useFrame } from '@react-three/fiber'; +import { gsap } from 'gsap'; + +type LocationMarkerProps = { + forecastData: ForecastResponseDto; + measurementData: MeasurementSummaryResponseDto; + thisRotationsFrame: THREE.Texture; + nextRotationsFrame: THREE.Texture; +}; + +export type LocationMarkerRef = { + tick: (weight: number, uSphereWrapAmount: number) => void; + changeProjection: (globeState: boolean) => void; +}; + + +const LocationMarker = forwardRef( + ({ forecastData, measurementData, thisRotationsFrame, nextRotationsFrame }, ref): JSX.Element => { + const markerRef = useRef(null); + const ringRef = useRef(null); // Ref for the ring geometry + const { camera } = useThree(); // Access the camera + const prevCameraPosition = useRef(camera.position.clone()); // Store previous camera position + + // Uniform values from props or calculations + const lat = forecastData[0].location.latitude; + const lon = forecastData[0].location.longitude; + + // Extract point data from forecastData + const forecastDataArray = forecastData.map((data) => data.overall_aqi_level); + const forecastDataArrayUniform = new Float32Array(forecastDataArray); + + // and the same array for the average measurement data + const measurementArray = forecastData.map((forecastEntry) => { + // Find a corresponding measurement entry by matching valid_time and measurement_base_time + const matchingMeasurement = measurementData?.find( + (measurementEntry) => measurementEntry.measurement_base_time === forecastEntry.valid_time + ); + + // If a matching measurement is found, return the overall_aqi_level, otherwise return a missing value (e.g., -1) + return matchingMeasurement ? matchingMeasurement.overall_aqi_level.mean : -1; + }); + + const measurementDataArrayUniform = new Float32Array(measurementArray); + + + // Animation or build time (example values) + const shaderUniforms = { + uSphereWrapAmount: { value: 0.0 }, + uFrameWeight: { value: 0.5 }, + }; + + const markerSize = 0.025; + const markerColor = [0.25, 0.25, 0.25]; // Example color + + // Scale based on camera zoom or position + const scaleBasedOnZoom = () => { + if (markerRef.current) { + // Calculate scale based on the camera's distance from the origin + const distance = camera.position.z; // Use camera's distance from the origin + const scaleFactor = distance / 10; // Adjust the denominator to control the sensitivity of the scaling + + markerRef.current.material.uniforms.uZoomLevel.value = scaleFactor + console.log(markerRef.current.material.uniforms.uZoomLevel.value) + } + }; + + // // Track camera movement and apply scaling + // useFrame(() => { + // // Check if the z-axis of the camera has changed + // if (camera.position.z !== prevCameraPosition.current.z) { + // scaleBasedOnZoom(); // Adjust scale when the z-axis changes + // prevCameraPosition.current.z = camera.position.z; // Update the z-axis position only + // } + // }); + + // Implement the tick function + const tick = (weight: number, uSphereWrapAmount: number) => { + if (markerRef.current) { + markerRef.current.material.uniforms.uFrameWeight.value = weight % 1; + markerRef.current.material.uniforms.uFrame.value = Math.floor(weight); + } + // scaleBasedOnZoom(); // Scale based on current zoom whenever tick is called + }; + + const changeProjection = (globeState: boolean) => { + if (markerRef.current) { + if ( globeState ) { + gsap.to(markerRef.current.material.uniforms.uSphereWrapAmount, { value: 1.0, duration: 2 }); + ringRef.current.visible = false; // Show the ring in flat projection + } else { + gsap.to(markerRef.current.material.uniforms.uSphereWrapAmount, { value: 0.0, duration: 2, onComplete: () => { + ringRef.current.visible = true; // Show the ring in flat projection + }}); + } + } + }; + + const setVariableSize = (enlargedState: boolean) => { + if (markerRef.current) { + markerRef.current.material.uniforms.uVariableSize.value = enlargedState; + } + }; + + + const setVisible = (isVisible: boolean) => { + if (markerRef.current) { + markerRef.current.visible = isVisible; + } + }; + + // Expose the tick method to the parent component + useImperativeHandle(ref, () => ({ + tick, + changeProjection, + setVariableSize, + setVisible + })); + + return ( + + + + {/* CustomShaderMaterial from the custom-shader-material library */} + = 1.0 && value < 2.0) { + color = vec3(129.0 / 255.0, 237.0 / 255.0, 229.0 / 255.0); + } else if (value >= 2.0 && value < 3.0) { + color = vec3(116.0 / 255.0, 201.0 / 255.0, 172.0 / 255.0); + } else if (value >= 3.0 && value < 4.0) { + color = vec3(238.0 / 255.0, 230.0 / 255.0, 97.0 / 255.0); + } else if (value >= 4.0 && value < 5.0) { + color = vec3(236.0 / 255.0, 94.0 / 255.0, 87.0 / 255.0); + } else if (value >= 5.0 && value < 6.0) { + color = vec3(137.0 / 255.0, 26.0 / 255.0, 52.0 / 255.0); + } else if (value >= 6.0 && value < 7.0) { + color = vec3(115.0 / 255.0, 40.0 / 255.0, 125.0 / 255.0); + } else { + color = vec3(0.15, 0.15, 0.15); // Default to dark grey + } + } + // Add more variable types as needed + else { + color = vec3(1.0, 1.0, 1.0); // Default to white + } + + return color; + } + + #define M_PI 3.14159265 + + uniform float uSphereWrapAmount; + uniform float uLat; + uniform float uLon; + uniform float uForecastData[40]; + uniform float uMeasurementData[40]; + uniform int uFrame; + uniform int uVariableType; + uniform float uFrameWeight; + uniform float uZoomLevel; + uniform bool uVariableSize; + + varying vec3 vColor; + + void main() { + + // Call the color function to get the color based on AQI value and variable type + // float intData = uAqiForecast[uFrame]; // Access the correct frame data + // vec3 thisColor = getColorForValue(uAqiForecast[uFrame], uVariableType); + // vec3 color = mix(thisColor, thisColor, uFrameWeight); + // float forecastValue = mix(uForecastData[uFrame],uForecastData[uFrame+1],uFrameWeight); + // float measurementValue = mix(uMeasurementData[uFrame],uMeasurementData[uFrame+1],uFrameWeight); + float forecastValue = uForecastData[uFrame]; + float measurementValue = uMeasurementData[uFrame]; + + float nextForecastValue = uForecastData[uFrame+1]; + float nextMeasurementValue = uMeasurementData[uFrame+1]; + + float forecastValueInterpolated = mix(forecastValue, nextForecastValue, uFrameWeight); + float measurementValueInterpolated = mix(measurementValue, nextMeasurementValue, uFrameWeight); + + float thisDiff; + float nextDiff; + float diff = 1.0; + + forecastValue = clamp(forecastValue, 1.0, 6.0); + measurementValue = clamp(measurementValue, 1.0, 6.0); + nextForecastValue = clamp(nextForecastValue, 1.0, 6.0); + nextMeasurementValue = clamp(nextMeasurementValue, 1.0, 6.0); + + // if ( (forecastValue > 0.0) && (measurementValue > 0.0) ) { + // thisDiff = abs(measurementValue-forecastValue); + // // if ( (nextForecastValue > 0.0) && (nextMeasurementValue > 0.0) ) { + // nextDiff = abs(nextMeasurementValue-nextForecastValue); + // diff = mix(thisDiff, nextDiff, uFrameWeight); + // // } + // // diff = thisDiff; + + // } else { + // diff = 1.0; + // } + // if (diff < 1.0) { + // diff = 1.0; + // } + + thisDiff = abs(measurementValue-forecastValue); + nextDiff = abs(nextMeasurementValue-nextForecastValue); + diff = mix(thisDiff, nextDiff, uFrameWeight); + diff = clamp(diff, 1.0, 6.0); + + vec3 color; + if ( (measurementValueInterpolated > 0.0 ) || (diff > 1.0) ) { + color = getColorForValue(measurementValue, uVariableType); + } else { + color = getColorForValue(0.0, uVariableType); + } + vColor = adjustSaturation(color, 2.0); // Increase saturation + + float lat = uLat; + float lon = uLon; + + // vec3 posPlane = position * 1.1 * uZoomLevel ; + vec3 posPlane = position * 0.3 ; + posPlane.x += lon / 180.0 * 2.0; + posPlane.y += lat / 90.0; + + float r = 1.0; + float theta = 2. * M_PI * (posPlane.x / 4. + 0.5); + float phi = M_PI * (posPlane.y / 2. + 0.5 - 1.0); + float sinPhiRadius = sin( phi ) * r; + + vec3 posSphere; + posSphere.x = sinPhiRadius * sin(theta); + posSphere.y = r * cos(phi); + posSphere.z = sinPhiRadius * cos(theta); + + if (uVariableSize) { + posPlane += position * diff; + posSphere += position * diff; + } else { + posPlane += position; + posSphere += position; + } + + csm_Position = mix(posPlane, posSphere, uSphereWrapAmount) ; + + // csm_Position = posPlane; + + } + `} + fragmentShader={` + + uniform float uOpacity; + varying vec3 vColor; + + + void main() { + + csm_DiffuseColor = vec4(vColor, uOpacity); // Apply the color to the fragment + } + `} + uniforms={{ + uSphereWrapAmount: shaderUniforms.uSphereWrapAmount, + uFrameWeight: shaderUniforms.uFrameWeight, + uZoomLevel: { value: 0.11 }, + uVariableSize: { value: true }, + uFrame: { value: 0 }, + uLat: { value: lat }, + uLon: { value: lon }, + uColor: { value: markerColor }, + uOpacity: { value: 1.0 }, + uForecastData: { value: forecastDataArrayUniform }, + uMeasurementData: { value: measurementDataArrayUniform }, + uVariableType: { value: 1 }, // Example variable type + }} + transparent + /> + + {/* Add a ring for the equator line */} + + + + + + ); + } +); + +export default LocationMarker; \ No newline at end of file diff --git a/air-quality-ui/src/components/globe/LocationMarker.tsx b/air-quality-ui/src/components/globe/LocationMarker.tsx index c7ecb588..cc0e0129 100644 --- a/air-quality-ui/src/components/globe/LocationMarker.tsx +++ b/air-quality-ui/src/components/globe/LocationMarker.tsx @@ -1,4 +1,4 @@ -import { useRef, forwardRef, useImperativeHandle } from 'react'; +import { useRef, forwardRef, useImperativeHandle, useEffect } from 'react'; import { Mesh } from 'three'; import CustomShaderMaterial from 'three-custom-shader-material'; import * as THREE from 'three'; @@ -10,6 +10,7 @@ type LocationMarkerProps = { measurementData: MeasurementSummaryResponseDto; thisRotationsFrame: THREE.Texture; nextRotationsFrame: THREE.Texture; + selectedVariable: string; }; export type LocationMarkerRef = { @@ -19,7 +20,7 @@ export type LocationMarkerRef = { const LocationMarker = forwardRef( - ({ forecastData, measurementData, thisRotationsFrame, nextRotationsFrame }, ref): JSX.Element => { + ({ forecastData, measurementData, thisRotationsFrame, nextRotationsFrame, selectedVariable }, ref): JSX.Element => { const markerRef = useRef(null); const ringRef = useRef(null); // Ref for the ring geometry const { camera } = useThree(); // Access the camera @@ -29,24 +30,62 @@ const LocationMarker = forwardRef( const lat = forecastData[0].location.latitude; const lon = forecastData[0].location.longitude; - // Extract point data from forecastData - const forecastDataArray = forecastData.map((data) => data.overall_aqi_level); - const forecastDataArrayUniform = new Float32Array(forecastDataArray); - - // and the same array for the average measurement data - const measurementArray = forecastData.map((forecastEntry) => { - // Find a corresponding measurement entry by matching valid_time and measurement_base_time - const matchingMeasurement = measurementData?.find( - (measurementEntry) => measurementEntry.measurement_base_time === forecastEntry.valid_time - ); + const createDataArrays = (forecastData: ForecastResponseDto[], measurementData: MeasurementSummaryResponseDto[], variable: string) => { + + let variable_name; + if ( variable === "aqi" ) { + variable_name = "overall_aqi_level"; + } else if ( variable === "pm10" ) { + variable_name = "pm10"; + } + + // Extract point data from forecastData + const forecastDataArray = forecastData.map((data) => data[variable_name]); + const forecastDataArrayUniform = new Float32Array(forecastDataArray); + + // and the same array for the average measurement data + const measurementArray = forecastData.map((forecastEntry) => { + // Find a corresponding measurement entry by matching valid_time and measurement_base_time + const matchingMeasurement = measurementData?.find( + (measurementEntry) => measurementEntry.measurement_base_time === forecastEntry.valid_time + ); + + if ( variable === "aqi") { + // If a matching measurement is found, return the overall_aqi_level, otherwise return a missing value (e.g., -1) + return matchingMeasurement && matchingMeasurement[variable_name] + ? matchingMeasurement[variable_name].mean + : -1; + } else { + return matchingMeasurement && matchingMeasurement[variable_name] + ? matchingMeasurement[variable_name].mean.value + : -1; + } + }); + + const measurementDataArrayUniform = new Float32Array(measurementArray); + + return { forecastDataArrayUniform, measurementDataArrayUniform }; + } + + // // Extract point data from forecastData + // const forecastDataArray = forecastData.map((data) => data.overall_aqi_level); + // const forecastDataArrayUniform = new Float32Array(forecastDataArray); + + // // and the same array for the average measurement data + // const measurementArray = forecastData.map((forecastEntry) => { + // // Find a corresponding measurement entry by matching valid_time and measurement_base_time + // const matchingMeasurement = measurementData?.find( + // (measurementEntry) => measurementEntry.measurement_base_time === forecastEntry.valid_time + // ); - // If a matching measurement is found, return the overall_aqi_level, otherwise return a missing value (e.g., -1) - return matchingMeasurement ? matchingMeasurement.overall_aqi_level.mean : -1; - }); + // // If a matching measurement is found, return the overall_aqi_level, otherwise return a missing value (e.g., -1) + // return matchingMeasurement ? matchingMeasurement.overall_aqi_level.mean : -1; + // }); - const measurementDataArrayUniform = new Float32Array(measurementArray); + // const measurementDataArrayUniform = new Float32Array(measurementArray); - + + const { forecastDataArrayUniform, measurementDataArrayUniform } = createDataArrays(forecastData, measurementData, selectedVariable); // Animation or build time (example values) const shaderUniforms = { uSphereWrapAmount: { value: 0.0 }, @@ -56,6 +95,16 @@ const LocationMarker = forwardRef( const markerSize = 0.025; const markerColor = [0.25, 0.25, 0.25]; // Example color + // Re-trigger component on selectedVariable change + useEffect(() => { + if (markerRef.current) { + const { forecastDataArrayUniform, measurementDataArrayUniform } = createDataArrays(forecastData, measurementData, selectedVariable); + markerRef.current.material.uniforms.uForecastData.value = forecastDataArrayUniform; + markerRef.current.material.uniforms.uMeasurementData.value = measurementDataArrayUniform; + markerRef.current.material.uniforms.uVariableIndex.value = selectedVariable === "aqi" ? 1.0 : 2.0; // Example to set variable type + } + }, [selectedVariable, forecastDataArrayUniform, measurementDataArrayUniform]); + // Scale based on camera zoom or position const scaleBasedOnZoom = () => { if (markerRef.current) { @@ -68,20 +117,19 @@ const LocationMarker = forwardRef( } }; - // Track camera movement and apply scaling - useFrame(() => { - // Check if the z-axis of the camera has changed - if (camera.position.z !== prevCameraPosition.current.z) { - console.log('scale'); // Debugging to ensure scaling happens only on z-axis change - scaleBasedOnZoom(); // Adjust scale when the z-axis changes - prevCameraPosition.current.z = camera.position.z; // Update the z-axis position only - } - }); + // // Track camera movement and apply scaling + // useFrame(() => { + // // Check if the z-axis of the camera has changed + // if (camera.position.z !== prevCameraPosition.current.z) { + // scaleBasedOnZoom(); // Adjust scale when the z-axis changes + // prevCameraPosition.current.z = camera.position.z; // Update the z-axis position only + // } + // }); // Implement the tick function const tick = (weight: number, uSphereWrapAmount: number) => { if (markerRef.current) { - markerRef.current.material.uniforms.uFrameWeight.value = weight; + markerRef.current.material.uniforms.uFrameWeight.value = weight % 1; markerRef.current.material.uniforms.uFrame.value = Math.floor(weight); } // scaleBasedOnZoom(); // Scale based on current zoom whenever tick is called @@ -100,10 +148,25 @@ const LocationMarker = forwardRef( } }; + const setVariableSize = (enlargedState: boolean) => { + if (markerRef.current) { + markerRef.current.material.uniforms.uVariableSize.value = enlargedState; + } + }; + + + const setVisible = (isVisible: boolean) => { + if (markerRef.current) { + markerRef.current.visible = isVisible; + } + }; + // Expose the tick method to the parent component useImperativeHandle(ref, () => ({ tick, - changeProjection + changeProjection, + setVariableSize, + setVisible })); return ( @@ -121,10 +184,10 @@ const LocationMarker = forwardRef( } // Function to get color based on the value and variable type - vec3 getColorForValue(float value, int variableType) { + vec3 getColorForValue(float value, float uVariableIndex) { vec3 color; - if (variableType == 1) { // "aqi" + if (uVariableIndex == 1.0) { // "aqi" if (value >= 1.0 && value < 2.0) { color = vec3(129.0 / 255.0, 237.0 / 255.0, 229.0 / 255.0); } else if (value >= 2.0 && value < 3.0) { @@ -140,26 +203,49 @@ const LocationMarker = forwardRef( } else { color = vec3(0.15, 0.15, 0.15); // Default to dark grey } - } - // Add more variable types as needed - else { - color = vec3(1.0, 1.0, 1.0); // Default to white - } + } else if (uVariableIndex == 2.0) { // "pm10" + if (value < 30.0) { + color = vec3(1.0, 1.0, 1.0); + } else if (value < 40.0) { + color = vec3(233.0/ 255.0, 249.0/ 255.0, 188.0/ 255.0); // Green + } else if (value < 50.0) { + color = vec3(198.0/ 255.0, 255.0/ 255.0, 199.0/ 255.0); // Blue + } else if (value < 60.0) { + color = vec3(144.0/ 255.0, 237.0/ 255.0, 169.0/ 255.0); // Yellow + } else if (value < 80.0) { + color = vec3(76.0/ 255.0, 180.0/ 255.0, 148.0/ 255.0); // Orange + } else if (value < 100.0) { + color = vec3(48.0/ 255.0, 155.0/ 255.0, 138.0/ 255.0); // Purple + } else if (value < 150.0) { + color = vec3(47.0/ 255.0, 137.0/ 255.0, 169.0/ 255.0); // Yellow + } else if (value < 200.0) { + color = vec3(16.0/ 255.0, 99.0/ 255.0, 164.0/ 255.0); // Orange + } else if (value < 300.0) { + color = vec3(13.0/ 255.0, 69.0/ 255.0, 126.0/ 255.0); // Purple + } else if (value < 500.0) { + color = vec3(15.0/ 255.0, 26.0/ 255.0, 136.0/ 255.0); // Orange + } else if (value < 1000.0) { + color = vec3(38.0/ 255.0, 2.0/ 255.0, 60.0/ 255.0); // Purple + } else { + color = vec3(0.0, 0.0, 0.0); // Black for values out of range + } + } return color; } #define M_PI 3.14159265 + uniform float uVariableIndex; uniform float uSphereWrapAmount; uniform float uLat; uniform float uLon; uniform float uForecastData[40]; uniform float uMeasurementData[40]; uniform int uFrame; - uniform int uVariableType; uniform float uFrameWeight; uniform float uZoomLevel; + uniform bool uVariableSize; varying vec3 vColor; @@ -173,19 +259,50 @@ const LocationMarker = forwardRef( // float measurementValue = mix(uMeasurementData[uFrame],uMeasurementData[uFrame+1],uFrameWeight); float forecastValue = uForecastData[uFrame]; float measurementValue = uMeasurementData[uFrame]; - float diff; - if ( (measurementValue > 0.0) && (forecastValue > 0.0) ) { - diff = abs(measurementValue-forecastValue); - } else { - diff = 1.0; - } - if (diff < 1.0) { - diff = 1.0; + + float nextForecastValue = uForecastData[uFrame+1]; + float nextMeasurementValue = uMeasurementData[uFrame+1]; + + float forecastValueInterpolated = mix(forecastValue, nextForecastValue, uFrameWeight); + float measurementValueInterpolated = mix(measurementValue, nextMeasurementValue, uFrameWeight); + + float thisDiff; + float nextDiff; + float diff = 1.0; + + float minValue; + float maxValue; + + if (uVariableIndex == 1.0) { + minValue = 1.0; + maxValue = 6.0; + } else if (uVariableIndex == 2.0) { + minValue = 0.0; + maxValue = 1000.0; } - vec3 color = getColorForValue(measurementValue, uVariableType); + forecastValue = clamp(forecastValue, minValue, maxValue); + measurementValue = clamp(measurementValue, minValue, maxValue); + nextForecastValue = clamp(nextForecastValue, minValue, maxValue); + nextMeasurementValue = clamp(nextMeasurementValue, minValue, maxValue); + + thisDiff = abs(measurementValue-forecastValue); + nextDiff = abs(nextMeasurementValue-nextForecastValue); + diff = mix(thisDiff, nextDiff, uFrameWeight); - vColor = adjustSaturation(color, 2.0); // Increase saturation + if (uVariableIndex == 1.0) { + diff = clamp(diff, 1.0, 6.0); + } else if (uVariableIndex == 2.0) { + diff = clamp(diff/10.0, 1.0, 4.0); + } + + vec3 color; + if ( (measurementValueInterpolated > 0.0 ) || (diff > 1.0) ) { + color = getColorForValue(measurementValue, uVariableIndex); + } else { + color = getColorForValue(0.0, uVariableIndex); + } + vColor = adjustSaturation(color, 2.0); // Increase saturation float lat = uLat; float lon = uLon; @@ -205,8 +322,13 @@ const LocationMarker = forwardRef( posSphere.y = r * cos(phi); posSphere.z = sinPhiRadius * cos(theta); - posPlane += position * diff; - posSphere += position * diff; + if (uVariableSize) { + posPlane += position * diff; + posSphere += position * diff; + } else { + posPlane += position; + posSphere += position; + } csm_Position = mix(posPlane, posSphere, uSphereWrapAmount) ; @@ -229,6 +351,7 @@ const LocationMarker = forwardRef( uSphereWrapAmount: shaderUniforms.uSphereWrapAmount, uFrameWeight: shaderUniforms.uFrameWeight, uZoomLevel: { value: 0.11 }, + uVariableSize: { value: true }, uFrame: { value: 0 }, uLat: { value: lat }, uLon: { value: lon }, @@ -237,9 +360,11 @@ const LocationMarker = forwardRef( uForecastData: { value: forecastDataArrayUniform }, uMeasurementData: { value: measurementDataArrayUniform }, uVariableType: { value: 1 }, // Example variable type + uVariableIndex: { value: 2.0 }, }} transparent /> + {/* Add a ring for the equator line */} diff --git a/air-quality-ui/src/components/globe/SurfaceLayer copy.tsx b/air-quality-ui/src/components/globe/SurfaceLayer copy.tsx new file mode 100644 index 00000000..3b3f9565 --- /dev/null +++ b/air-quality-ui/src/components/globe/SurfaceLayer copy.tsx @@ -0,0 +1,281 @@ +import { + forwardRef, + useImperativeHandle, + useRef, + memo, + useCallback, +} from "react"; +import * as THREE from "three"; +import vertexShader from "./shaders/surfaceVert.glsl"; +import fragmentShader from "./shaders/surfaceFrag.glsl"; +import { useForecastContext } from '../../context'; +import { gsap } from 'gsap'; + +type PlaneType = THREE.Mesh; + +type SurfaceLayerProps = { + forecastData: ForecastResponseDto[]; + summarizedMeasurementData: MeasurementSummaryResponseDto[]; + isFilterNearest: boolean; + isTimeInterpolation: boolean; + selectedVariable: string; // Add this prop +}; + + +export type SurfaceLayerRef = { + type: React.RefObject; + tick: (weight: number, uSphereWrapAmount: number) => void; + changeProjection: (globeState: boolean) => void; +}; + +// Preload textures globally so they are not reloaded during re-renders +const loader = new THREE.TextureLoader(); +const cmap = loader.load('/all_colormaps.png'); +const lsm = loader.load('/NaturalEarthCoastline2.jpg'); +const height = loader.load('/gebco_08_rev_elev_2k_HQ.jpg'); + +cmap.minFilter = THREE.NearestFilter; +cmap.magFilter = THREE.NearestFilter; +lsm.minFilter = THREE.NearestFilter; +lsm.magFilter = THREE.NearestFilter; +height.minFilter = THREE.NearestFilter; +height.magFilter = THREE.NearestFilter; + +const geometry = new THREE.PlaneGeometry(4, 2, 64 * 4, 32 * 4); + +const createCanvasTextureFromMultipleImages = async (imageUrls: string[]): Promise => { + return new Promise((resolve, reject) => { + const images: HTMLImageElement[] = []; + let imagesLoaded = 0; + + // Helper function to handle image loading + const onLoadImage = () => { + imagesLoaded++; + if (imagesLoaded === imageUrls.length) { + // All images are loaded, now concatenate them + const canvas = document.createElement("canvas"); + const context = canvas.getContext("2d"); + + if (context) { + const singleImageWidth = images[0].width; + const singleImageHeight = images[0].height; + + // Set the canvas width and height to accommodate all images horizontally + canvas.width = singleImageWidth * imageUrls.length; + canvas.height = singleImageHeight; + + // Draw each image side by side + images.forEach((img, index) => { + context.drawImage(img, index * singleImageWidth, 0); + }); + + resolve(canvas); + } else { + reject(new Error("Failed to get canvas context")); + } + } + }; + + // Load all images + imageUrls.forEach((url) => { + const img = new Image(); + img.crossOrigin = "Anonymous"; + img.onload = onLoadImage; + img.onerror = (error) => reject(error); + img.src = url; + images.push(img); + }); + }); +}; + +const createCanvasTextureFromCanvas = (canvas: HTMLCanvasElement, index: number, filter: string): THREE.CanvasTexture => { + const context = canvas.getContext("2d"); + if (context) { + const textureCanvas = document.createElement("canvas"); + const textureContext = textureCanvas.getContext("2d"); + + textureCanvas.width = 900; // Width of the texture canvas + textureCanvas.height = 450; // Height of the texture canvas + textureContext.drawImage(canvas, index * 900, 0, 900, 450, 0, 0, 900, 450); + + const texture = new THREE.CanvasTexture(textureCanvas); + texture.wrapS = texture.wrapT = THREE.RepeatWrapping; + if (filter === "nearest") { + texture.minFilter = THREE.NearestFilter; + texture.magFilter = THREE.NearestFilter; + } else { + texture.minFilter = THREE.LinearFilter; + texture.magFilter = THREE.LinearFilter; + } + + return texture; + } else { + throw new Error("Failed to get texture canvas context"); + } +}; + +const SurfaceLayer = memo( + forwardRef( + ({ forecastData, summarizedMeasurementData, isFilterNearest, isTimeInterpolation, selectedVariable }, ref) => { // Receive isTimeRunning as a prop + const surface_layer_ref = useRef(null); + const materialRef = useRef( + new THREE.ShaderMaterial({ + vertexShader: vertexShader, + fragmentShader: fragmentShader, + wireframe: false, + transparent: true, + side: THREE.DoubleSide, + uniforms: { + uFrame: { value: 0 }, + uFrameWeight: { value: 0 }, + uTimeInterpolation: { value: isTimeInterpolation }, + uSphereWrapAmount: { value: 0.0 }, + uHeightDisplacement: { value: 0.2 }, + uLayerHeight: { value: 0.0 }, + uLayerOpacity: { value: 0.0 }, + thisDataTexture: { value: null }, + nextDataTexture: { value: null }, + textureTimesteps: { value: null }, + thisDataMin: { value: new Float32Array(1) }, + thisDataMax: { value: new Float32Array(1) }, + nextDataMin: { value: null }, + nextDataMax: { value: null }, + referenceHeightTexture: { value: height }, + referenceDataMin: { value: null }, + referenceDataMax: { value: null }, + referenceDataHeightFlag: { value: false }, + colorMap: { value: cmap }, + colorMapIndex: { value: 0.0 }, + lsmTexture: { value: lsm }, + }, + }) + ); + + const fullImageCanvasRef = useRef(null); + const windowIndexRef = useRef(0); + + const { forecastDetails } = useForecastContext(); + const forecastBaseDate = forecastDetails.forecastBaseDate.toFormat('yyyy-MM-dd_HH'); + // const imageUrl = `http://localhost:5173/data_textures/${forecastBaseDate}/aqi_${forecastBaseDate}_CAMS_global.chunk_1_of_3.webp`; + + const imageUrls = [ + `http://localhost:5173/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_1_of_3.webp`, + `http://localhost:5173/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_2_of_3.webp`, + `http://localhost:5173/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_3_of_3.webp`, + ]; + + console.log(imageUrls) + + const fetchAndUpdateTextures = useCallback(async (filter: string) => { + try { + if (!fullImageCanvasRef.current) { + const fullCanvas = await createCanvasTextureFromMultipleImages(imageUrls); + fullImageCanvasRef.current = fullCanvas; + } + + const canvas = fullImageCanvasRef.current; + if (canvas) { + const thisCanvasTexture = createCanvasTextureFromCanvas( + canvas, + windowIndexRef.current, + filter + ); + const nextCanvasTexture = createCanvasTextureFromCanvas( + canvas, + windowIndexRef.current + 1, + filter + ); + + if (materialRef.current) { + materialRef.current.uniforms.thisDataTexture.value = thisCanvasTexture; + materialRef.current.uniforms.nextDataTexture.value = nextCanvasTexture; + } + } + } catch (error) { + console.error("Error processing image:", error); + } + }, [imageUrls]); + + if (isFilterNearest) { + fetchAndUpdateTextures("nearest"); + } else { + fetchAndUpdateTextures("linear"); + } + // fetchAndUpdateTextures("linear") + + // Handle the tick function to externally control weight and sphere wrapping + const tick = (sliderValue: number, uSphereWrapAmount: number) => { + if (materialRef.current) { + + + if (windowIndexRef.current != Math.floor(sliderValue)) { + windowIndexRef.current = Math.floor(sliderValue); // Loop through a max of 15 windows + if (isFilterNearest) { + fetchAndUpdateTextures("nearest"); + } else { + fetchAndUpdateTextures("linear"); + } + } + + // const currentTime = elapsedTimeRef.current; + var weight = 0.0 + if ( materialRef.current.uniforms.uTimeInterpolation.value) { + weight = sliderValue % 1; // Value between 0 and 1 + } + + if (materialRef.current) { + materialRef.current.uniforms.uFrameWeight.value = weight; + } + + // materialRef.current.uniforms.uFrameWeight.value = weight % 1; + // materialRef.current.uniforms.uSphereWrapAmount.value = uSphereWrapAmount; + // materialRef.current.uniforms.uLayerOpacity.value = 1.0; + } + }; + + const changeProjection = (globeState: boolean) => { + if (materialRef.current) { + if ( globeState ) { + gsap.to(materialRef.current.uniforms.uSphereWrapAmount, { value: 1.0, duration: 2 }); + } else { + gsap.to(materialRef.current.uniforms.uSphereWrapAmount, { value: 0.0, duration: 2 }); + } + } + }; + + const changeFilter = (filterState: boolean) => { + if (materialRef.current) { + if ( filterState ) { + fetchAndUpdateTextures("linear") + } else { + fetchAndUpdateTextures("nearest") + } + } + }; + + const changeTimeInterpolation = (timeInterpolationState: boolean) => { + if (materialRef.current) { + materialRef.current.uniforms.uTimeInterpolation.value = timeInterpolationState; + } + }; + + useImperativeHandle(ref, () => ({ + type: surface_layer_ref, + tick, + changeProjection, + changeFilter, + changeTimeInterpolation, + })); + return ( + + ); + } + ) +); + +export { SurfaceLayer }; diff --git a/air-quality-ui/src/components/globe/SurfaceLayer.tsx b/air-quality-ui/src/components/globe/SurfaceLayer.tsx index c0700edf..e790b484 100644 --- a/air-quality-ui/src/components/globe/SurfaceLayer.tsx +++ b/air-quality-ui/src/components/globe/SurfaceLayer.tsx @@ -4,31 +4,37 @@ import { useRef, memo, useCallback, + useEffect, // Import useEffect } from "react"; import * as THREE from "three"; import vertexShader from "./shaders/surfaceVert.glsl"; import fragmentShader from "./shaders/surfaceFrag.glsl"; -import { useForecastContext } from '../../context'; -import { gsap } from 'gsap'; +import { useForecastContext } from "../../context"; +import { gsap } from "gsap"; type PlaneType = THREE.Mesh; type SurfaceLayerProps = { - forecastData: Record; - summarizedMeasurementData: Record; + forecastData: ForecastResponseDto[]; + summarizedMeasurementData: MeasurementSummaryResponseDto[]; + isFilterNearest: boolean; + isTimeInterpolation: boolean; + selectedVariable: string; // Add this prop }; export type SurfaceLayerRef = { type: React.RefObject; tick: (weight: number, uSphereWrapAmount: number) => void; changeProjection: (globeState: boolean) => void; + changeFilter: (filterState: boolean) => void; + changeTimeInterpolation: (timeInterpolationState: boolean) => void; }; // Preload textures globally so they are not reloaded during re-renders const loader = new THREE.TextureLoader(); -const cmap = loader.load('/all_colormaps.png'); -const lsm = loader.load('/NaturalEarthCoastline2.jpg'); -const height = loader.load('/gebco_08_rev_elev_2k_HQ.jpg'); +const cmap = loader.load("/all_colormaps.png"); +const lsm = loader.load("/NaturalEarthCoastline2.jpg"); +const height = loader.load("/gebco_08_rev_elev_2k_HQ.jpg"); cmap.minFilter = THREE.NearestFilter; cmap.magFilter = THREE.NearestFilter; @@ -39,7 +45,9 @@ height.magFilter = THREE.NearestFilter; const geometry = new THREE.PlaneGeometry(4, 2, 64 * 4, 32 * 4); -const createCanvasTextureFromMultipleImages = async (imageUrls: string[]): Promise => { +const createCanvasTextureFromMultipleImages = async ( + imageUrls: string[] +): Promise => { return new Promise((resolve, reject) => { const images: HTMLImageElement[] = []; let imagesLoaded = 0; @@ -48,19 +56,14 @@ const createCanvasTextureFromMultipleImages = async (imageUrls: string[]): Promi const onLoadImage = () => { imagesLoaded++; if (imagesLoaded === imageUrls.length) { - // All images are loaded, now concatenate them const canvas = document.createElement("canvas"); const context = canvas.getContext("2d"); if (context) { const singleImageWidth = images[0].width; const singleImageHeight = images[0].height; - - // Set the canvas width and height to accommodate all images horizontally canvas.width = singleImageWidth * imageUrls.length; canvas.height = singleImageHeight; - - // Draw each image side by side images.forEach((img, index) => { context.drawImage(img, index * singleImageWidth, 0); }); @@ -84,20 +87,39 @@ const createCanvasTextureFromMultipleImages = async (imageUrls: string[]): Promi }); }; -const createCanvasTextureFromCanvas = (canvas: HTMLCanvasElement, index: number): THREE.CanvasTexture => { +const createCanvasTextureFromCanvas = ( + canvas: HTMLCanvasElement, + index: number, + filter: string +): THREE.CanvasTexture => { const context = canvas.getContext("2d"); if (context) { const textureCanvas = document.createElement("canvas"); const textureContext = textureCanvas.getContext("2d"); - textureCanvas.width = 900; // Width of the texture canvas - textureCanvas.height = 450; // Height of the texture canvas - textureContext.drawImage(canvas, index * 900, 0, 900, 450, 0, 0, 900, 450); + textureCanvas.width = 900; + textureCanvas.height = 450; + textureContext.drawImage( + canvas, + index * 900, + 0, + 900, + 450, + 0, + 0, + 900, + 450 + ); const texture = new THREE.CanvasTexture(textureCanvas); texture.wrapS = texture.wrapT = THREE.RepeatWrapping; - texture.minFilter = THREE.LinearFilter; - texture.magFilter = THREE.LinearFilter; + if (filter === "nearest") { + texture.minFilter = THREE.NearestFilter; + texture.magFilter = THREE.NearestFilter; + } else { + texture.minFilter = THREE.LinearFilter; + texture.magFilter = THREE.LinearFilter; + } return texture; } else { @@ -107,7 +129,16 @@ const createCanvasTextureFromCanvas = (canvas: HTMLCanvasElement, index: number) const SurfaceLayer = memo( forwardRef( - ({ forecastData, summarizedMeasurementData }, ref) => { // Receive isTimeRunning as a prop + ( + { + forecastData, + summarizedMeasurementData, + isFilterNearest, + isTimeInterpolation, + selectedVariable, + }, + ref + ) => { const surface_layer_ref = useRef(null); const materialRef = useRef( new THREE.ShaderMaterial({ @@ -119,6 +150,7 @@ const SurfaceLayer = memo( uniforms: { uFrame: { value: 0 }, uFrameWeight: { value: 0 }, + uTimeInterpolation: { value: isTimeInterpolation }, uSphereWrapAmount: { value: 0.0 }, uHeightDisplacement: { value: 0.2 }, uLayerHeight: { value: 0.0 }, @@ -137,92 +169,142 @@ const SurfaceLayer = memo( colorMap: { value: cmap }, colorMapIndex: { value: 0.0 }, lsmTexture: { value: lsm }, + uVariableIndex: { value: variableIndex }, }, }) ); + var variableIndex; + if (selectedVariable === "aqi") { + variableIndex = 1; + } else if (selectedVariable === "pm10") { + variableIndex = 2; + } + + materialRef.current.uniforms.uVariableIndex.value = variableIndex; + const fullImageCanvasRef = useRef(null); const windowIndexRef = useRef(0); const { forecastDetails } = useForecastContext(); - const forecastBaseDate = forecastDetails.forecastBaseDate.toFormat('yyyy-MM-dd_HH'); - // const imageUrl = `http://localhost:5173/data_textures/${forecastBaseDate}/aqi_${forecastBaseDate}_CAMS_global.chunk_1_of_3.webp`; + const forecastBaseDate = forecastDetails.forecastBaseDate.toFormat( + "yyyy-MM-dd_HH" + ); + // Generate image URLs based on the selected variable const imageUrls = [ - `http://localhost:5173/data_textures/${forecastBaseDate}/aqi_${forecastBaseDate}_CAMS_global.chunk_1_of_3.webp`, - `http://localhost:5173/data_textures/${forecastBaseDate}/aqi_${forecastBaseDate}_CAMS_global.chunk_2_of_3.webp`, - `http://localhost:5173/data_textures/${forecastBaseDate}/aqi_${forecastBaseDate}_CAMS_global.chunk_3_of_3.webp`, + `http://localhost:5173/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_1_of_3.webp`, + `http://localhost:5173/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_2_of_3.webp`, + `http://localhost:5173/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_3_of_3.webp`, ]; - const fetchAndUpdateTextures = useCallback(async () => { - try { - if (!fullImageCanvasRef.current) { - const fullCanvas = await createCanvasTextureFromMultipleImages(imageUrls); + const fetchAndUpdateTextures = useCallback( + async (filter: string) => { + try { + const fullCanvas = + fullImageCanvasRef.current || + (await createCanvasTextureFromMultipleImages(imageUrls)); fullImageCanvasRef.current = fullCanvas; - } - const canvas = fullImageCanvasRef.current; - if (canvas) { const thisCanvasTexture = createCanvasTextureFromCanvas( - canvas, - windowIndexRef.current + fullCanvas, + windowIndexRef.current, + filter ); const nextCanvasTexture = createCanvasTextureFromCanvas( - canvas, - windowIndexRef.current + 1 + fullCanvas, + windowIndexRef.current + 1, + filter ); if (materialRef.current) { - materialRef.current.uniforms.thisDataTexture.value = thisCanvasTexture; - materialRef.current.uniforms.nextDataTexture.value = nextCanvasTexture; + materialRef.current.uniforms.thisDataTexture.value = + thisCanvasTexture; + materialRef.current.uniforms.nextDataTexture.value = + nextCanvasTexture; } + } catch (error) { + console.error("Error processing image:", error); } - } catch (error) { - console.error("Error processing image:", error); - } - }, [imageUrls]); + }, + [imageUrls] + ); - fetchAndUpdateTextures() + // Effect to fetch new textures when `selectedVariable` changes + useEffect(() => { + // Reset canvas and reload textures + fullImageCanvasRef.current = null; + if (isFilterNearest) { + fetchAndUpdateTextures("nearest"); + } else { + fetchAndUpdateTextures("linear"); + } + }, [selectedVariable, fetchAndUpdateTextures, isFilterNearest]); // Handle the tick function to externally control weight and sphere wrapping const tick = (sliderValue: number, uSphereWrapAmount: number) => { if (materialRef.current) { - - if (windowIndexRef.current != Math.floor(sliderValue)) { windowIndexRef.current = Math.floor(sliderValue); // Loop through a max of 15 windows - fetchAndUpdateTextures(); // Fetch and update textures on each new frame + if (isFilterNearest) { + fetchAndUpdateTextures("nearest"); + } else { + fetchAndUpdateTextures("linear"); + } } - // const currentTime = elapsedTimeRef.current; - const weight = sliderValue % 1; // Value between 0 and 1 + var weight = 0.0; + if (materialRef.current.uniforms.uTimeInterpolation.value) { + weight = sliderValue % 1; // Value between 0 and 1 + } if (materialRef.current) { materialRef.current.uniforms.uFrameWeight.value = weight; } - - // materialRef.current.uniforms.uFrameWeight.value = weight % 1; - // materialRef.current.uniforms.uSphereWrapAmount.value = uSphereWrapAmount; - // materialRef.current.uniforms.uLayerOpacity.value = 1.0; } }; const changeProjection = (globeState: boolean) => { if (materialRef.current) { - if ( globeState ) { - gsap.to(materialRef.current.uniforms.uSphereWrapAmount, { value: 1.0, duration: 2 }); + if (globeState) { + gsap.to(materialRef.current.uniforms.uSphereWrapAmount, { + value: 1.0, + duration: 2, + }); + } else { + gsap.to(materialRef.current.uniforms.uSphereWrapAmount, { + value: 0.0, + duration: 2, + }); + } + } + }; + + const changeFilter = (filterState: boolean) => { + if (materialRef.current) { + if (filterState) { + fetchAndUpdateTextures("linear"); } else { - gsap.to(materialRef.current.uniforms.uSphereWrapAmount, { value: 0.0, duration: 2 }); - } + fetchAndUpdateTextures("nearest"); + } } }; + const changeTimeInterpolation = (timeInterpolationState: boolean) => { + if (materialRef.current) { + materialRef.current.uniforms.uTimeInterpolation.value = + timeInterpolationState; + } + }; useImperativeHandle(ref, () => ({ type: surface_layer_ref, tick, changeProjection, + changeFilter, + changeTimeInterpolation, })); + return ( (null); const markerRefs = useRef([]); // Array of refs for LocationMarkers const [isTimeRunning, setIsTimeRunning] = useState(true); // State to control time updates + const [isLocationMarkerOn, setIsLocationMarkerOn] = useState(false); // State for location marker + const [isFilterNearest, setGridFilterState] = useState(false); // State for enlarge button + const [isTimeInterpolation, setTimeInterpolationState] = useState(false); // State for enlarge button + const [selectedVariable, setSelectedVariable] = useState("aqi"); // State for selected variable from the dropdown // Function to toggle the time update on and off const toggleTimeUpdate = () => { setIsTimeRunning((prev) => !prev); }; + // Handle globe button state change const handleGlobeButtonClick = (globeState: boolean) => { surface_layer_ref.current?.changeProjection(globeState); + markerRefs.current.forEach((ref) => { + if (ref?.current) { + ref.current.changeProjection(globeState); + } + }); + }; - // Loop through all marker refs and call tick method + // Handle location marker button state change + const handleLocationMarkerButtonClick = (locationMarkerState: boolean) => { + setIsLocationMarkerOn(locationMarkerState); markerRefs.current.forEach((ref) => { - if (ref.current) ref.current.changeProjection(globeState); // Update each marker with new value - // ref?.tick(value, 0.0); // Update each marker with new value + if (ref?.current) { + ref.current.setVisible(locationMarkerState); + } }); }; - + + // Handle grid filter button state change + const handleGridFilterClick = (filterState: boolean) => { + setGridFilterState(filterState); + surface_layer_ref.current?.changeFilter(filterState); + }; + + // Handle time interpolation button state change + const handleTimeInterpolationClick = (timeInterpolationState: boolean) => { + setTimeInterpolationState(timeInterpolationState); + surface_layer_ref.current?.changeTimeInterpolation(timeInterpolationState); + }; + + // Handle dropdown variable selection + const handleVariableSelect = (variable: string) => { + setSelectedVariable(variable); // Update the selected variable state + }; + // Function to handle slider change const handleSliderChange = (value: number) => { surface_layer_ref.current?.tick(value, 0.0); - - // Loop through all marker refs and call tick method markerRefs.current.forEach((ref) => { if (ref.current) ref.current.tick(value, 0.0); // Update each marker with new value - // ref?.tick(value, 0.0); // Update each marker with new value }); }; @@ -56,13 +84,15 @@ const World = ({ ref={surface_layer_ref} forecastData={forecastData} summarizedMeasurementData={summarizedMeasurementData} + isFilterNearest={isFilterNearest} // Pass the state for grid filtering + isTimeInterpolation={isTimeInterpolation} // Pass the state for time interpolation + selectedVariable={selectedVariable} // Pass the selected variable from the dropdown /> {Object.keys(forecastData).map((key, index) => { const forecastSubset = forecastData[key]; const measurementSubset = summarizedMeasurementData[key]; - // Properly create a ref for each marker using createRef if (!markerRefs.current[index]) { markerRefs.current[index] = React.createRef(); } @@ -73,6 +103,8 @@ const World = ({ ref={markerRefs.current[index]} // Attach the ref to the marker forecastData={forecastSubset} // Passing the forecast data for this index measurementData={measurementSubset} // Passing the measurement data for this index + isLocationMarkerOn={isLocationMarkerOn} // Pass the location marker state + selectedVariable={selectedVariable} // Pass the selected variable to the marker /> ); })} @@ -80,12 +112,15 @@ const World = ({ - {/* Render Controls component below the canvas */} ); diff --git a/air-quality-ui/src/components/globe/shaders/surfaceFrag.glsl b/air-quality-ui/src/components/globe/shaders/surfaceFrag.glsl index d85fc78c..15331d78 100644 --- a/air-quality-ui/src/components/globe/shaders/surfaceFrag.glsl +++ b/air-quality-ui/src/components/globe/shaders/surfaceFrag.glsl @@ -8,6 +8,7 @@ uniform float thisDataMax[12]; uniform float uUserMinValue; uniform float uUserMaxValue; uniform float colorMapIndex; +uniform float uVariableIndex; uniform sampler2D thisDataTexture; uniform sampler2D nextDataTexture; @@ -53,6 +54,17 @@ void main() { float cmap_index = colorMapIndex; float opacity_cutoff = 0.0; +float remapMin; +float remapMax; + +if ( uVariableIndex == 1.0 ) { + remapMin = 1.0; + remapMax = 7.0; +} else if ( uVariableIndex == 2.0 ) { + remapMin = 0.0; + remapMax = 1000.0; +} + // convert relative bitmap value to absolute value for both frames float thisFrameData = remap( texture2D( @@ -61,8 +73,8 @@ float thisFrameData = remap( ).r, 0.0, 1.0, - 1.0, - 7.0); + remapMin, + remapMax); float nextFrameData = remap( texture2D( @@ -71,8 +83,8 @@ float nextFrameData = remap( ).r, 0.0, 1.0, - 1.0, - 7.0); + remapMin, + remapMax); // interpolate between absolute values of both frames float intData = mix(thisFrameData, nextFrameData, uFrameWeight); @@ -100,20 +112,50 @@ gl_FragColor = vec4(1.0); vec3 color; // Define colors for each range -if (intData >= 1.0 && intData < 2.0) { - color = vec3(129., 237., 229.); // Red -} else if (intData >= 2.0 && intData < 3.0) { - color = vec3(116.0, 201.0, 172.0); // Green -} else if (intData >= 3.0 && intData < 4.0) { - color = vec3(238.0, 230.0, 97.0); // Blue -} else if (intData >= 4.0 && intData < 5.0) { - color = vec3(236.0, 94.0, 87.0); // Yellow -} else if (intData >= 5.0 && intData < 6.0) { - color = vec3(137.0, 26.0, 52.0); // Orange -} else if (intData >= 6.0 && intData < 7.0) { - color = vec3(115.0, 40.0, 125.0); // Purple -} else { - color = vec3(0.0, 0.0, 0.0); // Black for values out of range + +// AQI +if ( uVariableIndex == 1.0 ) { + if (intData >= 1.0 && intData < 2.0) { + color = vec3(129., 237., 229.); // Red + } else if (intData >= 2.0 && intData < 3.0) { + color = vec3(116.0, 201.0, 172.0); // Green + } else if (intData >= 3.0 && intData < 4.0) { + color = vec3(238.0, 230.0, 97.0); // Blue + } else if (intData >= 4.0 && intData < 5.0) { + color = vec3(236.0, 94.0, 87.0); // Yellow + } else if (intData >= 5.0 && intData < 6.0) { + color = vec3(137.0, 26.0, 52.0); // Orange + } else if (intData >= 6.0 && intData < 7.0) { + color = vec3(115.0, 40.0, 125.0); // Purple + } else { + color = vec3(0.0, 0.0, 0.0); // Black for values out of range + } +} else if ( uVariableIndex == 2.0) { + if (intData < 30.0) { + color = vec3(255.0); // Red + } else if (intData < 40.0) { + color = vec3(233.0, 249.0, 188.0); // Green + } else if (intData < 50.0) { + color = vec3(198.0, 255.0, 199.0); // Blue + } else if (intData < 60.0) { + color = vec3(144.0, 237.0, 169.0); // Yellow + } else if (intData < 80.0) { + color = vec3(76.0, 180.0, 148.0); // Orange + } else if (intData < 100.0) { + color = vec3(48.0, 155.0, 138.0); // Purple + } else if (intData < 150.0) { + color = vec3(47.0, 137.0, 169.0); // Yellow + } else if (intData < 200.0) { + color = vec3(16.0, 99.0, 164.0); // Orange + } else if (intData < 300.0) { + color = vec3(13.0, 69.0, 126.0); // Purple + } else if (intData < 500.0) { + color = vec3(15.0, 26.0, 136.0); // Orange + } else if (intData < 1000.0) { + color = vec3(38.0, 2.0, 60.0); // Purple + } else { + color = vec3(0.0, 0.0, 0.0); // Black for values out of range + } } gl_FragColor = vec4(color/255., 1.0); From 4a8a6d75a0684800fa2d74b9d63395d45a580cd4 Mon Sep 17 00:00:00 2001 From: sebsteinig Date: Wed, 11 Sep 2024 19:03:15 +0100 Subject: [PATCH 11/39] switched to deployed data_tetxures --- air-quality-ui/package-lock.json | 170 ++++++++++++++++++ air-quality-ui/package.json | 1 + .../src/components/globe/Controls.tsx | 2 +- .../src/components/globe/LocationMarker.tsx | 4 +- .../src/components/globe/SurfaceLayer.tsx | 23 ++- air-quality-ui/src/components/globe/World.tsx | 6 + air-quality-ui/vite.config copy.ts | 8 + air-quality-ui/vite.config.ts | 15 +- 8 files changed, 220 insertions(+), 9 deletions(-) create mode 100644 air-quality-ui/vite.config copy.ts diff --git a/air-quality-ui/package-lock.json b/air-quality-ui/package-lock.json index 86f6088c..09b8fd7f 100644 --- a/air-quality-ui/package-lock.json +++ b/air-quality-ui/package-lock.json @@ -52,6 +52,7 @@ "identity-obj-proxy": "^3.0.0", "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", + "r3f-perf": "^7.2.1", "ts-jest": "^29.1.4", "ts-jest-mock-import-meta": "^1.2.0", "ts-node": "^10.9.2", @@ -2522,6 +2523,15 @@ "url": "https://opencollective.com/popperjs" } }, + "node_modules/@radix-ui/react-icons": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-icons/-/react-icons-1.3.0.tgz", + "integrity": "sha512-jQxj/0LKgp+j9BiTXz3O3sgs26RNet2iLWmsPyRz2SIcR4q/4SbazXfnYwbAr+vLYKSfc7qxzyGQA1HLlYiuNw==", + "dev": true, + "peerDependencies": { + "react": "^16.x || ^17.x || ^18.x" + } + }, "node_modules/@react-spring/animated": { "version": "9.6.1", "resolved": "https://registry.npmjs.org/@react-spring/animated/-/animated-9.6.1.tgz", @@ -2923,6 +2933,15 @@ "@sinonjs/commons": "^3.0.0" } }, + "node_modules/@stitches/react": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@stitches/react/-/react-1.2.8.tgz", + "integrity": "sha512-9g9dWI4gsSVe8bNLlb+lMkBYsnIKCZTmvqvDG+Avnn69XfmHZKiaMrx7cgTaddq7aTPPmXiTsbFcUy0xgI4+wA==", + "dev": true, + "peerDependencies": { + "react": ">= 16.3.0" + } + }, "node_modules/@tanstack/query-core": { "version": "5.51.21", "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.51.21.tgz", @@ -3721,6 +3740,23 @@ "react": ">= 16.8.0" } }, + "node_modules/@utsubo/events": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/@utsubo/events/-/events-0.1.7.tgz", + "integrity": "sha512-WB/GEj/0h27Bz8rJ0+CBtNz5mLT79ne1OjB7PUM4n0qLBqEDwm6yBzZC3j6tasHjlBPJDYZiBVIA1glaMlgZ5g==", + "dev": true, + "dependencies": { + "eventemitter3": "^4.0.7" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + } + } + }, "node_modules/@vitejs/plugin-react": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.1.tgz", @@ -5840,6 +5876,12 @@ "node": ">=0.10.0" } }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, "node_modules/execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", @@ -10228,6 +10270,74 @@ "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-3.0.0.tgz", "integrity": "sha512-XdjUArbK4Bm5fLLvlm5KpTFOiOThgfWWI4axAZDWg4E/0mKdZyI9tNEfds27qCi1ze/vwTR16kvmmGhRra3c2g==" }, + "node_modules/r3f-perf": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/r3f-perf/-/r3f-perf-7.2.1.tgz", + "integrity": "sha512-asMr55SqotdT7qtd4gCHGdISGUOL5D3W62LnSm/9lkDIaC/eYg0oh8Vdu3LuyT19tS/O6x1nbPZ11UGdrDJKkA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@radix-ui/react-icons": "^1.3.0", + "@react-three/drei": "^9.103.0", + "@stitches/react": "^1.2.8", + "@utsubo/events": "^0.1.7", + "zustand": "~4.5.2" + }, + "peerDependencies": { + "@react-three/fiber": ">=8.0", + "react": ">=18.0", + "react-dom": ">=18.0", + "three": ">=0.133" + }, + "peerDependenciesMeta": { + "@react-three/fiber": { + "optional": true + }, + "dom": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/r3f-perf/node_modules/use-sync-external-store": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz", + "integrity": "sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==", + "dev": true, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/r3f-perf/node_modules/zustand": { + "version": "4.5.5", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.5.tgz", + "integrity": "sha512-+0PALYNJNgK6hldkgDq2vLrw5f6g/jCInz52n9RTpropGgeAf/ioFUCdtsjCqu4gNhW9D01rUQBROoRjdzyn2Q==", + "dev": true, + "dependencies": { + "use-sync-external-store": "1.2.2" + }, + "engines": { + "node": ">=12.7.0" + }, + "peerDependencies": { + "@types/react": ">=16.8", + "immer": ">=9.0.6", + "react": ">=16.8" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "immer": { + "optional": true + }, + "react": { + "optional": true + } + } + }, "node_modules/react": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", @@ -13899,6 +14009,13 @@ "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", "peer": true }, + "@radix-ui/react-icons": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-icons/-/react-icons-1.3.0.tgz", + "integrity": "sha512-jQxj/0LKgp+j9BiTXz3O3sgs26RNet2iLWmsPyRz2SIcR4q/4SbazXfnYwbAr+vLYKSfc7qxzyGQA1HLlYiuNw==", + "dev": true, + "requires": {} + }, "@react-spring/animated": { "version": "9.6.1", "resolved": "https://registry.npmjs.org/@react-spring/animated/-/animated-9.6.1.tgz", @@ -14131,6 +14248,13 @@ "@sinonjs/commons": "^3.0.0" } }, + "@stitches/react": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@stitches/react/-/react-1.2.8.tgz", + "integrity": "sha512-9g9dWI4gsSVe8bNLlb+lMkBYsnIKCZTmvqvDG+Avnn69XfmHZKiaMrx7cgTaddq7aTPPmXiTsbFcUy0xgI4+wA==", + "dev": true, + "requires": {} + }, "@tanstack/query-core": { "version": "5.51.21", "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.51.21.tgz", @@ -14760,6 +14884,15 @@ "@use-gesture/core": "10.3.1" } }, + "@utsubo/events": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/@utsubo/events/-/events-0.1.7.tgz", + "integrity": "sha512-WB/GEj/0h27Bz8rJ0+CBtNz5mLT79ne1OjB7PUM4n0qLBqEDwm6yBzZC3j6tasHjlBPJDYZiBVIA1glaMlgZ5g==", + "dev": true, + "requires": { + "eventemitter3": "^4.0.7" + } + }, "@vitejs/plugin-react": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.1.tgz", @@ -16307,6 +16440,12 @@ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, "execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", @@ -19508,6 +19647,37 @@ "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-3.0.0.tgz", "integrity": "sha512-XdjUArbK4Bm5fLLvlm5KpTFOiOThgfWWI4axAZDWg4E/0mKdZyI9tNEfds27qCi1ze/vwTR16kvmmGhRra3c2g==" }, + "r3f-perf": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/r3f-perf/-/r3f-perf-7.2.1.tgz", + "integrity": "sha512-asMr55SqotdT7qtd4gCHGdISGUOL5D3W62LnSm/9lkDIaC/eYg0oh8Vdu3LuyT19tS/O6x1nbPZ11UGdrDJKkA==", + "dev": true, + "requires": { + "@radix-ui/react-icons": "^1.3.0", + "@react-three/drei": "^9.103.0", + "@stitches/react": "^1.2.8", + "@utsubo/events": "^0.1.7", + "zustand": "~4.5.2" + }, + "dependencies": { + "use-sync-external-store": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz", + "integrity": "sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==", + "dev": true, + "requires": {} + }, + "zustand": { + "version": "4.5.5", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.5.tgz", + "integrity": "sha512-+0PALYNJNgK6hldkgDq2vLrw5f6g/jCInz52n9RTpropGgeAf/ioFUCdtsjCqu4gNhW9D01rUQBROoRjdzyn2Q==", + "dev": true, + "requires": { + "use-sync-external-store": "1.2.2" + } + } + } + }, "react": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", diff --git a/air-quality-ui/package.json b/air-quality-ui/package.json index 8b643473..756affce 100644 --- a/air-quality-ui/package.json +++ b/air-quality-ui/package.json @@ -58,6 +58,7 @@ "identity-obj-proxy": "^3.0.0", "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", + "r3f-perf": "^7.2.1", "ts-jest": "^29.1.4", "ts-jest-mock-import-meta": "^1.2.0", "ts-node": "^10.9.2", diff --git a/air-quality-ui/src/components/globe/Controls.tsx b/air-quality-ui/src/components/globe/Controls.tsx index 45c37693..239af580 100644 --- a/air-quality-ui/src/components/globe/Controls.tsx +++ b/air-quality-ui/src/components/globe/Controls.tsx @@ -26,7 +26,7 @@ const Controls: React.FC = ({ const [globeAnimationState, setGlobeAnimationState] = useState(false); // State for globe animation const [locationMarkerState, setLocationMarkerState] = useState(false); // State for location marker const [filterState, setGridFilterState] = useState(false); // State for grid filter - const [timeInterpolationState, setTimeInterpolationState] = useState(false); // State for time interpolation + const [timeInterpolationState, setTimeInterpolationState] = useState(true); // State for time interpolation const [timeDelta, setTimeDelta] = useState(0.02); // State for the speed of the slider's advancement const [selectedVariable, setSelectedVariable] = useState('aqi'); // Default variable to display diff --git a/air-quality-ui/src/components/globe/LocationMarker.tsx b/air-quality-ui/src/components/globe/LocationMarker.tsx index cc0e0129..58b2e884 100644 --- a/air-quality-ui/src/components/globe/LocationMarker.tsx +++ b/air-quality-ui/src/components/globe/LocationMarker.tsx @@ -367,10 +367,10 @@ const LocationMarker = forwardRef( {/* Add a ring for the equator line */} - + {/* - + */} ); } diff --git a/air-quality-ui/src/components/globe/SurfaceLayer.tsx b/air-quality-ui/src/components/globe/SurfaceLayer.tsx index e790b484..511b07fb 100644 --- a/air-quality-ui/src/components/globe/SurfaceLayer.tsx +++ b/air-quality-ui/src/components/globe/SurfaceLayer.tsx @@ -12,6 +12,8 @@ import fragmentShader from "./shaders/surfaceFrag.glsl"; import { useForecastContext } from "../../context"; import { gsap } from "gsap"; +const API_URL = import.meta.env.VITE_AIR_QUALITY_API_URL + type PlaneType = THREE.Mesh; type SurfaceLayerProps = { @@ -150,7 +152,7 @@ const SurfaceLayer = memo( uniforms: { uFrame: { value: 0 }, uFrameWeight: { value: 0 }, - uTimeInterpolation: { value: isTimeInterpolation }, + uTimeInterpolation: { value: true }, uSphereWrapAmount: { value: 0.0 }, uHeightDisplacement: { value: 0.2 }, uLayerHeight: { value: 0.0 }, @@ -192,12 +194,25 @@ const SurfaceLayer = memo( ); // Generate image URLs based on the selected variable + // const imageUrls = [ + // `http://localhost:5173/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_1_of_3.webp`, + // `http://localhost:5173/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_2_of_3.webp`, + // `http://localhost:5173/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_3_of_3.webp`, + // ]; + + // const imageUrls = [ + // `http://64.225.143.231/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_1_of_3.webp`, + // `http://64.225.143.231/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_2_of_3.webp`, + // `http://64.225.143.231/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_3_of_3.webp`, + // ]; + const imageUrls = [ - `http://localhost:5173/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_1_of_3.webp`, - `http://localhost:5173/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_2_of_3.webp`, - `http://localhost:5173/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_3_of_3.webp`, + `/volume/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_1_of_3.webp`, + `/volume/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_2_of_3.webp`, + `/volume/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_3_of_3.webp`, ]; + const fetchAndUpdateTextures = useCallback( async (filter: string) => { try { diff --git a/air-quality-ui/src/components/globe/World.tsx b/air-quality-ui/src/components/globe/World.tsx index 0dd10fc8..83a6e868 100644 --- a/air-quality-ui/src/components/globe/World.tsx +++ b/air-quality-ui/src/components/globe/World.tsx @@ -1,5 +1,6 @@ import React, { useRef, useState } from 'react'; // Add this import import { Canvas } from '@react-three/fiber'; +import { Perf } from 'r3f-perf' import { OrbitControls } from '@react-three/drei'; import { SurfaceLayer, SurfaceLayerRef } from './SurfaceLayer'; import LocationMarker, { LocationMarkerRef } from './LocationMarker'; @@ -77,6 +78,10 @@ const World = ({ @@ -110,6 +115,7 @@ const World = ({ })} + path.replace(/^\/volume/, ''), + } + } + } +}); \ No newline at end of file From 47450859752b580746fd59d7198caf8ef90b1c92 Mon Sep 17 00:00:00 2001 From: sebsteinig Date: Thu, 12 Sep 2024 00:32:59 +0100 Subject: [PATCH 12/39] instanced location amrkers --- .../src/components/globe/Controls.tsx | 12 +- ...arker copy.tsx => LocationMarker.loop.tsx} | 172 +++++--- .../src/components/globe/LocationMarker.tsx | 407 ++++++++++-------- .../src/components/globe/SurfaceLayer.tsx | 42 +- .../src/components/globe/World.loop.tsx | 143 ++++++ air-quality-ui/src/components/globe/World.tsx | 66 +-- .../components/summary-view/GlobalSummary.tsx | 1 + 7 files changed, 540 insertions(+), 303 deletions(-) rename air-quality-ui/src/components/globe/{LocationMarker copy.tsx => LocationMarker.loop.tsx} (60%) create mode 100644 air-quality-ui/src/components/globe/World.loop.tsx diff --git a/air-quality-ui/src/components/globe/Controls.tsx b/air-quality-ui/src/components/globe/Controls.tsx index 239af580..f2eb0b01 100644 --- a/air-quality-ui/src/components/globe/Controls.tsx +++ b/air-quality-ui/src/components/globe/Controls.tsx @@ -24,10 +24,10 @@ const Controls: React.FC = ({ }) => { const [sliderValue, setSliderValue] = useState(0.0); // Default slider value const [globeAnimationState, setGlobeAnimationState] = useState(false); // State for globe animation - const [locationMarkerState, setLocationMarkerState] = useState(false); // State for location marker + const [locationMarkerState, setLocationMarkerState] = useState(true); // State for location marker const [filterState, setGridFilterState] = useState(false); // State for grid filter const [timeInterpolationState, setTimeInterpolationState] = useState(true); // State for time interpolation - const [timeDelta, setTimeDelta] = useState(0.02); // State for the speed of the slider's advancement + const [timeDelta, setTimeDelta] = useState(0.06); // State for the speed of the slider's advancement const [selectedVariable, setSelectedVariable] = useState('aqi'); // Default variable to display // Handle slider change from user input @@ -40,7 +40,7 @@ const Controls: React.FC = ({ const numForecastHours = forecastDetails.maxForecastDate.diff(forecastDetails.forecastBaseDate, 'hours').hours; const numForecastTimeSteps = numForecastHours / 3; - const currentDate = forecastDetails.forecastBaseDate.plus({ hours: Math.floor(sliderValue * 3) }).toFormat('yyyy-MM-dd T'); + const currentDate = forecastDetails.forecastBaseDate.plus({ hours: Math.floor(sliderValue * 3) }).toFormat('yyyy-MM-dd T')+' UTC'; // Effect to notify parent of slider changes useEffect(() => { @@ -52,7 +52,7 @@ const Controls: React.FC = ({ if (isTimeRunning) { const interval = setInterval(() => { setSliderValue((prevValue) => (prevValue >= numForecastTimeSteps ? 0 : prevValue + timeDelta)); - }, 20); + }, 25); return () => clearInterval(interval); // Clean up the interval } @@ -90,12 +90,12 @@ const Controls: React.FC = ({ // Increase timeDelta const handleIncreaseTimeDelta = () => { - setTimeDelta((prevDelta) => prevDelta + 0.01); // Increase by 0.01 + setTimeDelta((prevDelta) => prevDelta + 0.02); // Increase by 0.01 }; // Decrease timeDelta const handleDecreaseTimeDelta = () => { - setTimeDelta((prevDelta) => Math.max(0.01, prevDelta - 0.01)); // Decrease by 0.01, but don't go below 0.01 + setTimeDelta((prevDelta) => Math.max(0.02, prevDelta - 0.02)); // Decrease by 0.01, but don't go below 0.01 }; return ( diff --git a/air-quality-ui/src/components/globe/LocationMarker copy.tsx b/air-quality-ui/src/components/globe/LocationMarker.loop.tsx similarity index 60% rename from air-quality-ui/src/components/globe/LocationMarker copy.tsx rename to air-quality-ui/src/components/globe/LocationMarker.loop.tsx index 597882de..58b2e884 100644 --- a/air-quality-ui/src/components/globe/LocationMarker copy.tsx +++ b/air-quality-ui/src/components/globe/LocationMarker.loop.tsx @@ -1,4 +1,4 @@ -import { useRef, forwardRef, useImperativeHandle } from 'react'; +import { useRef, forwardRef, useImperativeHandle, useEffect } from 'react'; import { Mesh } from 'three'; import CustomShaderMaterial from 'three-custom-shader-material'; import * as THREE from 'three'; @@ -10,6 +10,7 @@ type LocationMarkerProps = { measurementData: MeasurementSummaryResponseDto; thisRotationsFrame: THREE.Texture; nextRotationsFrame: THREE.Texture; + selectedVariable: string; }; export type LocationMarkerRef = { @@ -19,7 +20,7 @@ export type LocationMarkerRef = { const LocationMarker = forwardRef( - ({ forecastData, measurementData, thisRotationsFrame, nextRotationsFrame }, ref): JSX.Element => { + ({ forecastData, measurementData, thisRotationsFrame, nextRotationsFrame, selectedVariable }, ref): JSX.Element => { const markerRef = useRef(null); const ringRef = useRef(null); // Ref for the ring geometry const { camera } = useThree(); // Access the camera @@ -29,24 +30,62 @@ const LocationMarker = forwardRef( const lat = forecastData[0].location.latitude; const lon = forecastData[0].location.longitude; - // Extract point data from forecastData - const forecastDataArray = forecastData.map((data) => data.overall_aqi_level); - const forecastDataArrayUniform = new Float32Array(forecastDataArray); - - // and the same array for the average measurement data - const measurementArray = forecastData.map((forecastEntry) => { - // Find a corresponding measurement entry by matching valid_time and measurement_base_time - const matchingMeasurement = measurementData?.find( - (measurementEntry) => measurementEntry.measurement_base_time === forecastEntry.valid_time - ); + const createDataArrays = (forecastData: ForecastResponseDto[], measurementData: MeasurementSummaryResponseDto[], variable: string) => { + + let variable_name; + if ( variable === "aqi" ) { + variable_name = "overall_aqi_level"; + } else if ( variable === "pm10" ) { + variable_name = "pm10"; + } + + // Extract point data from forecastData + const forecastDataArray = forecastData.map((data) => data[variable_name]); + const forecastDataArrayUniform = new Float32Array(forecastDataArray); + + // and the same array for the average measurement data + const measurementArray = forecastData.map((forecastEntry) => { + // Find a corresponding measurement entry by matching valid_time and measurement_base_time + const matchingMeasurement = measurementData?.find( + (measurementEntry) => measurementEntry.measurement_base_time === forecastEntry.valid_time + ); + + if ( variable === "aqi") { + // If a matching measurement is found, return the overall_aqi_level, otherwise return a missing value (e.g., -1) + return matchingMeasurement && matchingMeasurement[variable_name] + ? matchingMeasurement[variable_name].mean + : -1; + } else { + return matchingMeasurement && matchingMeasurement[variable_name] + ? matchingMeasurement[variable_name].mean.value + : -1; + } + }); + + const measurementDataArrayUniform = new Float32Array(measurementArray); + + return { forecastDataArrayUniform, measurementDataArrayUniform }; + } + + // // Extract point data from forecastData + // const forecastDataArray = forecastData.map((data) => data.overall_aqi_level); + // const forecastDataArrayUniform = new Float32Array(forecastDataArray); + + // // and the same array for the average measurement data + // const measurementArray = forecastData.map((forecastEntry) => { + // // Find a corresponding measurement entry by matching valid_time and measurement_base_time + // const matchingMeasurement = measurementData?.find( + // (measurementEntry) => measurementEntry.measurement_base_time === forecastEntry.valid_time + // ); - // If a matching measurement is found, return the overall_aqi_level, otherwise return a missing value (e.g., -1) - return matchingMeasurement ? matchingMeasurement.overall_aqi_level.mean : -1; - }); + // // If a matching measurement is found, return the overall_aqi_level, otherwise return a missing value (e.g., -1) + // return matchingMeasurement ? matchingMeasurement.overall_aqi_level.mean : -1; + // }); - const measurementDataArrayUniform = new Float32Array(measurementArray); + // const measurementDataArrayUniform = new Float32Array(measurementArray); - + + const { forecastDataArrayUniform, measurementDataArrayUniform } = createDataArrays(forecastData, measurementData, selectedVariable); // Animation or build time (example values) const shaderUniforms = { uSphereWrapAmount: { value: 0.0 }, @@ -56,6 +95,16 @@ const LocationMarker = forwardRef( const markerSize = 0.025; const markerColor = [0.25, 0.25, 0.25]; // Example color + // Re-trigger component on selectedVariable change + useEffect(() => { + if (markerRef.current) { + const { forecastDataArrayUniform, measurementDataArrayUniform } = createDataArrays(forecastData, measurementData, selectedVariable); + markerRef.current.material.uniforms.uForecastData.value = forecastDataArrayUniform; + markerRef.current.material.uniforms.uMeasurementData.value = measurementDataArrayUniform; + markerRef.current.material.uniforms.uVariableIndex.value = selectedVariable === "aqi" ? 1.0 : 2.0; // Example to set variable type + } + }, [selectedVariable, forecastDataArrayUniform, measurementDataArrayUniform]); + // Scale based on camera zoom or position const scaleBasedOnZoom = () => { if (markerRef.current) { @@ -135,10 +184,10 @@ const LocationMarker = forwardRef( } // Function to get color based on the value and variable type - vec3 getColorForValue(float value, int variableType) { + vec3 getColorForValue(float value, float uVariableIndex) { vec3 color; - if (variableType == 1) { // "aqi" + if (uVariableIndex == 1.0) { // "aqi" if (value >= 1.0 && value < 2.0) { color = vec3(129.0 / 255.0, 237.0 / 255.0, 229.0 / 255.0); } else if (value >= 2.0 && value < 3.0) { @@ -154,24 +203,46 @@ const LocationMarker = forwardRef( } else { color = vec3(0.15, 0.15, 0.15); // Default to dark grey } - } - // Add more variable types as needed - else { - color = vec3(1.0, 1.0, 1.0); // Default to white - } + } else if (uVariableIndex == 2.0) { // "pm10" + if (value < 30.0) { + color = vec3(1.0, 1.0, 1.0); + } else if (value < 40.0) { + color = vec3(233.0/ 255.0, 249.0/ 255.0, 188.0/ 255.0); // Green + } else if (value < 50.0) { + color = vec3(198.0/ 255.0, 255.0/ 255.0, 199.0/ 255.0); // Blue + } else if (value < 60.0) { + color = vec3(144.0/ 255.0, 237.0/ 255.0, 169.0/ 255.0); // Yellow + } else if (value < 80.0) { + color = vec3(76.0/ 255.0, 180.0/ 255.0, 148.0/ 255.0); // Orange + } else if (value < 100.0) { + color = vec3(48.0/ 255.0, 155.0/ 255.0, 138.0/ 255.0); // Purple + } else if (value < 150.0) { + color = vec3(47.0/ 255.0, 137.0/ 255.0, 169.0/ 255.0); // Yellow + } else if (value < 200.0) { + color = vec3(16.0/ 255.0, 99.0/ 255.0, 164.0/ 255.0); // Orange + } else if (value < 300.0) { + color = vec3(13.0/ 255.0, 69.0/ 255.0, 126.0/ 255.0); // Purple + } else if (value < 500.0) { + color = vec3(15.0/ 255.0, 26.0/ 255.0, 136.0/ 255.0); // Orange + } else if (value < 1000.0) { + color = vec3(38.0/ 255.0, 2.0/ 255.0, 60.0/ 255.0); // Purple + } else { + color = vec3(0.0, 0.0, 0.0); // Black for values out of range + } + } return color; } #define M_PI 3.14159265 + uniform float uVariableIndex; uniform float uSphereWrapAmount; uniform float uLat; uniform float uLon; uniform float uForecastData[40]; uniform float uMeasurementData[40]; uniform int uFrame; - uniform int uVariableType; uniform float uFrameWeight; uniform float uZoomLevel; uniform bool uVariableSize; @@ -199,36 +270,37 @@ const LocationMarker = forwardRef( float nextDiff; float diff = 1.0; - forecastValue = clamp(forecastValue, 1.0, 6.0); - measurementValue = clamp(measurementValue, 1.0, 6.0); - nextForecastValue = clamp(nextForecastValue, 1.0, 6.0); - nextMeasurementValue = clamp(nextMeasurementValue, 1.0, 6.0); - - // if ( (forecastValue > 0.0) && (measurementValue > 0.0) ) { - // thisDiff = abs(measurementValue-forecastValue); - // // if ( (nextForecastValue > 0.0) && (nextMeasurementValue > 0.0) ) { - // nextDiff = abs(nextMeasurementValue-nextForecastValue); - // diff = mix(thisDiff, nextDiff, uFrameWeight); - // // } - // // diff = thisDiff; - - // } else { - // diff = 1.0; - // } - // if (diff < 1.0) { - // diff = 1.0; - // } + float minValue; + float maxValue; + + if (uVariableIndex == 1.0) { + minValue = 1.0; + maxValue = 6.0; + } else if (uVariableIndex == 2.0) { + minValue = 0.0; + maxValue = 1000.0; + } + + forecastValue = clamp(forecastValue, minValue, maxValue); + measurementValue = clamp(measurementValue, minValue, maxValue); + nextForecastValue = clamp(nextForecastValue, minValue, maxValue); + nextMeasurementValue = clamp(nextMeasurementValue, minValue, maxValue); thisDiff = abs(measurementValue-forecastValue); nextDiff = abs(nextMeasurementValue-nextForecastValue); diff = mix(thisDiff, nextDiff, uFrameWeight); - diff = clamp(diff, 1.0, 6.0); + + if (uVariableIndex == 1.0) { + diff = clamp(diff, 1.0, 6.0); + } else if (uVariableIndex == 2.0) { + diff = clamp(diff/10.0, 1.0, 4.0); + } vec3 color; if ( (measurementValueInterpolated > 0.0 ) || (diff > 1.0) ) { - color = getColorForValue(measurementValue, uVariableType); + color = getColorForValue(measurementValue, uVariableIndex); } else { - color = getColorForValue(0.0, uVariableType); + color = getColorForValue(0.0, uVariableIndex); } vColor = adjustSaturation(color, 2.0); // Increase saturation @@ -288,15 +360,17 @@ const LocationMarker = forwardRef( uForecastData: { value: forecastDataArrayUniform }, uMeasurementData: { value: measurementDataArrayUniform }, uVariableType: { value: 1 }, // Example variable type + uVariableIndex: { value: 2.0 }, }} transparent /> + {/* Add a ring for the equator line */} - + {/* - + */} ); } diff --git a/air-quality-ui/src/components/globe/LocationMarker.tsx b/air-quality-ui/src/components/globe/LocationMarker.tsx index 58b2e884..e361472f 100644 --- a/air-quality-ui/src/components/globe/LocationMarker.tsx +++ b/air-quality-ui/src/components/globe/LocationMarker.tsx @@ -1,179 +1,225 @@ -import { useRef, forwardRef, useImperativeHandle, useEffect } from 'react'; -import { Mesh } from 'three'; +import { useRef, forwardRef, useImperativeHandle, useEffect, useState } from 'react'; +import { InstancedMesh, Object3D, DataTexture, RGBAFormat, FloatType } from 'three'; import CustomShaderMaterial from 'three-custom-shader-material'; import * as THREE from 'three'; import { useThree, useFrame } from '@react-three/fiber'; import { gsap } from 'gsap'; +import { Float } from '@react-three/drei'; type LocationMarkerProps = { - forecastData: ForecastResponseDto; - measurementData: MeasurementSummaryResponseDto; - thisRotationsFrame: THREE.Texture; - nextRotationsFrame: THREE.Texture; - selectedVariable: string; + forecastData: Record; + measurementData: Record; + selectedVariable: string; + isVisible: boolean; }; export type LocationMarkerRef = { tick: (weight: number, uSphereWrapAmount: number) => void; changeProjection: (globeState: boolean) => void; + setVisible: (isVisible: boolean) => void; }; +// Uniforms used in the custom shader material +const shaderUniforms = { + uSphereWrapAmount: { value: 0.0 }, + uFrameWeight: { value: 0.5 }, + uFrame: { value: 0.0 }, +}; + +// Utility function to flatten forecast and measurement data +const createDataArrays = ( + forecastData: Record, + measurementData: Record, + variable: string +) => { + let variable_name; + if (variable === 'aqi') { + variable_name = 'overall_aqi_level'; + } else if (variable === 'pm10') { + variable_name = 'pm10'; + } + + const forecastDataArray: number[] = []; + const measurementDataArray: number[] = []; + + // Loop through each city and process forecast and measurement data + Object.keys(forecastData).forEach((city) => { + const cityForecastData = forecastData[city]; + const cityMeasurementData = measurementData[city] || []; // Measurement data may be missing for some cities + + // Process forecast data + cityForecastData.forEach((forecastEntry) => { + const forecastValue = forecastEntry[variable_name]; + forecastDataArray.push(forecastValue); + }); + + // Process measurement data by matching valid_time with measurement_base_time + cityForecastData.forEach((forecastEntry) => { + const matchingMeasurement = cityMeasurementData.find( + (measurementEntry) => + measurementEntry.measurement_base_time === forecastEntry.valid_time + ); + + if (variable === 'aqi') { + // For AQI, return the overall_aqi_level.mean, or -1 if no match is found + const measurementValue = + matchingMeasurement && matchingMeasurement[variable_name] + ? matchingMeasurement[variable_name].mean + : -1; + measurementDataArray.push(measurementValue); + } else { + // For PM10, return the overall_aqi_level.mean.value, or -1 if no match is found + const measurementValue = + matchingMeasurement && matchingMeasurement[variable_name] + ? matchingMeasurement[variable_name].mean.value + : -1; + measurementDataArray.push(measurementValue); + } + }); + }); + + // Convert the data into vec4 (RGBA format) + const forecastDataVec4Array = new Float32Array(forecastDataArray.length * 4); + const measurementDataVec4Array = new Float32Array(measurementDataArray.length * 4); + + + const numCities = Object.keys(forecastData).length; + const numEntries = forecastDataArray.length / numCities; + + // Fill the vec4 array in column-major order (column-first layout) + for (let row = 0; row < numEntries; row++) { + for (let col = 0; col < numCities; col++) { + const index = col * numEntries + row; // Row-major index + const columnMajorIndex = row * numCities + col; // Column-major index + + // Place the value in the red channel of the vec4 + forecastDataVec4Array.set([forecastDataArray[index], 0, 0, 0], columnMajorIndex * 4); + measurementDataVec4Array.set([measurementDataArray[index], 0, 0, 0], columnMajorIndex * 4); + } + } + + console.log(forecastDataVec4Array) + + + + return { forecastDataVec4Array, measurementDataVec4Array }; +}; const LocationMarker = forwardRef( - ({ forecastData, measurementData, thisRotationsFrame, nextRotationsFrame, selectedVariable }, ref): JSX.Element => { - const markerRef = useRef(null); - const ringRef = useRef(null); // Ref for the ring geometry + ({ forecastData, measurementData, selectedVariable, isVisible }, ref): JSX.Element => { + const instancedMarkerRef = useRef(null); + + const [triggerRender, setTriggerRender] = useState(0); // Using a number state for forcing render + const { camera } = useThree(); // Access the camera - const prevCameraPosition = useRef(camera.position.clone()); // Store previous camera position - - // Uniform values from props or calculations - const lat = forecastData[0].location.latitude; - const lon = forecastData[0].location.longitude; - - const createDataArrays = (forecastData: ForecastResponseDto[], measurementData: MeasurementSummaryResponseDto[], variable: string) => { - - let variable_name; - if ( variable === "aqi" ) { - variable_name = "overall_aqi_level"; - } else if ( variable === "pm10" ) { - variable_name = "pm10"; - } - - // Extract point data from forecastData - const forecastDataArray = forecastData.map((data) => data[variable_name]); - const forecastDataArrayUniform = new Float32Array(forecastDataArray); - - // and the same array for the average measurement data - const measurementArray = forecastData.map((forecastEntry) => { - // Find a corresponding measurement entry by matching valid_time and measurement_base_time - const matchingMeasurement = measurementData?.find( - (measurementEntry) => measurementEntry.measurement_base_time === forecastEntry.valid_time - ); - - if ( variable === "aqi") { - // If a matching measurement is found, return the overall_aqi_level, otherwise return a missing value (e.g., -1) - return matchingMeasurement && matchingMeasurement[variable_name] - ? matchingMeasurement[variable_name].mean - : -1; - } else { - return matchingMeasurement && matchingMeasurement[variable_name] - ? matchingMeasurement[variable_name].mean.value - : -1; - } - }); - - const measurementDataArrayUniform = new Float32Array(measurementArray); - return { forecastDataArrayUniform, measurementDataArrayUniform }; - } + // Create textures for forecast and measurement data + const forecastDataTexture = useRef(); + const measurementDataTexture = useRef(); + + let MAX_MARKERS = Object.keys(forecastData).length; // Calculate dynamically based on forecastData length + + // Arrays to store latitude and longitude for each marker + const latitudes = new Float32Array(MAX_MARKERS); + const longitudes = new Float32Array(MAX_MARKERS); + + // Listen for changes in selectedVariable and trigger re-render + useEffect(() => { + // Trigger state update to force re-render + setTriggerRender((prev) => prev + 1); + }, [selectedVariable]); // Depend on `selectedVariable` + + useEffect(() => { + const firstKey = Object.keys(forecastData)[0]; // Get the first key + let numEntries = forecastData[firstKey].length; + + const { forecastDataVec4Array, measurementDataVec4Array } = createDataArrays(forecastData, measurementData, selectedVariable); + + // Create textures for forecast and measurement data + forecastDataTexture.current = new DataTexture(forecastDataVec4Array, MAX_MARKERS, numEntries, RGBAFormat, FloatType); + forecastDataTexture.current.needsUpdate = true; + forecastDataTexture.current.minFilter = THREE.NearestFilter + forecastDataTexture.current.magFilter = THREE.NearestFilter + + measurementDataTexture.current = new DataTexture(measurementDataVec4Array, MAX_MARKERS, numEntries, RGBAFormat, FloatType); + measurementDataTexture.current.needsUpdate = true; + measurementDataTexture.current.minFilter = THREE.NearestFilter + measurementDataTexture.current.magFilter = THREE.NearestFilter + }, [forecastData, measurementData, selectedVariable]); - // // Extract point data from forecastData - // const forecastDataArray = forecastData.map((data) => data.overall_aqi_level); - // const forecastDataArrayUniform = new Float32Array(forecastDataArray); - - // // and the same array for the average measurement data - // const measurementArray = forecastData.map((forecastEntry) => { - // // Find a corresponding measurement entry by matching valid_time and measurement_base_time - // const matchingMeasurement = measurementData?.find( - // (measurementEntry) => measurementEntry.measurement_base_time === forecastEntry.valid_time - // ); - - // // If a matching measurement is found, return the overall_aqi_level, otherwise return a missing value (e.g., -1) - // return matchingMeasurement ? matchingMeasurement.overall_aqi_level.mean : -1; - // }); - - // const measurementDataArrayUniform = new Float32Array(measurementArray); - - - const { forecastDataArrayUniform, measurementDataArrayUniform } = createDataArrays(forecastData, measurementData, selectedVariable); - // Animation or build time (example values) - const shaderUniforms = { - uSphereWrapAmount: { value: 0.0 }, - uFrameWeight: { value: 0.5 }, - }; const markerSize = 0.025; - const markerColor = [0.25, 0.25, 0.25]; // Example color - // Re-trigger component on selectedVariable change + // Initialize markers' positions and other properties useEffect(() => { - if (markerRef.current) { - const { forecastDataArrayUniform, measurementDataArrayUniform } = createDataArrays(forecastData, measurementData, selectedVariable); - markerRef.current.material.uniforms.uForecastData.value = forecastDataArrayUniform; - markerRef.current.material.uniforms.uMeasurementData.value = measurementDataArrayUniform; - markerRef.current.material.uniforms.uVariableIndex.value = selectedVariable === "aqi" ? 1.0 : 2.0; // Example to set variable type + if (instancedMarkerRef.current) { + + instancedMarkerRef.current.visible = isVisible; + + let i = 0; + Object.keys(forecastData).forEach((city) => { + const lat = forecastData[city][0]?.location.latitude || 0; + const lon = forecastData[city][0]?.location.longitude || 0; + + // store lat and lon in the arrays + latitudes[i] = lat; + longitudes[i] = lon; + + i++; + }); + + // Set markerIndex attribute (used in the shader to reference the correct data point) + const markerIndices = new Float32Array(MAX_MARKERS); + for (let i = 0; i < MAX_MARKERS; i++) { + markerIndices[i] = i; // Each marker gets its index } - }, [selectedVariable, forecastDataArrayUniform, measurementDataArrayUniform]); - + instancedMarkerRef.current.geometry.setAttribute('lat', new THREE.InstancedBufferAttribute(latitudes, 1)); + instancedMarkerRef.current.geometry.setAttribute('lon', new THREE.InstancedBufferAttribute(longitudes, 1)); + instancedMarkerRef.current.geometry.setAttribute('markerIndex', new THREE.InstancedBufferAttribute(markerIndices, 1)); + instancedMarkerRef.current.instanceMatrix.needsUpdate = true; + } + }, [forecastData, measurementData, selectedVariable]); + // Scale based on camera zoom or position const scaleBasedOnZoom = () => { - if (markerRef.current) { - // Calculate scale based on the camera's distance from the origin - const distance = camera.position.z; // Use camera's distance from the origin - const scaleFactor = distance / 10; // Adjust the denominator to control the sensitivity of the scaling - - markerRef.current.material.uniforms.uZoomLevel.value = scaleFactor - console.log(markerRef.current.material.uniforms.uZoomLevel.value) - } - }; + if (instancedMarkerRef.current) { + const distance = camera.position.z; // Camera distance from origin + const scaleFactor = distance / 10; // Adjust scale sensitivity + instancedMarkerRef.current.material.uniforms.uZoomLevel.value = scaleFactor; + } + }; - // // Track camera movement and apply scaling - // useFrame(() => { - // // Check if the z-axis of the camera has changed - // if (camera.position.z !== prevCameraPosition.current.z) { - // scaleBasedOnZoom(); // Adjust scale when the z-axis changes - // prevCameraPosition.current.z = camera.position.z; // Update the z-axis position only - // } - // }); + useFrame(() => { + // Dynamically update scale based on camera distance + scaleBasedOnZoom(); + }); // Implement the tick function const tick = (weight: number, uSphereWrapAmount: number) => { - if (markerRef.current) { - markerRef.current.material.uniforms.uFrameWeight.value = weight % 1; - markerRef.current.material.uniforms.uFrame.value = Math.floor(weight); - } - // scaleBasedOnZoom(); // Scale based on current zoom whenever tick is called + shaderUniforms.uFrameWeight.value = weight % 1; + // shaderUniforms.uFrameWeight.value = 0.0; + shaderUniforms.uFrame.value = Math.floor(weight).toFixed(1); }; const changeProjection = (globeState: boolean) => { - if (markerRef.current) { - if ( globeState ) { - gsap.to(markerRef.current.material.uniforms.uSphereWrapAmount, { value: 1.0, duration: 2 }); - ringRef.current.visible = false; // Show the ring in flat projection - } else { - gsap.to(markerRef.current.material.uniforms.uSphereWrapAmount, { value: 0.0, duration: 2, onComplete: () => { - ringRef.current.visible = true; // Show the ring in flat projection - }}); - } - } - }; - - const setVariableSize = (enlargedState: boolean) => { - if (markerRef.current) { - markerRef.current.material.uniforms.uVariableSize.value = enlargedState; - } - }; - + gsap.to(shaderUniforms.uSphereWrapAmount, { value: globeState ? 1.0 : 0.0, duration: 2 }); + }; - const setVisible = (isVisible: boolean) => { - if (markerRef.current) { - markerRef.current.visible = isVisible; - } - }; + const setVisible = (isVisible: boolean) => { + if (instancedMarkerRef.current) { + instancedMarkerRef.current.visible = isVisible; + } + }; - // Expose the tick method to the parent component useImperativeHandle(ref, () => ({ tick, changeProjection, - setVariableSize, setVisible })); return ( - + - - {/* CustomShaderMaterial from the custom-shader-material library */} ( uniform float uVariableIndex; uniform float uSphereWrapAmount; - uniform float uLat; - uniform float uLon; - uniform float uForecastData[40]; - uniform float uMeasurementData[40]; - uniform int uFrame; + uniform float uForecastData[100]; + uniform float uMeasurementData[100]; + uniform float uFrame; uniform float uFrameWeight; uniform float uZoomLevel; + uniform float uMaxMarkers; + uniform float uNumTimseSteps; uniform bool uVariableSize; + uniform sampler2D forecastTexture; + uniform sampler2D measurementTexture; + + attribute float lat; + attribute float lon; + attribute float markerIndex; + varying vec3 vColor; void main() { - // Call the color function to get the color based on AQI value and variable type - // float intData = uAqiForecast[uFrame]; // Access the correct frame data - // vec3 thisColor = getColorForValue(uAqiForecast[uFrame], uVariableType); - // vec3 color = mix(thisColor, thisColor, uFrameWeight); - // float forecastValue = mix(uForecastData[uFrame],uForecastData[uFrame+1],uFrameWeight); - // float measurementValue = mix(uMeasurementData[uFrame],uMeasurementData[uFrame+1],uFrameWeight); - float forecastValue = uForecastData[uFrame]; - float measurementValue = uMeasurementData[uFrame]; + vec2 thisTexCoord = vec2(markerIndex / (uMaxMarkers - 1.0), uFrame / uNumTimseSteps); + vec2 nextTexCoord = vec2(markerIndex / (uMaxMarkers - 1.0), (uFrame + 1.0 ) / uNumTimseSteps); - float nextForecastValue = uForecastData[uFrame+1]; - float nextMeasurementValue = uMeasurementData[uFrame+1]; + float forecastValue = texture2D(forecastTexture, thisTexCoord).r; + float measurementValue = texture2D(measurementTexture, thisTexCoord).r; + + float nextForecastValue = texture2D(forecastTexture, nextTexCoord).r; + float nextMeasurementValue = texture2D(measurementTexture, nextTexCoord).r; float forecastValueInterpolated = mix(forecastValue, nextForecastValue, uFrameWeight); float measurementValueInterpolated = mix(measurementValue, nextMeasurementValue, uFrameWeight); @@ -291,9 +341,9 @@ const LocationMarker = forwardRef( diff = mix(thisDiff, nextDiff, uFrameWeight); if (uVariableIndex == 1.0) { - diff = clamp(diff, 1.0, 6.0); + diff = clamp(diff * 0.8, 1.0, 6.0); } else if (uVariableIndex == 2.0) { - diff = clamp(diff/10.0, 1.0, 4.0); + diff = clamp(diff/20.0, 1.0, 4.0); } vec3 color; @@ -302,25 +352,26 @@ const LocationMarker = forwardRef( } else { color = getColorForValue(0.0, uVariableIndex); } - vColor = adjustSaturation(color, 2.0); // Increase saturation + + vColor = adjustSaturation(color, 2.0); // Increase saturation - float lat = uLat; - float lon = uLon; + // Apply initial scale to the position + vec3 posPlane = position * 0.3; - // vec3 posPlane = position * 1.1 * uZoomLevel ; - vec3 posPlane = position * 0.3 ; + // Add longitude and latitude to position, normalizing for the spherical projection posPlane.x += lon / 180.0 * 2.0; posPlane.y += lat / 90.0; + - float r = 1.0; - float theta = 2. * M_PI * (posPlane.x / 4. + 0.5); - float phi = M_PI * (posPlane.y / 2. + 0.5 - 1.0); - float sinPhiRadius = sin( phi ) * r; + float r = 1.0; + float theta = 2. * M_PI * (posPlane.x / 4. + 0.5); + float phi = M_PI * (posPlane.y / 2. + 0.5 - 1.0); + float sinPhiRadius = sin( phi ) * r; - vec3 posSphere; - posSphere.x = sinPhiRadius * sin(theta); - posSphere.y = r * cos(phi); - posSphere.z = sinPhiRadius * cos(theta); + vec3 posSphere; + posSphere.x = sinPhiRadius * sin(theta); + posSphere.y = r * cos(phi); + posSphere.z = sinPhiRadius * cos(theta); if (uVariableSize) { posPlane += position * diff; @@ -344,7 +395,9 @@ const LocationMarker = forwardRef( void main() { + csm_DiffuseColor = vec4(vColor, uOpacity); // Apply the color to the fragment + } `} uniforms={{ @@ -352,28 +405,22 @@ const LocationMarker = forwardRef( uFrameWeight: shaderUniforms.uFrameWeight, uZoomLevel: { value: 0.11 }, uVariableSize: { value: true }, - uFrame: { value: 0 }, - uLat: { value: lat }, - uLon: { value: lon }, - uColor: { value: markerColor }, + uFrame: shaderUniforms.uFrame, uOpacity: { value: 1.0 }, - uForecastData: { value: forecastDataArrayUniform }, - uMeasurementData: { value: measurementDataArrayUniform }, - uVariableType: { value: 1 }, // Example variable type - uVariableIndex: { value: 2.0 }, + forecastTexture: { value: forecastDataTexture.current }, + measurementTexture: { value: measurementDataTexture.current }, + uVariableIndex: { value: selectedVariable === 'aqi' ? 1 : 2 }, + uMaxMarkers: { value: forecastDataTexture.current?.image.width }, + uNumTimseSteps: { value: forecastDataTexture.current?.image.height }, }} transparent /> - - - {/* Add a ring for the equator line */} - {/* - - - */} - + ); } + + + ); export default LocationMarker; \ No newline at end of file diff --git a/air-quality-ui/src/components/globe/SurfaceLayer.tsx b/air-quality-ui/src/components/globe/SurfaceLayer.tsx index 511b07fb..303f1dee 100644 --- a/air-quality-ui/src/components/globe/SurfaceLayer.tsx +++ b/air-quality-ui/src/components/globe/SurfaceLayer.tsx @@ -14,6 +14,12 @@ import { gsap } from "gsap"; const API_URL = import.meta.env.VITE_AIR_QUALITY_API_URL +const shaderUniforms = { + uSphereWrapAmount: { value: 0.0 }, + uFrameWeight: { value: 0.5 }, + uFrame: { value: 0.0 }, +}; + type PlaneType = THREE.Mesh; type SurfaceLayerProps = { @@ -153,7 +159,7 @@ const SurfaceLayer = memo( uFrame: { value: 0 }, uFrameWeight: { value: 0 }, uTimeInterpolation: { value: true }, - uSphereWrapAmount: { value: 0.0 }, + uSphereWrapAmount: shaderUniforms.uSphereWrapAmount, uHeightDisplacement: { value: 0.2 }, uLayerHeight: { value: 0.0 }, uLayerOpacity: { value: 0.0 }, @@ -194,11 +200,11 @@ const SurfaceLayer = memo( ); // Generate image URLs based on the selected variable - // const imageUrls = [ - // `http://localhost:5173/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_1_of_3.webp`, - // `http://localhost:5173/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_2_of_3.webp`, - // `http://localhost:5173/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_3_of_3.webp`, - // ]; + const imageUrls = [ + `http://localhost:5173/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_1_of_3.webp`, + `http://localhost:5173/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_2_of_3.webp`, + `http://localhost:5173/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_3_of_3.webp`, + ]; // const imageUrls = [ // `http://64.225.143.231/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_1_of_3.webp`, @@ -206,11 +212,11 @@ const SurfaceLayer = memo( // `http://64.225.143.231/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_3_of_3.webp`, // ]; - const imageUrls = [ - `/volume/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_1_of_3.webp`, - `/volume/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_2_of_3.webp`, - `/volume/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_3_of_3.webp`, - ]; + // const imageUrls = [ + // `/volume/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_1_of_3.webp`, + // `/volume/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_2_of_3.webp`, + // `/volume/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_3_of_3.webp`, + // ]; const fetchAndUpdateTextures = useCallback( @@ -280,19 +286,7 @@ const SurfaceLayer = memo( }; const changeProjection = (globeState: boolean) => { - if (materialRef.current) { - if (globeState) { - gsap.to(materialRef.current.uniforms.uSphereWrapAmount, { - value: 1.0, - duration: 2, - }); - } else { - gsap.to(materialRef.current.uniforms.uSphereWrapAmount, { - value: 0.0, - duration: 2, - }); - } - } + gsap.to(shaderUniforms.uSphereWrapAmount, { value: globeState ? 1.0 : 0.0, duration: 2 }); }; const changeFilter = (filterState: boolean) => { diff --git a/air-quality-ui/src/components/globe/World.loop.tsx b/air-quality-ui/src/components/globe/World.loop.tsx new file mode 100644 index 00000000..65e44257 --- /dev/null +++ b/air-quality-ui/src/components/globe/World.loop.tsx @@ -0,0 +1,143 @@ +import React, { useRef, useState } from 'react'; // Add this import +import { Canvas } from '@react-three/fiber'; +import { Perf } from 'r3f-perf' +import { OrbitControls } from '@react-three/drei'; +import { SurfaceLayer, SurfaceLayerRef } from './SurfaceLayer'; +import LocationMarker, { LocationMarkerRef } from './LocationMarker.loop'; +import Controls from './Controls'; + +type WorldProps = { + forecastData: Record; + summarizedMeasurementData: Record; +}; + +const World = ({ + forecastData, + summarizedMeasurementData, +}: WorldProps): JSX.Element => { + const surface_layer_ref = useRef(null); + const markerRefs = useRef([]); // Array of refs for LocationMarkers + const [isTimeRunning, setIsTimeRunning] = useState(true); // State to control time updates + const [isLocationMarkerOn, setIsLocationMarkerOn] = useState(false); // State for location marker + const [isFilterNearest, setGridFilterState] = useState(false); // State for enlarge button + const [isTimeInterpolation, setTimeInterpolationState] = useState(false); // State for enlarge button + const [selectedVariable, setSelectedVariable] = useState("aqi"); // State for selected variable from the dropdown + + // Function to toggle the time update on and off + const toggleTimeUpdate = () => { + setIsTimeRunning((prev) => !prev); + }; + + // Handle globe button state change + const handleGlobeButtonClick = (globeState: boolean) => { + surface_layer_ref.current?.changeProjection(globeState); + markerRefs.current.forEach((ref) => { + if (ref?.current) { + ref.current.changeProjection(globeState); + } + }); + }; + + // Handle location marker button state change + const handleLocationMarkerButtonClick = (locationMarkerState: boolean) => { + setIsLocationMarkerOn(locationMarkerState); + markerRefs.current.forEach((ref) => { + if (ref?.current) { + ref.current.setVisible(locationMarkerState); + } + }); + }; + + // Handle grid filter button state change + const handleGridFilterClick = (filterState: boolean) => { + setGridFilterState(filterState); + surface_layer_ref.current?.changeFilter(filterState); + }; + + // Handle time interpolation button state change + const handleTimeInterpolationClick = (timeInterpolationState: boolean) => { + setTimeInterpolationState(timeInterpolationState); + surface_layer_ref.current?.changeTimeInterpolation(timeInterpolationState); + }; + + // Handle dropdown variable selection + const handleVariableSelect = (variable: string) => { + setSelectedVariable(variable); // Update the selected variable state + }; + + // Function to handle slider change + const handleSliderChange = (value: number) => { + surface_layer_ref.current?.tick(value, 0.0); + markerRefs.current.forEach((ref) => { + if (ref.current) ref.current.tick(value, 0.0); // Update each marker with new value + }); + }; + + return ( +
+ + + + + + {Object.keys(forecastData).map((key, index) => { + const forecastSubset = forecastData[key]; + const measurementSubset = summarizedMeasurementData[key]; + + if (!markerRefs.current[index]) { + markerRefs.current[index] = React.createRef(); + } + + return ( + + ); + })} + + + + + + +
+ ); +}; + +const styles = { + worldContainer: { + display: 'flex', + flexDirection: 'column', + alignItems: 'center', + }, +}; + +export default World; diff --git a/air-quality-ui/src/components/globe/World.tsx b/air-quality-ui/src/components/globe/World.tsx index 83a6e868..2befdcad 100644 --- a/air-quality-ui/src/components/globe/World.tsx +++ b/air-quality-ui/src/components/globe/World.tsx @@ -1,9 +1,9 @@ -import React, { useRef, useState } from 'react'; // Add this import +import React, { useRef, useState } from 'react'; import { Canvas } from '@react-three/fiber'; -import { Perf } from 'r3f-perf' +import { Perf } from 'r3f-perf'; import { OrbitControls } from '@react-three/drei'; import { SurfaceLayer, SurfaceLayerRef } from './SurfaceLayer'; -import LocationMarker, { LocationMarkerRef } from './LocationMarker'; +import LocationMarker, { LocationMarkerRef } from './LocationMarker'; // Updated LocationMarker with instancing import Controls from './Controls'; type WorldProps = { @@ -16,12 +16,12 @@ const World = ({ summarizedMeasurementData, }: WorldProps): JSX.Element => { const surface_layer_ref = useRef(null); - const markerRefs = useRef([]); // Array of refs for LocationMarkers - const [isTimeRunning, setIsTimeRunning] = useState(true); // State to control time updates - const [isLocationMarkerOn, setIsLocationMarkerOn] = useState(false); // State for location marker + const markerRef = useRef(null); // Single ref for instanced markers + const [isTimeRunning, setIsTimeRunning] = useState(false); // State to control time updates + const [isLocationMarkerOn, setIsLocationMarkerOn] = useState(true); // State for location marker const [isFilterNearest, setGridFilterState] = useState(false); // State for enlarge button const [isTimeInterpolation, setTimeInterpolationState] = useState(false); // State for enlarge button - const [selectedVariable, setSelectedVariable] = useState("aqi"); // State for selected variable from the dropdown + const [selectedVariable, setSelectedVariable] = useState('aqi'); // State for selected variable from the dropdown // Function to toggle the time update on and off const toggleTimeUpdate = () => { @@ -31,21 +31,13 @@ const World = ({ // Handle globe button state change const handleGlobeButtonClick = (globeState: boolean) => { surface_layer_ref.current?.changeProjection(globeState); - markerRefs.current.forEach((ref) => { - if (ref?.current) { - ref.current.changeProjection(globeState); - } - }); + markerRef.current?.changeProjection(globeState); }; // Handle location marker button state change const handleLocationMarkerButtonClick = (locationMarkerState: boolean) => { setIsLocationMarkerOn(locationMarkerState); - markerRefs.current.forEach((ref) => { - if (ref?.current) { - ref.current.setVisible(locationMarkerState); - } - }); + markerRef.current?.setVisible(locationMarkerState); // Update visibility for all markers }; // Handle grid filter button state change @@ -68,20 +60,17 @@ const World = ({ // Function to handle slider change const handleSliderChange = (value: number) => { surface_layer_ref.current?.tick(value, 0.0); - markerRefs.current.forEach((ref) => { - if (ref.current) ref.current.tick(value, 0.0); // Update each marker with new value - }); + markerRef.current?.tick(value, 0.0); // Update all markers with new value }; + return (
@@ -94,25 +83,14 @@ const World = ({ selectedVariable={selectedVariable} // Pass the selected variable from the dropdown /> - {Object.keys(forecastData).map((key, index) => { - const forecastSubset = forecastData[key]; - const measurementSubset = summarizedMeasurementData[key]; - - if (!markerRefs.current[index]) { - markerRefs.current[index] = React.createRef(); - } - - return ( - - ); - })} + {/* Instanced LocationMarker */} + diff --git a/air-quality-ui/src/components/summary-view/GlobalSummary.tsx b/air-quality-ui/src/components/summary-view/GlobalSummary.tsx index 1b4cf17d..3e9a534e 100644 --- a/air-quality-ui/src/components/summary-view/GlobalSummary.tsx +++ b/air-quality-ui/src/components/summary-view/GlobalSummary.tsx @@ -16,6 +16,7 @@ import { import { LoadingSpinner } from '../common/LoadingSpinner' import GlobalSummaryTable from '../summary-grid/table/GlobalSummaryTable' import World from '../globe/World' // Import your Three.js scene component +// import World from '../globe/World.loop' // Import your Three.js scene component const GlobalSummary = (): JSX.Element => { const { forecastDetails } = useForecastContext() From 9670435eb4c79aedf505280154ce2c99429cb51e Mon Sep 17 00:00:00 2001 From: sebsteinig Date: Thu, 12 Sep 2024 01:36:59 +0100 Subject: [PATCH 13/39] reduced number of texture lookups --- .../src/components/globe/LocationMarker.tsx | 3 - .../src/components/globe/SurfaceLayer.tsx | 83 ++++++++++++++----- air-quality-ui/src/components/globe/World.tsx | 2 +- .../components/globe/shaders/surfaceFrag.glsl | 10 --- 4 files changed, 63 insertions(+), 35 deletions(-) diff --git a/air-quality-ui/src/components/globe/LocationMarker.tsx b/air-quality-ui/src/components/globe/LocationMarker.tsx index e361472f..8ad71f8d 100644 --- a/air-quality-ui/src/components/globe/LocationMarker.tsx +++ b/air-quality-ui/src/components/globe/LocationMarker.tsx @@ -98,9 +98,6 @@ const createDataArrays = ( } } - console.log(forecastDataVec4Array) - - return { forecastDataVec4Array, measurementDataVec4Array }; }; diff --git a/air-quality-ui/src/components/globe/SurfaceLayer.tsx b/air-quality-ui/src/components/globe/SurfaceLayer.tsx index 303f1dee..07385b85 100644 --- a/air-quality-ui/src/components/globe/SurfaceLayer.tsx +++ b/air-quality-ui/src/components/globe/SurfaceLayer.tsx @@ -220,30 +220,54 @@ const SurfaceLayer = memo( const fetchAndUpdateTextures = useCallback( - async (filter: string) => { + async (thisFrame, nextFrame, mode, filter: string) => { try { const fullCanvas = fullImageCanvasRef.current || (await createCanvasTextureFromMultipleImages(imageUrls)); fullImageCanvasRef.current = fullCanvas; - const thisCanvasTexture = createCanvasTextureFromCanvas( - fullCanvas, - windowIndexRef.current, - filter - ); - const nextCanvasTexture = createCanvasTextureFromCanvas( - fullCanvas, - windowIndexRef.current + 1, - filter - ); - if (materialRef.current) { - materialRef.current.uniforms.thisDataTexture.value = - thisCanvasTexture; - materialRef.current.uniforms.nextDataTexture.value = - nextCanvasTexture; + + let thisCanvasTexture, nextCanvasTexture; + + if ( mode === "forward") { + nextCanvasTexture = createCanvasTextureFromCanvas( + fullCanvas, + nextFrame, + filter + ); + materialRef.current.uniforms.thisDataTexture.value = materialRef.current.uniforms.nextDataTexture.value + materialRef.current.uniforms.nextDataTexture.value = nextCanvasTexture; + + } else if (mode === "backward") { + thisCanvasTexture = createCanvasTextureFromCanvas( + fullCanvas, + thisFrame, + filter + ); + materialRef.current.uniforms.nextDataTexture.value = materialRef.current.uniforms.thisDataTexture.value + materialRef.current.uniforms.thisDataTexture.value = thisCanvasTexture + + } else if (mode === "reset") { + console.log('reset') + thisCanvasTexture = createCanvasTextureFromCanvas( + fullCanvas, + thisFrame, + filter + ); + nextCanvasTexture = createCanvasTextureFromCanvas( + fullCanvas, + nextFrame, + filter + ); + materialRef.current.uniforms.thisDataTexture.value = thisCanvasTexture + materialRef.current.uniforms.nextDataTexture.value = nextCanvasTexture; + } + } + + // } } catch (error) { console.error("Error processing image:", error); } @@ -256,9 +280,9 @@ const SurfaceLayer = memo( // Reset canvas and reload textures fullImageCanvasRef.current = null; if (isFilterNearest) { - fetchAndUpdateTextures("nearest"); + fetchAndUpdateTextures(windowIndexRef.current, windowIndexRef.current + 1, "reset", "nearest"); } else { - fetchAndUpdateTextures("linear"); + fetchAndUpdateTextures(windowIndexRef.current, windowIndexRef.current + 1, "reset", "linear"); } }, [selectedVariable, fetchAndUpdateTextures, isFilterNearest]); @@ -266,12 +290,29 @@ const SurfaceLayer = memo( const tick = (sliderValue: number, uSphereWrapAmount: number) => { if (materialRef.current) { if (windowIndexRef.current != Math.floor(sliderValue)) { - windowIndexRef.current = Math.floor(sliderValue); // Loop through a max of 15 windows + let thisFrame, nextFrame, mode; + if (Math.floor(sliderValue) > windowIndexRef.current) { + thisFrame = windowIndexRef.current + 1; + nextFrame = windowIndexRef.current + 2; + mode = "forward"; + } else { + if (Math.floor(sliderValue) === 0) { + thisFrame = 0; + nextFrame = 1; + mode = "reset" + } else { + thisFrame = windowIndexRef.current - 1; + nextFrame = windowIndexRef.current; + mode = "backward"; + } + } + // console.log(mode) if (isFilterNearest) { - fetchAndUpdateTextures("nearest"); + fetchAndUpdateTextures(thisFrame, nextFrame, mode, "nearest"); } else { - fetchAndUpdateTextures("linear"); + fetchAndUpdateTextures(thisFrame, nextFrame, mode, "linear"); } + windowIndexRef.current = Math.floor(sliderValue); // Loop through a max of 15 windows } var weight = 0.0; diff --git a/air-quality-ui/src/components/globe/World.tsx b/air-quality-ui/src/components/globe/World.tsx index 2befdcad..4cf77f86 100644 --- a/air-quality-ui/src/components/globe/World.tsx +++ b/air-quality-ui/src/components/globe/World.tsx @@ -17,7 +17,7 @@ const World = ({ }: WorldProps): JSX.Element => { const surface_layer_ref = useRef(null); const markerRef = useRef(null); // Single ref for instanced markers - const [isTimeRunning, setIsTimeRunning] = useState(false); // State to control time updates + const [isTimeRunning, setIsTimeRunning] = useState(true); // State to control time updates const [isLocationMarkerOn, setIsLocationMarkerOn] = useState(true); // State for location marker const [isFilterNearest, setGridFilterState] = useState(false); // State for enlarge button const [isTimeInterpolation, setTimeInterpolationState] = useState(false); // State for enlarge button diff --git a/air-quality-ui/src/components/globe/shaders/surfaceFrag.glsl b/air-quality-ui/src/components/globe/shaders/surfaceFrag.glsl index 15331d78..f299bc21 100644 --- a/air-quality-ui/src/components/globe/shaders/surfaceFrag.glsl +++ b/air-quality-ui/src/components/globe/shaders/surfaceFrag.glsl @@ -99,16 +99,6 @@ float intData = mix(thisFrameData, nextFrameData, uFrameWeight); // gl_FragColor = dataColor; gl_FragColor = vec4(1.0); -// float testFrameData = remap( -// texture2D( -// thisDataTexture, -// vUv -// ).r, -// 0.0, -// 1.0, -// 1.0, -// 7.0); - vec3 color; // Define colors for each range From c023c5f3c697bdf19d1639e8f9aebc78c2a7310d Mon Sep 17 00:00:00 2001 From: sebsteinig Date: Thu, 12 Sep 2024 02:53:43 +0100 Subject: [PATCH 14/39] new camera controls --- .../src/components/globe/LocationMarker.tsx | 30 +++++-- air-quality-ui/src/components/globe/World.tsx | 81 ++++++++++++++++++- 2 files changed, 101 insertions(+), 10 deletions(-) diff --git a/air-quality-ui/src/components/globe/LocationMarker.tsx b/air-quality-ui/src/components/globe/LocationMarker.tsx index 8ad71f8d..81236006 100644 --- a/air-quality-ui/src/components/globe/LocationMarker.tsx +++ b/air-quality-ui/src/components/globe/LocationMarker.tsx @@ -50,9 +50,14 @@ const createDataArrays = ( // Process forecast data cityForecastData.forEach((forecastEntry) => { const forecastValue = forecastEntry[variable_name]; - forecastDataArray.push(forecastValue); + if (variable === 'aqi') { + forecastDataArray.push(forecastValue); + } else { + forecastDataArray.push(forecastValue.value); + } }); + // Process measurement data by matching valid_time with measurement_base_time cityForecastData.forEach((forecastEntry) => { const matchingMeasurement = cityMeasurementData.find( @@ -72,12 +77,13 @@ const createDataArrays = ( const measurementValue = matchingMeasurement && matchingMeasurement[variable_name] ? matchingMeasurement[variable_name].mean.value - : -1; + : -1.0; measurementDataArray.push(measurementValue); } }); }); + // Convert the data into vec4 (RGBA format) const forecastDataVec4Array = new Float32Array(forecastDataArray.length * 4); const measurementDataVec4Array = new Float32Array(measurementDataArray.length * 4); @@ -99,6 +105,8 @@ const createDataArrays = ( } + console.log(measurementDataVec4Array); + return { forecastDataVec4Array, measurementDataVec4Array }; }; @@ -231,7 +239,9 @@ const LocationMarker = forwardRef( vec3 color; if (uVariableIndex == 1.0) { // "aqi" - if (value >= 1.0 && value < 2.0) { + if (value == -1.0) { + color = vec3(0.15, 0.15, 0.15); // Default to dark grey for missing values + } else if (value >= 1.0 && value < 2.0) { color = vec3(129.0 / 255.0, 237.0 / 255.0, 229.0 / 255.0); } else if (value >= 2.0 && value < 3.0) { color = vec3(116.0 / 255.0, 201.0 / 255.0, 172.0 / 255.0); @@ -247,7 +257,9 @@ const LocationMarker = forwardRef( color = vec3(0.15, 0.15, 0.15); // Default to dark grey } } else if (uVariableIndex == 2.0) { // "pm10" - if (value < 30.0) { + if (value == -1.0) { + color = vec3(0.15, 0.15, 0.15); // Default to dark grey for missing values + } else if (value < 30.0) { color = vec3(1.0, 1.0, 1.0); } else if (value < 40.0) { color = vec3(233.0/ 255.0, 249.0/ 255.0, 188.0/ 255.0); // Green @@ -281,8 +293,6 @@ const LocationMarker = forwardRef( uniform float uVariableIndex; uniform float uSphereWrapAmount; - uniform float uForecastData[100]; - uniform float uMeasurementData[100]; uniform float uFrame; uniform float uFrameWeight; uniform float uZoomLevel; @@ -324,12 +334,14 @@ const LocationMarker = forwardRef( minValue = 1.0; maxValue = 6.0; } else if (uVariableIndex == 2.0) { - minValue = 0.0; + minValue = 1.0; maxValue = 1000.0; } forecastValue = clamp(forecastValue, minValue, maxValue); - measurementValue = clamp(measurementValue, minValue, maxValue); + // if (measurementValue > 0.0) { + measurementValue = clamp(measurementValue, minValue, maxValue); + // } nextForecastValue = clamp(nextForecastValue, minValue, maxValue); nextMeasurementValue = clamp(nextMeasurementValue, minValue, maxValue); @@ -349,6 +361,8 @@ const LocationMarker = forwardRef( } else { color = getColorForValue(0.0, uVariableIndex); } + // color = getColorForValue(measurementValue, uVariableIndex); + vColor = adjustSaturation(color, 2.0); // Increase saturation diff --git a/air-quality-ui/src/components/globe/World.tsx b/air-quality-ui/src/components/globe/World.tsx index 4cf77f86..9264fc1b 100644 --- a/air-quality-ui/src/components/globe/World.tsx +++ b/air-quality-ui/src/components/globe/World.tsx @@ -1,10 +1,11 @@ import React, { useRef, useState } from 'react'; import { Canvas } from '@react-three/fiber'; import { Perf } from 'r3f-perf'; -import { OrbitControls } from '@react-three/drei'; +import { CameraControls } from '@react-three/drei'; import { SurfaceLayer, SurfaceLayerRef } from './SurfaceLayer'; import LocationMarker, { LocationMarkerRef } from './LocationMarker'; // Updated LocationMarker with instancing import Controls from './Controls'; +import * as THREE from 'three'; type WorldProps = { forecastData: Record; @@ -17,6 +18,9 @@ const World = ({ }: WorldProps): JSX.Element => { const surface_layer_ref = useRef(null); const markerRef = useRef(null); // Single ref for instanced markers + const cameraControlsRef = useRef(null); // Ref for CameraControls + + const [isTimeRunning, setIsTimeRunning] = useState(true); // State to control time updates const [isLocationMarkerOn, setIsLocationMarkerOn] = useState(true); // State for location marker const [isFilterNearest, setGridFilterState] = useState(false); // State for enlarge button @@ -32,6 +36,79 @@ const World = ({ const handleGlobeButtonClick = (globeState: boolean) => { surface_layer_ref.current?.changeProjection(globeState); markerRef.current?.changeProjection(globeState); + + console.log(cameraControlsRef) + + if (cameraControlsRef.current) { + const controls = cameraControlsRef.current; + + console.log('reset camera') + + if (globeState) { + // Move the camera to a new position, e.g., when the globe state is true + controls.minDistance = 3.0 + controls.minPolarAngle = 0 + controls.maxPolarAngle = Math.PI + controls.minAzimuthAngle = - Infinity + controls.maxAzimuthAngle = Infinity + + controls.dollyToCursor = false + + + var lat = 50. + var lon = 5. + var newTheta = lon * THREE.MathUtils.DEG2RAD + var newPhi = -1. * ( ( lat - 90. ) * THREE.MathUtils.DEG2RAD ) + + // slower/smoother camera transition + controls.smoothTime = 1.5; + controls.rotateTo( newTheta, newPhi, true) + controls.smoothTime = 1.0; + + controls.zoomTo( 0.75, true ) + + + console.log(controls.mouseButtons) + + } else { + + controls.minDistance = 1.0 + controls.minPolarAngle = Math.PI * 0.5 + controls.maxPolarAngle = Math.PI * 1.0 + controls.minAzimuthAngle = 0 + controls.maxAzimuthAngle = 0 + + controls.maxPolarAngle = Math.PI * 1.0 + + controls.smoothTime = 1.0; + controls.reset(true) + + // set camera smoothing back to normal after transition + setTimeout(function(){ + controls.smoothTime = 3.0; + }, 5000); + + controls.dollyToCursor = true + + + // set map controls + // controls.mouseButtons = { + // left: CameraControls.ACTION.TRUCK, + // middle: CameraControls.ACTION.DOLLY, + // wheel: CameraControls.ACTION.DOLLY, + // right: CameraControls.ACTION.ROTATE + // } + + // controls.touches = { + // one: CameraControls.ACTION.TOUCH_TRUCK, + // two: CameraControls.ACTION.TOUCH_DOLLY, + // three: CameraControls.ACTION.TOUCH_ROTATE, + // } + + } + // controls.reset(true); + } + }; // Handle location marker button state change @@ -92,7 +169,7 @@ const World = ({ isVisible={isLocationMarkerOn} // Pass the state for location marker visibility /> - + From a835eaf2c26e157de52bd969a79c7fd63362dc92 Mon Sep 17 00:00:00 2001 From: sebsteinig Date: Thu, 12 Sep 2024 13:53:05 +0100 Subject: [PATCH 15/39] added toggle switch to page --- .../src/components/globe/CameraSettings.tsx | 67 ++++ .../src/components/globe/ControlsHandler.tsx | 48 +++ .../components/globe/LocationMarker.loop.tsx | 379 ------------------ .../src/components/globe/LocationMarker.tsx | 16 +- .../components/globe/SurfaceLayer copy.tsx | 281 ------------- .../src/components/globe/SurfaceLayer.tsx | 253 +++--------- .../src/components/globe/World.loop.tsx | 143 ------- air-quality-ui/src/components/globe/World.tsx | 166 ++------ .../components/globe/shaders/surfaceFrag.glsl | 11 - .../src/components/globe/useDataTextures.tsx | 200 +++++++++ .../components/summary-view/GlobalSummary.tsx | 23 +- .../summary-view/MapViewHeader.module.css | 17 + .../components/summary-view/MapViewHeader.tsx | 31 ++ .../src/services/forecast-data-service.ts | 13 +- air-quality-ui/src/services/types.ts | 12 + 15 files changed, 509 insertions(+), 1151 deletions(-) create mode 100644 air-quality-ui/src/components/globe/CameraSettings.tsx create mode 100644 air-quality-ui/src/components/globe/ControlsHandler.tsx delete mode 100644 air-quality-ui/src/components/globe/LocationMarker.loop.tsx delete mode 100644 air-quality-ui/src/components/globe/SurfaceLayer copy.tsx delete mode 100644 air-quality-ui/src/components/globe/World.loop.tsx create mode 100644 air-quality-ui/src/components/globe/useDataTextures.tsx create mode 100644 air-quality-ui/src/components/summary-view/MapViewHeader.module.css create mode 100644 air-quality-ui/src/components/summary-view/MapViewHeader.tsx diff --git a/air-quality-ui/src/components/globe/CameraSettings.tsx b/air-quality-ui/src/components/globe/CameraSettings.tsx new file mode 100644 index 00000000..7cfc0a24 --- /dev/null +++ b/air-quality-ui/src/components/globe/CameraSettings.tsx @@ -0,0 +1,67 @@ +// CameraSettings.tsx +import React, { useEffect } from 'react'; +import * as THREE from 'three'; + +type CameraSettingsProps = { + globeState: boolean; + cameraControlsRef: React.RefObject; +}; + +const CameraSettings: React.FC = ({ globeState, cameraControlsRef }) => { + useEffect(() => { + if (cameraControlsRef.current) { + const controls = cameraControlsRef.current; + + if (globeState) { + // Globe settings + controls.minDistance = 1.2; + controls.maxDistance = 1.6; + controls.minPolarAngle = 0; + controls.maxPolarAngle = Math.PI; + controls.minAzimuthAngle = -Infinity; + controls.maxAzimuthAngle = Infinity; + controls.dollyToCursor = false; + + controls.mouseButtons.left = 1; + controls.mouseButtons.right = 2; + + const lat = 48.0; + const lon = 8.0; + const newTheta = lon * THREE.MathUtils.DEG2RAD; + const newPhi = -1.0 * (lat - 90) * THREE.MathUtils.DEG2RAD; + controls.reset(false); + + controls.smoothTime = 1.5; + controls.rotateTo(newTheta, newPhi, true); + controls.zoomTo(0.75, true); + + setTimeout(() => { + controls.smoothTime = 1.0; + }, 3000); + } else { + // Map settings + controls.minDistance = 0.25; + controls.maxDistance = 1.7; + controls.minPolarAngle = Math.PI * 0.5; + controls.maxPolarAngle = Math.PI * 1.0; + controls.minAzimuthAngle = 0; + controls.maxAzimuthAngle = 0; + controls.dollyToCursor = true; + + controls.mouseButtons.left = 2; + controls.mouseButtons.right = 1; + + controls.smoothTime = 1.0; + controls.reset(true); + + setTimeout(() => { + controls.smoothTime = 3.0; + }, 5000); + } + } + }, [globeState, cameraControlsRef]); + + return null; +}; + +export default CameraSettings; \ No newline at end of file diff --git a/air-quality-ui/src/components/globe/ControlsHandler.tsx b/air-quality-ui/src/components/globe/ControlsHandler.tsx new file mode 100644 index 00000000..d81dedec --- /dev/null +++ b/air-quality-ui/src/components/globe/ControlsHandler.tsx @@ -0,0 +1,48 @@ +// ControlsHandler.tsx +import React from 'react'; +import Controls from './Controls'; + +type ControlsHandlerProps = { + toggleTimeUpdate: () => void; + handleSliderChange: (value: number) => void; + handleGlobeButtonClick: (globeState: boolean) => void; + handleLocationMarkerButtonClick: (locationMarkerState: boolean) => void; + handleGridFilterClick: (filterState: boolean) => void; + handleTimeInterpolationClick: (timeInterpolationState: boolean) => void; + handleVariableSelect: (variable: string) => void; + isTimeRunning: boolean; + isLocationMarkerOn: boolean; + isFilterNearest: boolean; + isTimeInterpolation: boolean; + selectedVariable: string; +}; + +const ControlsHandler: React.FC = ({ + toggleTimeUpdate, + handleSliderChange, + handleGlobeButtonClick, + handleLocationMarkerButtonClick, + handleGridFilterClick, + handleTimeInterpolationClick, + handleVariableSelect, + isTimeRunning, + isLocationMarkerOn, + isFilterNearest, + isTimeInterpolation, + selectedVariable, +}) => { + return ( + + ); +}; + +export default ControlsHandler; \ No newline at end of file diff --git a/air-quality-ui/src/components/globe/LocationMarker.loop.tsx b/air-quality-ui/src/components/globe/LocationMarker.loop.tsx deleted file mode 100644 index 58b2e884..00000000 --- a/air-quality-ui/src/components/globe/LocationMarker.loop.tsx +++ /dev/null @@ -1,379 +0,0 @@ -import { useRef, forwardRef, useImperativeHandle, useEffect } from 'react'; -import { Mesh } from 'three'; -import CustomShaderMaterial from 'three-custom-shader-material'; -import * as THREE from 'three'; -import { useThree, useFrame } from '@react-three/fiber'; -import { gsap } from 'gsap'; - -type LocationMarkerProps = { - forecastData: ForecastResponseDto; - measurementData: MeasurementSummaryResponseDto; - thisRotationsFrame: THREE.Texture; - nextRotationsFrame: THREE.Texture; - selectedVariable: string; -}; - -export type LocationMarkerRef = { - tick: (weight: number, uSphereWrapAmount: number) => void; - changeProjection: (globeState: boolean) => void; -}; - - -const LocationMarker = forwardRef( - ({ forecastData, measurementData, thisRotationsFrame, nextRotationsFrame, selectedVariable }, ref): JSX.Element => { - const markerRef = useRef(null); - const ringRef = useRef(null); // Ref for the ring geometry - const { camera } = useThree(); // Access the camera - const prevCameraPosition = useRef(camera.position.clone()); // Store previous camera position - - // Uniform values from props or calculations - const lat = forecastData[0].location.latitude; - const lon = forecastData[0].location.longitude; - - const createDataArrays = (forecastData: ForecastResponseDto[], measurementData: MeasurementSummaryResponseDto[], variable: string) => { - - let variable_name; - if ( variable === "aqi" ) { - variable_name = "overall_aqi_level"; - } else if ( variable === "pm10" ) { - variable_name = "pm10"; - } - - // Extract point data from forecastData - const forecastDataArray = forecastData.map((data) => data[variable_name]); - const forecastDataArrayUniform = new Float32Array(forecastDataArray); - - // and the same array for the average measurement data - const measurementArray = forecastData.map((forecastEntry) => { - // Find a corresponding measurement entry by matching valid_time and measurement_base_time - const matchingMeasurement = measurementData?.find( - (measurementEntry) => measurementEntry.measurement_base_time === forecastEntry.valid_time - ); - - if ( variable === "aqi") { - // If a matching measurement is found, return the overall_aqi_level, otherwise return a missing value (e.g., -1) - return matchingMeasurement && matchingMeasurement[variable_name] - ? matchingMeasurement[variable_name].mean - : -1; - } else { - return matchingMeasurement && matchingMeasurement[variable_name] - ? matchingMeasurement[variable_name].mean.value - : -1; - } - }); - - const measurementDataArrayUniform = new Float32Array(measurementArray); - - return { forecastDataArrayUniform, measurementDataArrayUniform }; - } - - // // Extract point data from forecastData - // const forecastDataArray = forecastData.map((data) => data.overall_aqi_level); - // const forecastDataArrayUniform = new Float32Array(forecastDataArray); - - // // and the same array for the average measurement data - // const measurementArray = forecastData.map((forecastEntry) => { - // // Find a corresponding measurement entry by matching valid_time and measurement_base_time - // const matchingMeasurement = measurementData?.find( - // (measurementEntry) => measurementEntry.measurement_base_time === forecastEntry.valid_time - // ); - - // // If a matching measurement is found, return the overall_aqi_level, otherwise return a missing value (e.g., -1) - // return matchingMeasurement ? matchingMeasurement.overall_aqi_level.mean : -1; - // }); - - // const measurementDataArrayUniform = new Float32Array(measurementArray); - - - const { forecastDataArrayUniform, measurementDataArrayUniform } = createDataArrays(forecastData, measurementData, selectedVariable); - // Animation or build time (example values) - const shaderUniforms = { - uSphereWrapAmount: { value: 0.0 }, - uFrameWeight: { value: 0.5 }, - }; - - const markerSize = 0.025; - const markerColor = [0.25, 0.25, 0.25]; // Example color - - // Re-trigger component on selectedVariable change - useEffect(() => { - if (markerRef.current) { - const { forecastDataArrayUniform, measurementDataArrayUniform } = createDataArrays(forecastData, measurementData, selectedVariable); - markerRef.current.material.uniforms.uForecastData.value = forecastDataArrayUniform; - markerRef.current.material.uniforms.uMeasurementData.value = measurementDataArrayUniform; - markerRef.current.material.uniforms.uVariableIndex.value = selectedVariable === "aqi" ? 1.0 : 2.0; // Example to set variable type - } - }, [selectedVariable, forecastDataArrayUniform, measurementDataArrayUniform]); - - // Scale based on camera zoom or position - const scaleBasedOnZoom = () => { - if (markerRef.current) { - // Calculate scale based on the camera's distance from the origin - const distance = camera.position.z; // Use camera's distance from the origin - const scaleFactor = distance / 10; // Adjust the denominator to control the sensitivity of the scaling - - markerRef.current.material.uniforms.uZoomLevel.value = scaleFactor - console.log(markerRef.current.material.uniforms.uZoomLevel.value) - } - }; - - // // Track camera movement and apply scaling - // useFrame(() => { - // // Check if the z-axis of the camera has changed - // if (camera.position.z !== prevCameraPosition.current.z) { - // scaleBasedOnZoom(); // Adjust scale when the z-axis changes - // prevCameraPosition.current.z = camera.position.z; // Update the z-axis position only - // } - // }); - - // Implement the tick function - const tick = (weight: number, uSphereWrapAmount: number) => { - if (markerRef.current) { - markerRef.current.material.uniforms.uFrameWeight.value = weight % 1; - markerRef.current.material.uniforms.uFrame.value = Math.floor(weight); - } - // scaleBasedOnZoom(); // Scale based on current zoom whenever tick is called - }; - - const changeProjection = (globeState: boolean) => { - if (markerRef.current) { - if ( globeState ) { - gsap.to(markerRef.current.material.uniforms.uSphereWrapAmount, { value: 1.0, duration: 2 }); - ringRef.current.visible = false; // Show the ring in flat projection - } else { - gsap.to(markerRef.current.material.uniforms.uSphereWrapAmount, { value: 0.0, duration: 2, onComplete: () => { - ringRef.current.visible = true; // Show the ring in flat projection - }}); - } - } - }; - - const setVariableSize = (enlargedState: boolean) => { - if (markerRef.current) { - markerRef.current.material.uniforms.uVariableSize.value = enlargedState; - } - }; - - - const setVisible = (isVisible: boolean) => { - if (markerRef.current) { - markerRef.current.visible = isVisible; - } - }; - - // Expose the tick method to the parent component - useImperativeHandle(ref, () => ({ - tick, - changeProjection, - setVariableSize, - setVisible - })); - - return ( - - - - {/* CustomShaderMaterial from the custom-shader-material library */} - = 1.0 && value < 2.0) { - color = vec3(129.0 / 255.0, 237.0 / 255.0, 229.0 / 255.0); - } else if (value >= 2.0 && value < 3.0) { - color = vec3(116.0 / 255.0, 201.0 / 255.0, 172.0 / 255.0); - } else if (value >= 3.0 && value < 4.0) { - color = vec3(238.0 / 255.0, 230.0 / 255.0, 97.0 / 255.0); - } else if (value >= 4.0 && value < 5.0) { - color = vec3(236.0 / 255.0, 94.0 / 255.0, 87.0 / 255.0); - } else if (value >= 5.0 && value < 6.0) { - color = vec3(137.0 / 255.0, 26.0 / 255.0, 52.0 / 255.0); - } else if (value >= 6.0 && value < 7.0) { - color = vec3(115.0 / 255.0, 40.0 / 255.0, 125.0 / 255.0); - } else { - color = vec3(0.15, 0.15, 0.15); // Default to dark grey - } - } else if (uVariableIndex == 2.0) { // "pm10" - if (value < 30.0) { - color = vec3(1.0, 1.0, 1.0); - } else if (value < 40.0) { - color = vec3(233.0/ 255.0, 249.0/ 255.0, 188.0/ 255.0); // Green - } else if (value < 50.0) { - color = vec3(198.0/ 255.0, 255.0/ 255.0, 199.0/ 255.0); // Blue - } else if (value < 60.0) { - color = vec3(144.0/ 255.0, 237.0/ 255.0, 169.0/ 255.0); // Yellow - } else if (value < 80.0) { - color = vec3(76.0/ 255.0, 180.0/ 255.0, 148.0/ 255.0); // Orange - } else if (value < 100.0) { - color = vec3(48.0/ 255.0, 155.0/ 255.0, 138.0/ 255.0); // Purple - } else if (value < 150.0) { - color = vec3(47.0/ 255.0, 137.0/ 255.0, 169.0/ 255.0); // Yellow - } else if (value < 200.0) { - color = vec3(16.0/ 255.0, 99.0/ 255.0, 164.0/ 255.0); // Orange - } else if (value < 300.0) { - color = vec3(13.0/ 255.0, 69.0/ 255.0, 126.0/ 255.0); // Purple - } else if (value < 500.0) { - color = vec3(15.0/ 255.0, 26.0/ 255.0, 136.0/ 255.0); // Orange - } else if (value < 1000.0) { - color = vec3(38.0/ 255.0, 2.0/ 255.0, 60.0/ 255.0); // Purple - } else { - color = vec3(0.0, 0.0, 0.0); // Black for values out of range - } - } - - return color; - } - - #define M_PI 3.14159265 - - uniform float uVariableIndex; - uniform float uSphereWrapAmount; - uniform float uLat; - uniform float uLon; - uniform float uForecastData[40]; - uniform float uMeasurementData[40]; - uniform int uFrame; - uniform float uFrameWeight; - uniform float uZoomLevel; - uniform bool uVariableSize; - - varying vec3 vColor; - - void main() { - - // Call the color function to get the color based on AQI value and variable type - // float intData = uAqiForecast[uFrame]; // Access the correct frame data - // vec3 thisColor = getColorForValue(uAqiForecast[uFrame], uVariableType); - // vec3 color = mix(thisColor, thisColor, uFrameWeight); - // float forecastValue = mix(uForecastData[uFrame],uForecastData[uFrame+1],uFrameWeight); - // float measurementValue = mix(uMeasurementData[uFrame],uMeasurementData[uFrame+1],uFrameWeight); - float forecastValue = uForecastData[uFrame]; - float measurementValue = uMeasurementData[uFrame]; - - float nextForecastValue = uForecastData[uFrame+1]; - float nextMeasurementValue = uMeasurementData[uFrame+1]; - - float forecastValueInterpolated = mix(forecastValue, nextForecastValue, uFrameWeight); - float measurementValueInterpolated = mix(measurementValue, nextMeasurementValue, uFrameWeight); - - float thisDiff; - float nextDiff; - float diff = 1.0; - - float minValue; - float maxValue; - - if (uVariableIndex == 1.0) { - minValue = 1.0; - maxValue = 6.0; - } else if (uVariableIndex == 2.0) { - minValue = 0.0; - maxValue = 1000.0; - } - - forecastValue = clamp(forecastValue, minValue, maxValue); - measurementValue = clamp(measurementValue, minValue, maxValue); - nextForecastValue = clamp(nextForecastValue, minValue, maxValue); - nextMeasurementValue = clamp(nextMeasurementValue, minValue, maxValue); - - thisDiff = abs(measurementValue-forecastValue); - nextDiff = abs(nextMeasurementValue-nextForecastValue); - diff = mix(thisDiff, nextDiff, uFrameWeight); - - if (uVariableIndex == 1.0) { - diff = clamp(diff, 1.0, 6.0); - } else if (uVariableIndex == 2.0) { - diff = clamp(diff/10.0, 1.0, 4.0); - } - - vec3 color; - if ( (measurementValueInterpolated > 0.0 ) || (diff > 1.0) ) { - color = getColorForValue(measurementValue, uVariableIndex); - } else { - color = getColorForValue(0.0, uVariableIndex); - } - vColor = adjustSaturation(color, 2.0); // Increase saturation - - float lat = uLat; - float lon = uLon; - - // vec3 posPlane = position * 1.1 * uZoomLevel ; - vec3 posPlane = position * 0.3 ; - posPlane.x += lon / 180.0 * 2.0; - posPlane.y += lat / 90.0; - - float r = 1.0; - float theta = 2. * M_PI * (posPlane.x / 4. + 0.5); - float phi = M_PI * (posPlane.y / 2. + 0.5 - 1.0); - float sinPhiRadius = sin( phi ) * r; - - vec3 posSphere; - posSphere.x = sinPhiRadius * sin(theta); - posSphere.y = r * cos(phi); - posSphere.z = sinPhiRadius * cos(theta); - - if (uVariableSize) { - posPlane += position * diff; - posSphere += position * diff; - } else { - posPlane += position; - posSphere += position; - } - - csm_Position = mix(posPlane, posSphere, uSphereWrapAmount) ; - - // csm_Position = posPlane; - - } - `} - fragmentShader={` - - uniform float uOpacity; - varying vec3 vColor; - - - void main() { - - csm_DiffuseColor = vec4(vColor, uOpacity); // Apply the color to the fragment - } - `} - uniforms={{ - uSphereWrapAmount: shaderUniforms.uSphereWrapAmount, - uFrameWeight: shaderUniforms.uFrameWeight, - uZoomLevel: { value: 0.11 }, - uVariableSize: { value: true }, - uFrame: { value: 0 }, - uLat: { value: lat }, - uLon: { value: lon }, - uColor: { value: markerColor }, - uOpacity: { value: 1.0 }, - uForecastData: { value: forecastDataArrayUniform }, - uMeasurementData: { value: measurementDataArrayUniform }, - uVariableType: { value: 1 }, // Example variable type - uVariableIndex: { value: 2.0 }, - }} - transparent - /> - - - {/* Add a ring for the equator line */} - {/* - - - */} - - ); - } -); - -export default LocationMarker; \ No newline at end of file diff --git a/air-quality-ui/src/components/globe/LocationMarker.tsx b/air-quality-ui/src/components/globe/LocationMarker.tsx index 81236006..2ec1cdde 100644 --- a/air-quality-ui/src/components/globe/LocationMarker.tsx +++ b/air-quality-ui/src/components/globe/LocationMarker.tsx @@ -104,14 +104,21 @@ const createDataArrays = ( } } - - console.log(measurementDataVec4Array); - return { forecastDataVec4Array, measurementDataVec4Array }; }; const LocationMarker = forwardRef( ({ forecastData, measurementData, selectedVariable, isVisible }, ref): JSX.Element => { + + if ( + !forecastData || + Object.keys(forecastData).length === 0 || + !measurementData || + Object.keys(measurementData).length === 0 + ) { + return null; + } + const instancedMarkerRef = useRef(null); const [triggerRender, setTriggerRender] = useState(0); // Using a number state for forcing render @@ -130,6 +137,7 @@ const LocationMarker = forwardRef( // Listen for changes in selectedVariable and trigger re-render useEffect(() => { + // Trigger state update to force re-render setTriggerRender((prev) => prev + 1); }, [selectedVariable]); // Depend on `selectedVariable` @@ -200,7 +208,7 @@ const LocationMarker = forwardRef( }); // Implement the tick function - const tick = (weight: number, uSphereWrapAmount: number) => { + const tick = (weight: number) => { shaderUniforms.uFrameWeight.value = weight % 1; // shaderUniforms.uFrameWeight.value = 0.0; shaderUniforms.uFrame.value = Math.floor(weight).toFixed(1); diff --git a/air-quality-ui/src/components/globe/SurfaceLayer copy.tsx b/air-quality-ui/src/components/globe/SurfaceLayer copy.tsx deleted file mode 100644 index 3b3f9565..00000000 --- a/air-quality-ui/src/components/globe/SurfaceLayer copy.tsx +++ /dev/null @@ -1,281 +0,0 @@ -import { - forwardRef, - useImperativeHandle, - useRef, - memo, - useCallback, -} from "react"; -import * as THREE from "three"; -import vertexShader from "./shaders/surfaceVert.glsl"; -import fragmentShader from "./shaders/surfaceFrag.glsl"; -import { useForecastContext } from '../../context'; -import { gsap } from 'gsap'; - -type PlaneType = THREE.Mesh; - -type SurfaceLayerProps = { - forecastData: ForecastResponseDto[]; - summarizedMeasurementData: MeasurementSummaryResponseDto[]; - isFilterNearest: boolean; - isTimeInterpolation: boolean; - selectedVariable: string; // Add this prop -}; - - -export type SurfaceLayerRef = { - type: React.RefObject; - tick: (weight: number, uSphereWrapAmount: number) => void; - changeProjection: (globeState: boolean) => void; -}; - -// Preload textures globally so they are not reloaded during re-renders -const loader = new THREE.TextureLoader(); -const cmap = loader.load('/all_colormaps.png'); -const lsm = loader.load('/NaturalEarthCoastline2.jpg'); -const height = loader.load('/gebco_08_rev_elev_2k_HQ.jpg'); - -cmap.minFilter = THREE.NearestFilter; -cmap.magFilter = THREE.NearestFilter; -lsm.minFilter = THREE.NearestFilter; -lsm.magFilter = THREE.NearestFilter; -height.minFilter = THREE.NearestFilter; -height.magFilter = THREE.NearestFilter; - -const geometry = new THREE.PlaneGeometry(4, 2, 64 * 4, 32 * 4); - -const createCanvasTextureFromMultipleImages = async (imageUrls: string[]): Promise => { - return new Promise((resolve, reject) => { - const images: HTMLImageElement[] = []; - let imagesLoaded = 0; - - // Helper function to handle image loading - const onLoadImage = () => { - imagesLoaded++; - if (imagesLoaded === imageUrls.length) { - // All images are loaded, now concatenate them - const canvas = document.createElement("canvas"); - const context = canvas.getContext("2d"); - - if (context) { - const singleImageWidth = images[0].width; - const singleImageHeight = images[0].height; - - // Set the canvas width and height to accommodate all images horizontally - canvas.width = singleImageWidth * imageUrls.length; - canvas.height = singleImageHeight; - - // Draw each image side by side - images.forEach((img, index) => { - context.drawImage(img, index * singleImageWidth, 0); - }); - - resolve(canvas); - } else { - reject(new Error("Failed to get canvas context")); - } - } - }; - - // Load all images - imageUrls.forEach((url) => { - const img = new Image(); - img.crossOrigin = "Anonymous"; - img.onload = onLoadImage; - img.onerror = (error) => reject(error); - img.src = url; - images.push(img); - }); - }); -}; - -const createCanvasTextureFromCanvas = (canvas: HTMLCanvasElement, index: number, filter: string): THREE.CanvasTexture => { - const context = canvas.getContext("2d"); - if (context) { - const textureCanvas = document.createElement("canvas"); - const textureContext = textureCanvas.getContext("2d"); - - textureCanvas.width = 900; // Width of the texture canvas - textureCanvas.height = 450; // Height of the texture canvas - textureContext.drawImage(canvas, index * 900, 0, 900, 450, 0, 0, 900, 450); - - const texture = new THREE.CanvasTexture(textureCanvas); - texture.wrapS = texture.wrapT = THREE.RepeatWrapping; - if (filter === "nearest") { - texture.minFilter = THREE.NearestFilter; - texture.magFilter = THREE.NearestFilter; - } else { - texture.minFilter = THREE.LinearFilter; - texture.magFilter = THREE.LinearFilter; - } - - return texture; - } else { - throw new Error("Failed to get texture canvas context"); - } -}; - -const SurfaceLayer = memo( - forwardRef( - ({ forecastData, summarizedMeasurementData, isFilterNearest, isTimeInterpolation, selectedVariable }, ref) => { // Receive isTimeRunning as a prop - const surface_layer_ref = useRef(null); - const materialRef = useRef( - new THREE.ShaderMaterial({ - vertexShader: vertexShader, - fragmentShader: fragmentShader, - wireframe: false, - transparent: true, - side: THREE.DoubleSide, - uniforms: { - uFrame: { value: 0 }, - uFrameWeight: { value: 0 }, - uTimeInterpolation: { value: isTimeInterpolation }, - uSphereWrapAmount: { value: 0.0 }, - uHeightDisplacement: { value: 0.2 }, - uLayerHeight: { value: 0.0 }, - uLayerOpacity: { value: 0.0 }, - thisDataTexture: { value: null }, - nextDataTexture: { value: null }, - textureTimesteps: { value: null }, - thisDataMin: { value: new Float32Array(1) }, - thisDataMax: { value: new Float32Array(1) }, - nextDataMin: { value: null }, - nextDataMax: { value: null }, - referenceHeightTexture: { value: height }, - referenceDataMin: { value: null }, - referenceDataMax: { value: null }, - referenceDataHeightFlag: { value: false }, - colorMap: { value: cmap }, - colorMapIndex: { value: 0.0 }, - lsmTexture: { value: lsm }, - }, - }) - ); - - const fullImageCanvasRef = useRef(null); - const windowIndexRef = useRef(0); - - const { forecastDetails } = useForecastContext(); - const forecastBaseDate = forecastDetails.forecastBaseDate.toFormat('yyyy-MM-dd_HH'); - // const imageUrl = `http://localhost:5173/data_textures/${forecastBaseDate}/aqi_${forecastBaseDate}_CAMS_global.chunk_1_of_3.webp`; - - const imageUrls = [ - `http://localhost:5173/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_1_of_3.webp`, - `http://localhost:5173/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_2_of_3.webp`, - `http://localhost:5173/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_3_of_3.webp`, - ]; - - console.log(imageUrls) - - const fetchAndUpdateTextures = useCallback(async (filter: string) => { - try { - if (!fullImageCanvasRef.current) { - const fullCanvas = await createCanvasTextureFromMultipleImages(imageUrls); - fullImageCanvasRef.current = fullCanvas; - } - - const canvas = fullImageCanvasRef.current; - if (canvas) { - const thisCanvasTexture = createCanvasTextureFromCanvas( - canvas, - windowIndexRef.current, - filter - ); - const nextCanvasTexture = createCanvasTextureFromCanvas( - canvas, - windowIndexRef.current + 1, - filter - ); - - if (materialRef.current) { - materialRef.current.uniforms.thisDataTexture.value = thisCanvasTexture; - materialRef.current.uniforms.nextDataTexture.value = nextCanvasTexture; - } - } - } catch (error) { - console.error("Error processing image:", error); - } - }, [imageUrls]); - - if (isFilterNearest) { - fetchAndUpdateTextures("nearest"); - } else { - fetchAndUpdateTextures("linear"); - } - // fetchAndUpdateTextures("linear") - - // Handle the tick function to externally control weight and sphere wrapping - const tick = (sliderValue: number, uSphereWrapAmount: number) => { - if (materialRef.current) { - - - if (windowIndexRef.current != Math.floor(sliderValue)) { - windowIndexRef.current = Math.floor(sliderValue); // Loop through a max of 15 windows - if (isFilterNearest) { - fetchAndUpdateTextures("nearest"); - } else { - fetchAndUpdateTextures("linear"); - } - } - - // const currentTime = elapsedTimeRef.current; - var weight = 0.0 - if ( materialRef.current.uniforms.uTimeInterpolation.value) { - weight = sliderValue % 1; // Value between 0 and 1 - } - - if (materialRef.current) { - materialRef.current.uniforms.uFrameWeight.value = weight; - } - - // materialRef.current.uniforms.uFrameWeight.value = weight % 1; - // materialRef.current.uniforms.uSphereWrapAmount.value = uSphereWrapAmount; - // materialRef.current.uniforms.uLayerOpacity.value = 1.0; - } - }; - - const changeProjection = (globeState: boolean) => { - if (materialRef.current) { - if ( globeState ) { - gsap.to(materialRef.current.uniforms.uSphereWrapAmount, { value: 1.0, duration: 2 }); - } else { - gsap.to(materialRef.current.uniforms.uSphereWrapAmount, { value: 0.0, duration: 2 }); - } - } - }; - - const changeFilter = (filterState: boolean) => { - if (materialRef.current) { - if ( filterState ) { - fetchAndUpdateTextures("linear") - } else { - fetchAndUpdateTextures("nearest") - } - } - }; - - const changeTimeInterpolation = (timeInterpolationState: boolean) => { - if (materialRef.current) { - materialRef.current.uniforms.uTimeInterpolation.value = timeInterpolationState; - } - }; - - useImperativeHandle(ref, () => ({ - type: surface_layer_ref, - tick, - changeProjection, - changeFilter, - changeTimeInterpolation, - })); - return ( - - ); - } - ) -); - -export { SurfaceLayer }; diff --git a/air-quality-ui/src/components/globe/SurfaceLayer.tsx b/air-quality-ui/src/components/globe/SurfaceLayer.tsx index 07385b85..e0ef9efa 100644 --- a/air-quality-ui/src/components/globe/SurfaceLayer.tsx +++ b/air-quality-ui/src/components/globe/SurfaceLayer.tsx @@ -3,7 +3,6 @@ import { useImperativeHandle, useRef, memo, - useCallback, useEffect, // Import useEffect } from "react"; import * as THREE from "three"; @@ -11,6 +10,7 @@ import vertexShader from "./shaders/surfaceVert.glsl"; import fragmentShader from "./shaders/surfaceFrag.glsl"; import { useForecastContext } from "../../context"; import { gsap } from "gsap"; +import { useDataTextures } from "./useDataTextures"; const API_URL = import.meta.env.VITE_AIR_QUALITY_API_URL @@ -23,8 +23,6 @@ const shaderUniforms = { type PlaneType = THREE.Mesh; type SurfaceLayerProps = { - forecastData: ForecastResponseDto[]; - summarizedMeasurementData: MeasurementSummaryResponseDto[]; isFilterNearest: boolean; isTimeInterpolation: boolean; selectedVariable: string; // Add this prop @@ -53,94 +51,10 @@ height.magFilter = THREE.NearestFilter; const geometry = new THREE.PlaneGeometry(4, 2, 64 * 4, 32 * 4); -const createCanvasTextureFromMultipleImages = async ( - imageUrls: string[] -): Promise => { - return new Promise((resolve, reject) => { - const images: HTMLImageElement[] = []; - let imagesLoaded = 0; - - // Helper function to handle image loading - const onLoadImage = () => { - imagesLoaded++; - if (imagesLoaded === imageUrls.length) { - const canvas = document.createElement("canvas"); - const context = canvas.getContext("2d"); - - if (context) { - const singleImageWidth = images[0].width; - const singleImageHeight = images[0].height; - canvas.width = singleImageWidth * imageUrls.length; - canvas.height = singleImageHeight; - images.forEach((img, index) => { - context.drawImage(img, index * singleImageWidth, 0); - }); - - resolve(canvas); - } else { - reject(new Error("Failed to get canvas context")); - } - } - }; - - // Load all images - imageUrls.forEach((url) => { - const img = new Image(); - img.crossOrigin = "Anonymous"; - img.onload = onLoadImage; - img.onerror = (error) => reject(error); - img.src = url; - images.push(img); - }); - }); -}; - -const createCanvasTextureFromCanvas = ( - canvas: HTMLCanvasElement, - index: number, - filter: string -): THREE.CanvasTexture => { - const context = canvas.getContext("2d"); - if (context) { - const textureCanvas = document.createElement("canvas"); - const textureContext = textureCanvas.getContext("2d"); - - textureCanvas.width = 900; - textureCanvas.height = 450; - textureContext.drawImage( - canvas, - index * 900, - 0, - 900, - 450, - 0, - 0, - 900, - 450 - ); - - const texture = new THREE.CanvasTexture(textureCanvas); - texture.wrapS = texture.wrapT = THREE.RepeatWrapping; - if (filter === "nearest") { - texture.minFilter = THREE.NearestFilter; - texture.magFilter = THREE.NearestFilter; - } else { - texture.minFilter = THREE.LinearFilter; - texture.magFilter = THREE.LinearFilter; - } - - return texture; - } else { - throw new Error("Failed to get texture canvas context"); - } -}; - const SurfaceLayer = memo( forwardRef( ( { - forecastData, - summarizedMeasurementData, isFilterNearest, isTimeInterpolation, selectedVariable, @@ -157,8 +71,8 @@ const SurfaceLayer = memo( side: THREE.DoubleSide, uniforms: { uFrame: { value: 0 }, - uFrameWeight: { value: 0 }, - uTimeInterpolation: { value: true }, + uFrameWeight: { value: 0.0 }, + uTimeInterpolation: { value: isTimeInterpolation }, uSphereWrapAmount: shaderUniforms.uSphereWrapAmount, uHeightDisplacement: { value: 0.2 }, uLayerHeight: { value: 0.0 }, @@ -188,10 +102,8 @@ const SurfaceLayer = memo( } else if (selectedVariable === "pm10") { variableIndex = 2; } - materialRef.current.uniforms.uVariableIndex.value = variableIndex; - const fullImageCanvasRef = useRef(null); const windowIndexRef = useRef(0); const { forecastDetails } = useForecastContext(); @@ -199,130 +111,63 @@ const SurfaceLayer = memo( "yyyy-MM-dd_HH" ); - // Generate image URLs based on the selected variable - const imageUrls = [ - `http://localhost:5173/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_1_of_3.webp`, - `http://localhost:5173/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_2_of_3.webp`, - `http://localhost:5173/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_3_of_3.webp`, - ]; - - // const imageUrls = [ - // `http://64.225.143.231/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_1_of_3.webp`, - // `http://64.225.143.231/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_2_of_3.webp`, - // `http://64.225.143.231/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_3_of_3.webp`, - // ]; - - // const imageUrls = [ - // `/volume/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_1_of_3.webp`, - // `/volume/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_2_of_3.webp`, - // `/volume/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_3_of_3.webp`, - // ]; - - - const fetchAndUpdateTextures = useCallback( - async (thisFrame, nextFrame, mode, filter: string) => { - try { - const fullCanvas = - fullImageCanvasRef.current || - (await createCanvasTextureFromMultipleImages(imageUrls)); - fullImageCanvasRef.current = fullCanvas; - - if (materialRef.current) { + const { fetchAndUpdateTextures, updateTextureFilter } = useDataTextures(forecastBaseDate, selectedVariable); - let thisCanvasTexture, nextCanvasTexture; - - if ( mode === "forward") { - nextCanvasTexture = createCanvasTextureFromCanvas( - fullCanvas, - nextFrame, - filter - ); - materialRef.current.uniforms.thisDataTexture.value = materialRef.current.uniforms.nextDataTexture.value - materialRef.current.uniforms.nextDataTexture.value = nextCanvasTexture; - - } else if (mode === "backward") { - thisCanvasTexture = createCanvasTextureFromCanvas( - fullCanvas, - thisFrame, - filter - ); - materialRef.current.uniforms.nextDataTexture.value = materialRef.current.uniforms.thisDataTexture.value - materialRef.current.uniforms.thisDataTexture.value = thisCanvasTexture - - } else if (mode === "reset") { - console.log('reset') - thisCanvasTexture = createCanvasTextureFromCanvas( - fullCanvas, - thisFrame, - filter - ); - nextCanvasTexture = createCanvasTextureFromCanvas( - fullCanvas, - nextFrame, - filter - ); - materialRef.current.uniforms.thisDataTexture.value = thisCanvasTexture - materialRef.current.uniforms.nextDataTexture.value = nextCanvasTexture; - } - - } - - // } - } catch (error) { - console.error("Error processing image:", error); - } - }, - [imageUrls] - ); - - // Effect to fetch new textures when `selectedVariable` changes useEffect(() => { - // Reset canvas and reload textures - fullImageCanvasRef.current = null; - if (isFilterNearest) { - fetchAndUpdateTextures(windowIndexRef.current, windowIndexRef.current + 1, "reset", "nearest"); - } else { - fetchAndUpdateTextures(windowIndexRef.current, windowIndexRef.current + 1, "reset", "linear"); - } - }, [selectedVariable, fetchAndUpdateTextures, isFilterNearest]); + fetchAndUpdateTextures( + 0, + 1, + "reset", + isFilterNearest ? "nearest" : "linear", + true, + materialRef + ); + }, [selectedVariable]); + // Handle the tick function to externally control weight and sphere wrapping - const tick = (sliderValue: number, uSphereWrapAmount: number) => { + const tick = (sliderValue: number) => { if (materialRef.current) { + if (windowIndexRef.current != Math.floor(sliderValue)) { + let thisFrame, nextFrame, mode; - if (Math.floor(sliderValue) > windowIndexRef.current) { + if (Math.floor(sliderValue) === 0) { + thisFrame = 0; + nextFrame = 1; + mode = "reset" + } else if (Math.floor(sliderValue) > windowIndexRef.current) { thisFrame = windowIndexRef.current + 1; nextFrame = windowIndexRef.current + 2; mode = "forward"; } else { - if (Math.floor(sliderValue) === 0) { - thisFrame = 0; - nextFrame = 1; - mode = "reset" - } else { - thisFrame = windowIndexRef.current - 1; - nextFrame = windowIndexRef.current; - mode = "backward"; - } - } - // console.log(mode) - if (isFilterNearest) { - fetchAndUpdateTextures(thisFrame, nextFrame, mode, "nearest"); - } else { - fetchAndUpdateTextures(thisFrame, nextFrame, mode, "linear"); + thisFrame = windowIndexRef.current - 1; + nextFrame = windowIndexRef.current; + mode = "backward"; + // thisFrame = Math.floor(sliderValue); + // nextFrame = thisFrame + 1; + // mode = sliderValue > thisFrame ? "forward" : "backward"; } - windowIndexRef.current = Math.floor(sliderValue); // Loop through a max of 15 windows + fetchAndUpdateTextures( + thisFrame, + nextFrame, + mode, + isFilterNearest ? "nearest" : "linear", + false, + materialRef + ); + windowIndexRef.current = thisFrame; } - var weight = 0.0; - if (materialRef.current.uniforms.uTimeInterpolation.value) { - weight = sliderValue % 1; // Value between 0 and 1 - } + const weight = materialRef.current.uniforms.uTimeInterpolation.value + ? sliderValue % 1 + : 0; + + materialRef.current.uniforms.uFrameWeight.value = weight; + // shaderUniforms.uFrameWeight.value = weight; + // console.log(materialRef.current.uniforms.uTimeInterpolation.value) + // console.log(materialRef.current.uniforms.uFrameWeight.value) - if (materialRef.current) { - materialRef.current.uniforms.uFrameWeight.value = weight; - } } }; @@ -332,16 +177,14 @@ const SurfaceLayer = memo( const changeFilter = (filterState: boolean) => { if (materialRef.current) { - if (filterState) { - fetchAndUpdateTextures("linear"); - } else { - fetchAndUpdateTextures("nearest"); - } + const filter = filterState ? "nearest" : "linear"; + updateTextureFilter(filter, materialRef); } }; const changeTimeInterpolation = (timeInterpolationState: boolean) => { if (materialRef.current) { + // console.log('change time', timeInterpolationState) materialRef.current.uniforms.uTimeInterpolation.value = timeInterpolationState; } diff --git a/air-quality-ui/src/components/globe/World.loop.tsx b/air-quality-ui/src/components/globe/World.loop.tsx deleted file mode 100644 index 65e44257..00000000 --- a/air-quality-ui/src/components/globe/World.loop.tsx +++ /dev/null @@ -1,143 +0,0 @@ -import React, { useRef, useState } from 'react'; // Add this import -import { Canvas } from '@react-three/fiber'; -import { Perf } from 'r3f-perf' -import { OrbitControls } from '@react-three/drei'; -import { SurfaceLayer, SurfaceLayerRef } from './SurfaceLayer'; -import LocationMarker, { LocationMarkerRef } from './LocationMarker.loop'; -import Controls from './Controls'; - -type WorldProps = { - forecastData: Record; - summarizedMeasurementData: Record; -}; - -const World = ({ - forecastData, - summarizedMeasurementData, -}: WorldProps): JSX.Element => { - const surface_layer_ref = useRef(null); - const markerRefs = useRef([]); // Array of refs for LocationMarkers - const [isTimeRunning, setIsTimeRunning] = useState(true); // State to control time updates - const [isLocationMarkerOn, setIsLocationMarkerOn] = useState(false); // State for location marker - const [isFilterNearest, setGridFilterState] = useState(false); // State for enlarge button - const [isTimeInterpolation, setTimeInterpolationState] = useState(false); // State for enlarge button - const [selectedVariable, setSelectedVariable] = useState("aqi"); // State for selected variable from the dropdown - - // Function to toggle the time update on and off - const toggleTimeUpdate = () => { - setIsTimeRunning((prev) => !prev); - }; - - // Handle globe button state change - const handleGlobeButtonClick = (globeState: boolean) => { - surface_layer_ref.current?.changeProjection(globeState); - markerRefs.current.forEach((ref) => { - if (ref?.current) { - ref.current.changeProjection(globeState); - } - }); - }; - - // Handle location marker button state change - const handleLocationMarkerButtonClick = (locationMarkerState: boolean) => { - setIsLocationMarkerOn(locationMarkerState); - markerRefs.current.forEach((ref) => { - if (ref?.current) { - ref.current.setVisible(locationMarkerState); - } - }); - }; - - // Handle grid filter button state change - const handleGridFilterClick = (filterState: boolean) => { - setGridFilterState(filterState); - surface_layer_ref.current?.changeFilter(filterState); - }; - - // Handle time interpolation button state change - const handleTimeInterpolationClick = (timeInterpolationState: boolean) => { - setTimeInterpolationState(timeInterpolationState); - surface_layer_ref.current?.changeTimeInterpolation(timeInterpolationState); - }; - - // Handle dropdown variable selection - const handleVariableSelect = (variable: string) => { - setSelectedVariable(variable); // Update the selected variable state - }; - - // Function to handle slider change - const handleSliderChange = (value: number) => { - surface_layer_ref.current?.tick(value, 0.0); - markerRefs.current.forEach((ref) => { - if (ref.current) ref.current.tick(value, 0.0); // Update each marker with new value - }); - }; - - return ( -
- - - - - - {Object.keys(forecastData).map((key, index) => { - const forecastSubset = forecastData[key]; - const measurementSubset = summarizedMeasurementData[key]; - - if (!markerRefs.current[index]) { - markerRefs.current[index] = React.createRef(); - } - - return ( - - ); - })} - - - - - - -
- ); -}; - -const styles = { - worldContainer: { - display: 'flex', - flexDirection: 'column', - alignItems: 'center', - }, -}; - -export default World; diff --git a/air-quality-ui/src/components/globe/World.tsx b/air-quality-ui/src/components/globe/World.tsx index 9264fc1b..994c385d 100644 --- a/air-quality-ui/src/components/globe/World.tsx +++ b/air-quality-ui/src/components/globe/World.tsx @@ -1,11 +1,12 @@ -import React, { useRef, useState } from 'react'; +// World.tsx +import { useRef, useState } from 'react'; import { Canvas } from '@react-three/fiber'; -import { Perf } from 'r3f-perf'; +// import { Perf } from 'r3f-perf'; import { CameraControls } from '@react-three/drei'; import { SurfaceLayer, SurfaceLayerRef } from './SurfaceLayer'; -import LocationMarker, { LocationMarkerRef } from './LocationMarker'; // Updated LocationMarker with instancing -import Controls from './Controls'; -import * as THREE from 'three'; +import LocationMarker, { LocationMarkerRef } from './LocationMarker'; +import CameraSettings from './CameraSettings'; // Import the CameraSettings component +import ControlsHandler from './ControlsHandler'; // Import the ControlsHandler component type WorldProps = { forecastData: Record; @@ -17,135 +18,53 @@ const World = ({ summarizedMeasurementData, }: WorldProps): JSX.Element => { const surface_layer_ref = useRef(null); - const markerRef = useRef(null); // Single ref for instanced markers - const cameraControlsRef = useRef(null); // Ref for CameraControls + const markerRef = useRef(null); + const cameraControlsRef = useRef(null); + const [isTimeRunning, setIsTimeRunning] = useState(true); + const [isLocationMarkerOn, setIsLocationMarkerOn] = useState(true); + const [isFilterNearest, setGridFilterState] = useState(false); + const [isTimeInterpolation, setTimeInterpolationState] = useState(true); + const [selectedVariable, setSelectedVariable] = useState('aqi'); + const [globeState, setGlobeState] = useState(false); - const [isTimeRunning, setIsTimeRunning] = useState(true); // State to control time updates - const [isLocationMarkerOn, setIsLocationMarkerOn] = useState(true); // State for location marker - const [isFilterNearest, setGridFilterState] = useState(false); // State for enlarge button - const [isTimeInterpolation, setTimeInterpolationState] = useState(false); // State for enlarge button - const [selectedVariable, setSelectedVariable] = useState('aqi'); // State for selected variable from the dropdown + const toggleTimeUpdate = () => setIsTimeRunning((prev) => !prev); - // Function to toggle the time update on and off - const toggleTimeUpdate = () => { - setIsTimeRunning((prev) => !prev); - }; - - // Handle globe button state change const handleGlobeButtonClick = (globeState: boolean) => { + setGlobeState(globeState); surface_layer_ref.current?.changeProjection(globeState); markerRef.current?.changeProjection(globeState); - - console.log(cameraControlsRef) - - if (cameraControlsRef.current) { - const controls = cameraControlsRef.current; - - console.log('reset camera') - - if (globeState) { - // Move the camera to a new position, e.g., when the globe state is true - controls.minDistance = 3.0 - controls.minPolarAngle = 0 - controls.maxPolarAngle = Math.PI - controls.minAzimuthAngle = - Infinity - controls.maxAzimuthAngle = Infinity - - controls.dollyToCursor = false - - - var lat = 50. - var lon = 5. - var newTheta = lon * THREE.MathUtils.DEG2RAD - var newPhi = -1. * ( ( lat - 90. ) * THREE.MathUtils.DEG2RAD ) - - // slower/smoother camera transition - controls.smoothTime = 1.5; - controls.rotateTo( newTheta, newPhi, true) - controls.smoothTime = 1.0; - - controls.zoomTo( 0.75, true ) - - - console.log(controls.mouseButtons) - - } else { - - controls.minDistance = 1.0 - controls.minPolarAngle = Math.PI * 0.5 - controls.maxPolarAngle = Math.PI * 1.0 - controls.minAzimuthAngle = 0 - controls.maxAzimuthAngle = 0 - - controls.maxPolarAngle = Math.PI * 1.0 - - controls.smoothTime = 1.0; - controls.reset(true) - - // set camera smoothing back to normal after transition - setTimeout(function(){ - controls.smoothTime = 3.0; - }, 5000); - - controls.dollyToCursor = true - - - // set map controls - // controls.mouseButtons = { - // left: CameraControls.ACTION.TRUCK, - // middle: CameraControls.ACTION.DOLLY, - // wheel: CameraControls.ACTION.DOLLY, - // right: CameraControls.ACTION.ROTATE - // } - - // controls.touches = { - // one: CameraControls.ACTION.TOUCH_TRUCK, - // two: CameraControls.ACTION.TOUCH_DOLLY, - // three: CameraControls.ACTION.TOUCH_ROTATE, - // } - - } - // controls.reset(true); - } - }; - // Handle location marker button state change const handleLocationMarkerButtonClick = (locationMarkerState: boolean) => { setIsLocationMarkerOn(locationMarkerState); - markerRef.current?.setVisible(locationMarkerState); // Update visibility for all markers + markerRef.current?.setVisible(locationMarkerState); }; - // Handle grid filter button state change const handleGridFilterClick = (filterState: boolean) => { setGridFilterState(filterState); surface_layer_ref.current?.changeFilter(filterState); }; - // Handle time interpolation button state change const handleTimeInterpolationClick = (timeInterpolationState: boolean) => { setTimeInterpolationState(timeInterpolationState); surface_layer_ref.current?.changeTimeInterpolation(timeInterpolationState); }; - // Handle dropdown variable selection const handleVariableSelect = (variable: string) => { - setSelectedVariable(variable); // Update the selected variable state + setSelectedVariable(variable); }; - // Function to handle slider change const handleSliderChange = (value: number) => { - surface_layer_ref.current?.tick(value, 0.0); - markerRef.current?.tick(value, 0.0); // Update all markers with new value + surface_layer_ref.current?.tick(value); + markerRef.current?.tick(value); }; - return (
@@ -153,35 +72,38 @@ const World = ({ - {/* Instanced LocationMarker */} - + {/* */} + + -
); diff --git a/air-quality-ui/src/components/globe/shaders/surfaceFrag.glsl b/air-quality-ui/src/components/globe/shaders/surfaceFrag.glsl index f299bc21..cabe0e8b 100644 --- a/air-quality-ui/src/components/globe/shaders/surfaceFrag.glsl +++ b/air-quality-ui/src/components/globe/shaders/surfaceFrag.glsl @@ -89,13 +89,6 @@ float nextFrameData = remap( // interpolate between absolute values of both frames float intData = mix(thisFrameData, nextFrameData, uFrameWeight); -// apply user scaling to data -// float dataRemapped = userRemap(intData); - -// apply colormap to data -// vec4 dataColor = applyColormap( dataRemapped, colorMap, cmap_index ); - - // gl_FragColor = dataColor; gl_FragColor = vec4(1.0); @@ -152,11 +145,7 @@ gl_FragColor = vec4(color/255., 1.0); // overlay lsmTexture vec4 lsmColor = texture2D(lsmTexture, vUv); -// gl_FragColor.rgb = mix(gl_FragColor.rgb, vec3(0.0), lsmColor.a); gl_FragColor = mix(vec4(0.,0.,0.,1.),gl_FragColor,lsmColor.r); -// gl_FragColor = vec4(testFrameData, testFrameData, testFrameData, 1.0); -// gl_FragColor.a *= uLayerOpacity; - } \ No newline at end of file diff --git a/air-quality-ui/src/components/globe/useDataTextures.tsx b/air-quality-ui/src/components/globe/useDataTextures.tsx new file mode 100644 index 00000000..afc1c890 --- /dev/null +++ b/air-quality-ui/src/components/globe/useDataTextures.tsx @@ -0,0 +1,200 @@ +import { useRef, useCallback } from "react"; +import * as THREE from "three"; +import { getForecastDataTexture } from '../../services/forecast-data-service' +import { useForecastContext } from '../../context' + +const API_URL = import.meta.env.VITE_AIR_QUALITY_API_URL + +const generateImageUrls = ( + forecastBaseDate: string, + selectedVariable: string +): string[] => { + + const { forecastDetails } = useForecastContext() + // const response = getForecastDataTexture(forecastDetails.forecastBaseDate) + + return [ + `http://localhost:5173/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_1_of_3.webp`, + `http://localhost:5173/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_2_of_3.webp`, + `http://localhost:5173/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_3_of_3.webp`, + ]; + + // const imageUrls = [ + // `http://64.225.143.231/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_1_of_3.webp`, + // `http://64.225.143.231/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_2_of_3.webp`, + // `http://64.225.143.231/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_3_of_3.webp`, + // ]; + + // const imageUrls = [ + // `/volume/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_1_of_3.webp`, + // `/volume/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_2_of_3.webp`, + // `/volume/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_3_of_3.webp`, + // ]; +}; + +const createCanvasTextureFromMultipleImages = async ( + imageUrls: string[] +): Promise => { + return new Promise((resolve, reject) => { + const images: HTMLImageElement[] = []; + let imagesLoaded = 0; + + const onLoadImage = () => { + imagesLoaded++; + if (imagesLoaded === imageUrls.length) { + const canvas = document.createElement("canvas"); + const context = canvas.getContext("2d"); + + if (context) { + const singleImageWidth = images[0].width; + const singleImageHeight = images[0].height; + canvas.width = singleImageWidth * imageUrls.length; + canvas.height = singleImageHeight; + images.forEach((img, index) => { + context.drawImage(img, index * singleImageWidth, 0); + }); + + resolve(canvas); + } else { + reject(new Error("Failed to get canvas context")); + } + } + }; + + imageUrls.forEach((url) => { + const img = new Image(); + img.crossOrigin = "Anonymous"; + img.onload = onLoadImage; + img.onerror = (error) => reject(error); + img.src = url; + images.push(img); + }); + }); +}; + +const createCanvasTextureFromCanvas = ( + canvas: HTMLCanvasElement, + index: number, + filter: string +): THREE.CanvasTexture => { + const context = canvas.getContext("2d"); + if (context) { + const textureCanvas = document.createElement("canvas"); + const textureContext = textureCanvas.getContext("2d"); + + textureCanvas.width = 900; + textureCanvas.height = 450; + textureContext.drawImage( + canvas, + index * 900, + 0, + 900, + 450, + 0, + 0, + 900, + 450 + ); + + const texture = new THREE.CanvasTexture(textureCanvas); + texture.wrapS = texture.wrapT = THREE.RepeatWrapping; + texture.minFilter = filter === "nearest" ? THREE.NearestFilter : THREE.LinearFilter; + texture.magFilter = filter === "nearest" ? THREE.NearestFilter : THREE.LinearFilter; + + return texture; + } else { + throw new Error("Failed to get texture canvas context"); + } +}; + +// Custom hook for managing textures +export const useDataTextures = ( + forecastBaseDate: string, + selectedVariable: string +) => { + const fullImageCanvasRef = useRef(null); + + const imageUrls = generateImageUrls(forecastBaseDate, selectedVariable); + + const fetchAndUpdateTextures = useCallback( + async ( + thisFrame: number, + nextFrame: number, + mode: string, + filter: string, + newVariable: boolean, + materialRef: React.RefObject + ) => { + if (newVariable && fullImageCanvasRef.current) { + fullImageCanvasRef.current = null; + } + try { + const fullCanvas = + fullImageCanvasRef.current || + (await createCanvasTextureFromMultipleImages(imageUrls)); + fullImageCanvasRef.current = fullCanvas; + + if (materialRef.current) { + let thisCanvasTexture, nextCanvasTexture; + + if (mode === "forward") { + nextCanvasTexture = createCanvasTextureFromCanvas( + fullCanvas, + nextFrame, + filter + ); + materialRef.current.uniforms.thisDataTexture.value = + materialRef.current.uniforms.nextDataTexture.value; + materialRef.current.uniforms.nextDataTexture.value = + nextCanvasTexture; + } else if (mode === "backward") { + thisCanvasTexture = createCanvasTextureFromCanvas( + fullCanvas, + thisFrame, + filter + ); + materialRef.current.uniforms.nextDataTexture.value = + materialRef.current.uniforms.thisDataTexture.value; + materialRef.current.uniforms.thisDataTexture.value = + thisCanvasTexture; + } else if (mode === "reset") { + thisCanvasTexture = createCanvasTextureFromCanvas( + fullCanvas, + thisFrame, + filter + ); + nextCanvasTexture = createCanvasTextureFromCanvas( + fullCanvas, + nextFrame, + filter + ); + materialRef.current.uniforms.thisDataTexture.value = + thisCanvasTexture; + materialRef.current.uniforms.nextDataTexture.value = + nextCanvasTexture; + } + } + } catch (error) { + console.error("Error processing image:", error); + } + }, + [imageUrls] + ); + +const updateTextureFilter = useCallback( + (filter: string, materialRef: React.RefObject) => { + if (materialRef.current) { + materialRef.current.uniforms.thisDataTexture.value.magFilter = + filter === "nearest" ? THREE.NearestFilter : THREE.LinearFilter; + materialRef.current.uniforms.thisDataTexture.value.needsUpdate = true; + + materialRef.current.uniforms.nextDataTexture.value.magFilter = + filter === "nearest" ? THREE.NearestFilter : THREE.LinearFilter; + materialRef.current.uniforms.nextDataTexture.value.needsUpdate = true; + } + }, + [] +); + + return { fetchAndUpdateTextures, updateTextureFilter }; +}; \ No newline at end of file diff --git a/air-quality-ui/src/components/summary-view/GlobalSummary.tsx b/air-quality-ui/src/components/summary-view/GlobalSummary.tsx index 3e9a534e..fb1d9479 100644 --- a/air-quality-ui/src/components/summary-view/GlobalSummary.tsx +++ b/air-quality-ui/src/components/summary-view/GlobalSummary.tsx @@ -5,6 +5,7 @@ import { useCallback, useMemo, useState } from 'react' import classes from './GlobalSummary.module.css' import { SummaryViewHeader } from './SummaryViewHeader' +import { MapViewHeader } from './MapViewHeader' import { useForecastContext } from '../../context' import { getForecastData } from '../../services/forecast-data-service' import { getValidForecastTimesBetween } from '../../services/forecast-time-service' @@ -21,6 +22,7 @@ import World from '../globe/World' // Import your Three.js scene component const GlobalSummary = (): JSX.Element => { const { forecastDetails } = useForecastContext() const [showAllColoured, setShowAllColoured] = useState(true) + const [showMap, setShowMap] = useState(false) const wrapSetShowAllColoured = useCallback( (val: boolean) => { @@ -29,6 +31,13 @@ const GlobalSummary = (): JSX.Element => { [setShowAllColoured], ) + const wrapSetShowMap = useCallback( + (val: boolean) => { + setShowMap(val) + }, + [setShowMap], + ) + const { data: forecastData, isPending: forecastPending, @@ -111,10 +120,6 @@ const GlobalSummary = (): JSX.Element => { )} {!forecastPending && !summaryPending && (
- { summarizedMeasurements={summarizedMeasurementData} showAllColoured={showAllColoured} /> + + {showMap && ( + + )}
)} diff --git a/air-quality-ui/src/components/summary-view/MapViewHeader.module.css b/air-quality-ui/src/components/summary-view/MapViewHeader.module.css new file mode 100644 index 00000000..e811a849 --- /dev/null +++ b/air-quality-ui/src/components/summary-view/MapViewHeader.module.css @@ -0,0 +1,17 @@ +.table-header { + width: 100%; + display: flex; + justify-content: space-between; + padding-top: 10px; + padding-bottom: 20px; +} + +.table-switch-label { + padding-bottom: 3px; +} + +.table-switch-container { + display: flex; + align-items: center; + margin-left: auto; +} diff --git a/air-quality-ui/src/components/summary-view/MapViewHeader.tsx b/air-quality-ui/src/components/summary-view/MapViewHeader.tsx new file mode 100644 index 00000000..77641fef --- /dev/null +++ b/air-quality-ui/src/components/summary-view/MapViewHeader.tsx @@ -0,0 +1,31 @@ +import Switch from '@mui/material/Switch' + +import classes from './MapViewHeader.module.css' + +export interface MapViewHeaderProps { + showMap: boolean + setShowMap: (showMap: boolean) => void +} + +export const MapViewHeader = ({ + showMap, + setShowMap, +}: MapViewHeaderProps): JSX.Element => { + + return ( +
+
+ + ) => { + setShowMap(event.target.checked) + }} + checked={showMap} + /> +
+
+ ) +} diff --git a/air-quality-ui/src/services/forecast-data-service.ts b/air-quality-ui/src/services/forecast-data-service.ts index f6f6905d..90b7ca13 100644 --- a/air-quality-ui/src/services/forecast-data-service.ts +++ b/air-quality-ui/src/services/forecast-data-service.ts @@ -1,7 +1,7 @@ import { DateTime } from 'luxon' import { fetchJson } from './fetch-common' -import { ForecastResponseDto } from './types' +import { ForecastResponseDto, ForecastTextureResponseDto } from './types' import { LocationType } from '../models' const API_URL = import.meta.env.VITE_AIR_QUALITY_API_URL @@ -12,7 +12,7 @@ export const getForecastData = async ( baseTime: DateTime, locationName?: string, locationType: LocationType = 'city', -): Promise => { +): Promise => { const params: Record = { location_type: locationType, valid_time_from: dateFrom.toJSDate().toISOString(), @@ -22,3 +22,12 @@ export const getForecastData = async ( } return fetchJson(`${API_URL}/air-pollutant/forecast`, params) } + +export const getForecastDataTexture = async ( + baseTime: DateTime, +): Promise => { + const params: Record = { + base_time: baseTime.toJSDate().toISOString(), + } + return fetchJson(`${API_URL}/air-pollutant/data_textures`, params) +} diff --git a/air-quality-ui/src/services/types.ts b/air-quality-ui/src/services/types.ts index 5e42c16d..2329580a 100644 --- a/air-quality-ui/src/services/types.ts +++ b/air-quality-ui/src/services/types.ts @@ -35,6 +35,18 @@ export type ForecastResponseDto = { overall_aqi_level: number } & ForecastPollutantDataDto +export type ForecastTextureResponseDto = { + base_time: string + variable: string + time_start: number + time_end: number + chunk: string + source: string + texture_uri: string + min_value: number + max_value: number +} + export type MeasurementsResponseDto = { measurement_date: string location_type: LocationType From c9cba30fed591ffe842eb5518cec86099d214eb8 Mon Sep 17 00:00:00 2001 From: sebsteinig Date: Thu, 12 Sep 2024 15:28:32 +0100 Subject: [PATCH 16/39] updtaed to mui icons --- air-quality-ui/package-lock.json | 414 ++++++++++++------ air-quality-ui/package.json | 4 +- .../src/components/globe/Controls.module.css | 55 +++ .../src/components/globe/Controls.tsx | 225 ++++------ .../src/components/globe/LocationMarker.tsx | 24 +- air-quality-ui/src/components/globe/World.tsx | 1 + 6 files changed, 456 insertions(+), 267 deletions(-) create mode 100644 air-quality-ui/src/components/globe/Controls.module.css diff --git a/air-quality-ui/package-lock.json b/air-quality-ui/package-lock.json index 09b8fd7f..fdffd1cf 100644 --- a/air-quality-ui/package-lock.json +++ b/air-quality-ui/package-lock.json @@ -10,7 +10,9 @@ "dependencies": { "@emotion/react": "^11.13.0", "@emotion/styled": "^11.13.0", - "@mui/x-date-pickers": "^7.12.0", + "@mui/icons-material": "^6.1.0", + "@mui/material": "^6.1.0", + "@mui/x-date-pickers": "^7.16.0", "@react-three/drei": "^9.109.2", "@react-three/fiber": "^8.16.8", "@tanstack/react-query": "^5.40.1", @@ -556,9 +558,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.4.tgz", - "integrity": "sha512-DSgLeL/FNcpXuzav5wfYvHCGvynXkJbn3Zvc3823AEe9nPwW9IK4UoCSS5yGymmQzN0pCPvivtgS6/8U2kkm1w==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.6.tgz", + "integrity": "sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -2195,36 +2197,61 @@ } }, "node_modules/@mui/core-downloads-tracker": { - "version": "5.16.7", - "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.16.7.tgz", - "integrity": "sha512-RtsCt4Geed2/v74sbihWzzRs+HsIQCfclHeORh5Ynu2fS4icIKozcSubwuG7vtzq2uW3fOR1zITSP84TNt2GoQ==", - "peer": true, + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-6.1.0.tgz", + "integrity": "sha512-covEnIn/2er5YdtuukDRA52kmARhKrHjOvPsyTFMQApZdrTBI4h8jbEy2mxZqwMwcAFS9coonQXnEZKL1rUNdQ==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + } + }, + "node_modules/@mui/icons-material": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-6.1.0.tgz", + "integrity": "sha512-HxfB0jxwiMTYMN8gAnYn3avbF1aDrqBEuGIj6JDQ3YkLl650E1Wy8AIhwwyP47wdrv0at9aAR0iOO6VLb74A9w==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.25.6" + }, + "engines": { + "node": ">=14.0.0" + }, "funding": { "type": "opencollective", "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@mui/material": "^6.1.0", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, "node_modules/@mui/material": { - "version": "5.16.7", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.16.7.tgz", - "integrity": "sha512-cwwVQxBhK60OIOqZOVLFt55t01zmarKJiJUWbk0+8s/Ix5IaUzAShqlJchxsIQ4mSrWqgcKCCXKtIlG5H+/Jmg==", - "peer": true, + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-6.1.0.tgz", + "integrity": "sha512-4MJ46vmy1xbm8x+ZdRcWm8jEMMowdS8pYlhKQzg/qoKhOcLhImZvf2Jn6z9Dj6gl+lY+C/0MxaHF/avAAGys3Q==", + "license": "MIT", "dependencies": { - "@babel/runtime": "^7.23.9", - "@mui/core-downloads-tracker": "^5.16.7", - "@mui/system": "^5.16.7", - "@mui/types": "^7.2.15", - "@mui/utils": "^5.16.6", + "@babel/runtime": "^7.25.6", + "@mui/core-downloads-tracker": "^6.1.0", + "@mui/system": "^6.1.0", + "@mui/types": "^7.2.16", + "@mui/utils": "^6.1.0", "@popperjs/core": "^2.11.8", - "@types/react-transition-group": "^4.4.10", - "clsx": "^2.1.0", + "@types/react-transition-group": "^4.4.11", + "clsx": "^2.1.1", "csstype": "^3.1.3", "prop-types": "^15.8.1", "react-is": "^18.3.1", "react-transition-group": "^4.4.5" }, "engines": { - "node": ">=12.0.0" + "node": ">=14.0.0" }, "funding": { "type": "opencollective", @@ -2233,9 +2260,10 @@ "peerDependencies": { "@emotion/react": "^11.5.0", "@emotion/styled": "^11.3.0", - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0" + "@mui/material-pigment-css": "^6.1.0", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "@emotion/react": { @@ -2244,30 +2272,33 @@ "@emotion/styled": { "optional": true }, + "@mui/material-pigment-css": { + "optional": true + }, "@types/react": { "optional": true } } }, "node_modules/@mui/private-theming": { - "version": "5.16.6", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.16.6.tgz", - "integrity": "sha512-rAk+Rh8Clg7Cd7shZhyt2HGTTE5wYKNSJ5sspf28Fqm/PZ69Er9o6KX25g03/FG2dfpg5GCwZh/xOojiTfm3hw==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-6.1.0.tgz", + "integrity": "sha512-+L5qccs4gwsR0r1dgjqhN24QEQRkqIbfOdxILyMbMkuI50x6wNyt9XrV+J3WtjtZTMGJCrUa5VmZBE6OEPGPWA==", "dependencies": { - "@babel/runtime": "^7.23.9", - "@mui/utils": "^5.16.6", + "@babel/runtime": "^7.25.6", + "@mui/utils": "^6.1.0", "prop-types": "^15.8.1" }, "engines": { - "node": ">=12.0.0" + "node": ">=14.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/mui-org" }, "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0" + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "@types/react": { @@ -2276,17 +2307,18 @@ } }, "node_modules/@mui/styled-engine": { - "version": "5.16.6", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.16.6.tgz", - "integrity": "sha512-zaThmS67ZmtHSWToTiHslbI8jwrmITcN93LQaR2lKArbvS7Z3iLkwRoiikNWutx9MBs8Q6okKvbZq1RQYB3v7g==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-6.1.0.tgz", + "integrity": "sha512-MZ+vtaCkjamrT41+b0Er9OMenjAtP/32+L6fARL9/+BZKuV2QbR3q3TmavT2x0NhDu35IM03s4yKqj32Ziqnyg==", "dependencies": { - "@babel/runtime": "^7.23.9", - "@emotion/cache": "^11.11.0", + "@babel/runtime": "^7.25.6", + "@emotion/cache": "^11.13.1", + "@emotion/sheet": "^1.4.0", "csstype": "^3.1.3", "prop-types": "^15.8.1" }, "engines": { - "node": ">=12.0.0" + "node": ">=14.0.0" }, "funding": { "type": "opencollective", @@ -2295,7 +2327,7 @@ "peerDependencies": { "@emotion/react": "^11.4.1", "@emotion/styled": "^11.3.0", - "react": "^17.0.0 || ^18.0.0" + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "@emotion/react": { @@ -2307,21 +2339,21 @@ } }, "node_modules/@mui/system": { - "version": "5.16.7", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.16.7.tgz", - "integrity": "sha512-Jncvs/r/d/itkxh7O7opOunTqbbSSzMTHzZkNLM+FjAOg+cYAZHrPDlYe1ZGKUYORwwb2XexlWnpZp0kZ4AHuA==", - "dependencies": { - "@babel/runtime": "^7.23.9", - "@mui/private-theming": "^5.16.6", - "@mui/styled-engine": "^5.16.6", - "@mui/types": "^7.2.15", - "@mui/utils": "^5.16.6", - "clsx": "^2.1.0", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-6.1.0.tgz", + "integrity": "sha512-NumkGDqT6EdXfcoFLYQ+M4XlTW5hH3+aK48xAbRqKPXJfxl36CBt4DLduw/Voa5dcayGus9T6jm1AwU2hoJ5hQ==", + "dependencies": { + "@babel/runtime": "^7.25.6", + "@mui/private-theming": "^6.1.0", + "@mui/styled-engine": "^6.1.0", + "@mui/types": "^7.2.16", + "@mui/utils": "^6.1.0", + "clsx": "^2.1.1", "csstype": "^3.1.3", "prop-types": "^15.8.1" }, "engines": { - "node": ">=12.0.0" + "node": ">=14.0.0" }, "funding": { "type": "opencollective", @@ -2330,8 +2362,8 @@ "peerDependencies": { "@emotion/react": "^11.5.0", "@emotion/styled": "^11.3.0", - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0" + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "@emotion/react": { @@ -2346,11 +2378,11 @@ } }, "node_modules/@mui/types": { - "version": "7.2.15", - "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.15.tgz", - "integrity": "sha512-nbo7yPhtKJkdf9kcVOF8JZHPZTmqXjJ/tI0bdWgHg5tp9AnIN4Y7f7wm9T+0SyGYJk76+GYZ8Q5XaTYAsUHN0Q==", + "version": "7.2.16", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.16.tgz", + "integrity": "sha512-qI8TV3M7ShITEEc8Ih15A2vLzZGLhD+/UPNwck/hcls2gwg7dyRjNGXcQYHKLB5Q7PuTRfrTkAoPa2VV1s67Ag==", "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0" + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "@types/react": { @@ -2359,27 +2391,27 @@ } }, "node_modules/@mui/utils": { - "version": "5.16.6", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.16.6.tgz", - "integrity": "sha512-tWiQqlhxAt3KENNiSRL+DIn9H5xNVK6Jjf70x3PnfQPz1MPBdh7yyIcAyVBT9xiw7hP3SomRhPR7hzBMBCjqEA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-6.1.0.tgz", + "integrity": "sha512-oT8ZzMISRUhTVpdbYzY0CgrCBb3t/YEdcaM13tUnuTjZ15pdA6g5lx15ZJUdgYXV6PbJdw7tDQgMEr4uXK5TXQ==", "dependencies": { - "@babel/runtime": "^7.23.9", - "@mui/types": "^7.2.15", + "@babel/runtime": "^7.25.6", + "@mui/types": "^7.2.16", "@types/prop-types": "^15.7.12", "clsx": "^2.1.1", "prop-types": "^15.8.1", "react-is": "^18.3.1" }, "engines": { - "node": ">=12.0.0" + "node": ">=14.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/mui-org" }, "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0" + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "@types/react": { @@ -2388,14 +2420,14 @@ } }, "node_modules/@mui/x-date-pickers": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-7.13.0.tgz", - "integrity": "sha512-cmpAfkzOjUgL4I8WenU4elm1QJO8vWpGmIPCezT3Q9wFjGL1QApQhJ5gMZ+X4tM6Gha9AhIWNQX5eXHKbSoyFQ==", - "dependencies": { - "@babel/runtime": "^7.25.0", - "@mui/system": "^5.16.5", - "@mui/utils": "^5.16.5", - "@types/react-transition-group": "^4.4.10", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-7.16.0.tgz", + "integrity": "sha512-NjFAoI6NiJ/65LJf5A38Y+aA/zSIow+7i52QBcgryrdBlIu46nssqzohPRWNUFwnxNXhWstfcV3YAb2avCIY5A==", + "dependencies": { + "@babel/runtime": "^7.25.6", + "@mui/utils": "^5.16.6", + "@mui/x-internals": "7.16.0", + "@types/react-transition-group": "^4.4.11", "clsx": "^2.1.1", "prop-types": "^15.8.1", "react-transition-group": "^4.4.5" @@ -2410,7 +2442,8 @@ "peerDependencies": { "@emotion/react": "^11.9.0", "@emotion/styled": "^11.8.1", - "@mui/material": "^5.15.14", + "@mui/material": "^5.15.14 || ^6.0.0", + "@mui/system": "^5.15.14 || ^6.0.0", "date-fns": "^2.25.0 || ^3.2.0", "date-fns-jalali": "^2.13.0-0 || ^3.2.0-0", "dayjs": "^1.10.7", @@ -2451,6 +2484,83 @@ } } }, + "node_modules/@mui/x-date-pickers/node_modules/@mui/utils": { + "version": "5.16.6", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.16.6.tgz", + "integrity": "sha512-tWiQqlhxAt3KENNiSRL+DIn9H5xNVK6Jjf70x3PnfQPz1MPBdh7yyIcAyVBT9xiw7hP3SomRhPR7hzBMBCjqEA==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/types": "^7.2.15", + "@types/prop-types": "^15.7.12", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "react-is": "^18.3.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/x-internals": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@mui/x-internals/-/x-internals-7.16.0.tgz", + "integrity": "sha512-ijer5XYmWlJqWaTmF6TGH1odG7EAupv8iDWYmDm2yVR9IQ+L2nQSuhiFClI+wmGx40KS2VKOlzDMPpF0t7/HCg==", + "dependencies": { + "@babel/runtime": "^7.25.6", + "@mui/utils": "^5.16.6" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "react": "^17.0.0 || ^18.0.0" + } + }, + "node_modules/@mui/x-internals/node_modules/@mui/utils": { + "version": "5.16.6", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.16.6.tgz", + "integrity": "sha512-tWiQqlhxAt3KENNiSRL+DIn9H5xNVK6Jjf70x3PnfQPz1MPBdh7yyIcAyVBT9xiw7hP3SomRhPR7hzBMBCjqEA==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/types": "^7.2.15", + "@types/prop-types": "^15.7.12", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "react-is": "^18.3.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -2517,7 +2627,6 @@ "version": "2.11.8", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", - "peer": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/popperjs" @@ -12721,9 +12830,9 @@ } }, "@babel/runtime": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.4.tgz", - "integrity": "sha512-DSgLeL/FNcpXuzav5wfYvHCGvynXkJbn3Zvc3823AEe9nPwW9IK4UoCSS5yGymmQzN0pCPvivtgS6/8U2kkm1w==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.6.tgz", + "integrity": "sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==", "requires": { "regenerator-runtime": "^0.14.0" } @@ -13868,25 +13977,31 @@ } }, "@mui/core-downloads-tracker": { - "version": "5.16.7", - "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.16.7.tgz", - "integrity": "sha512-RtsCt4Geed2/v74sbihWzzRs+HsIQCfclHeORh5Ynu2fS4icIKozcSubwuG7vtzq2uW3fOR1zITSP84TNt2GoQ==", - "peer": true + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-6.1.0.tgz", + "integrity": "sha512-covEnIn/2er5YdtuukDRA52kmARhKrHjOvPsyTFMQApZdrTBI4h8jbEy2mxZqwMwcAFS9coonQXnEZKL1rUNdQ==" }, - "@mui/material": { - "version": "5.16.7", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.16.7.tgz", - "integrity": "sha512-cwwVQxBhK60OIOqZOVLFt55t01zmarKJiJUWbk0+8s/Ix5IaUzAShqlJchxsIQ4mSrWqgcKCCXKtIlG5H+/Jmg==", - "peer": true, + "@mui/icons-material": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-6.1.0.tgz", + "integrity": "sha512-HxfB0jxwiMTYMN8gAnYn3avbF1aDrqBEuGIj6JDQ3YkLl650E1Wy8AIhwwyP47wdrv0at9aAR0iOO6VLb74A9w==", "requires": { - "@babel/runtime": "^7.23.9", - "@mui/core-downloads-tracker": "^5.16.7", - "@mui/system": "^5.16.7", - "@mui/types": "^7.2.15", - "@mui/utils": "^5.16.6", + "@babel/runtime": "^7.25.6" + } + }, + "@mui/material": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-6.1.0.tgz", + "integrity": "sha512-4MJ46vmy1xbm8x+ZdRcWm8jEMMowdS8pYlhKQzg/qoKhOcLhImZvf2Jn6z9Dj6gl+lY+C/0MxaHF/avAAGys3Q==", + "requires": { + "@babel/runtime": "^7.25.6", + "@mui/core-downloads-tracker": "^6.1.0", + "@mui/system": "^6.1.0", + "@mui/types": "^7.2.16", + "@mui/utils": "^6.1.0", "@popperjs/core": "^2.11.8", - "@types/react-transition-group": "^4.4.10", - "clsx": "^2.1.0", + "@types/react-transition-group": "^4.4.11", + "clsx": "^2.1.1", "csstype": "^3.1.3", "prop-types": "^15.8.1", "react-is": "^18.3.1", @@ -13894,54 +14009,55 @@ } }, "@mui/private-theming": { - "version": "5.16.6", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.16.6.tgz", - "integrity": "sha512-rAk+Rh8Clg7Cd7shZhyt2HGTTE5wYKNSJ5sspf28Fqm/PZ69Er9o6KX25g03/FG2dfpg5GCwZh/xOojiTfm3hw==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-6.1.0.tgz", + "integrity": "sha512-+L5qccs4gwsR0r1dgjqhN24QEQRkqIbfOdxILyMbMkuI50x6wNyt9XrV+J3WtjtZTMGJCrUa5VmZBE6OEPGPWA==", "requires": { - "@babel/runtime": "^7.23.9", - "@mui/utils": "^5.16.6", + "@babel/runtime": "^7.25.6", + "@mui/utils": "^6.1.0", "prop-types": "^15.8.1" } }, "@mui/styled-engine": { - "version": "5.16.6", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.16.6.tgz", - "integrity": "sha512-zaThmS67ZmtHSWToTiHslbI8jwrmITcN93LQaR2lKArbvS7Z3iLkwRoiikNWutx9MBs8Q6okKvbZq1RQYB3v7g==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-6.1.0.tgz", + "integrity": "sha512-MZ+vtaCkjamrT41+b0Er9OMenjAtP/32+L6fARL9/+BZKuV2QbR3q3TmavT2x0NhDu35IM03s4yKqj32Ziqnyg==", "requires": { - "@babel/runtime": "^7.23.9", - "@emotion/cache": "^11.11.0", + "@babel/runtime": "^7.25.6", + "@emotion/cache": "^11.13.1", + "@emotion/sheet": "^1.4.0", "csstype": "^3.1.3", "prop-types": "^15.8.1" } }, "@mui/system": { - "version": "5.16.7", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.16.7.tgz", - "integrity": "sha512-Jncvs/r/d/itkxh7O7opOunTqbbSSzMTHzZkNLM+FjAOg+cYAZHrPDlYe1ZGKUYORwwb2XexlWnpZp0kZ4AHuA==", - "requires": { - "@babel/runtime": "^7.23.9", - "@mui/private-theming": "^5.16.6", - "@mui/styled-engine": "^5.16.6", - "@mui/types": "^7.2.15", - "@mui/utils": "^5.16.6", - "clsx": "^2.1.0", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-6.1.0.tgz", + "integrity": "sha512-NumkGDqT6EdXfcoFLYQ+M4XlTW5hH3+aK48xAbRqKPXJfxl36CBt4DLduw/Voa5dcayGus9T6jm1AwU2hoJ5hQ==", + "requires": { + "@babel/runtime": "^7.25.6", + "@mui/private-theming": "^6.1.0", + "@mui/styled-engine": "^6.1.0", + "@mui/types": "^7.2.16", + "@mui/utils": "^6.1.0", + "clsx": "^2.1.1", "csstype": "^3.1.3", "prop-types": "^15.8.1" } }, "@mui/types": { - "version": "7.2.15", - "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.15.tgz", - "integrity": "sha512-nbo7yPhtKJkdf9kcVOF8JZHPZTmqXjJ/tI0bdWgHg5tp9AnIN4Y7f7wm9T+0SyGYJk76+GYZ8Q5XaTYAsUHN0Q==", + "version": "7.2.16", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.16.tgz", + "integrity": "sha512-qI8TV3M7ShITEEc8Ih15A2vLzZGLhD+/UPNwck/hcls2gwg7dyRjNGXcQYHKLB5Q7PuTRfrTkAoPa2VV1s67Ag==", "requires": {} }, "@mui/utils": { - "version": "5.16.6", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.16.6.tgz", - "integrity": "sha512-tWiQqlhxAt3KENNiSRL+DIn9H5xNVK6Jjf70x3PnfQPz1MPBdh7yyIcAyVBT9xiw7hP3SomRhPR7hzBMBCjqEA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-6.1.0.tgz", + "integrity": "sha512-oT8ZzMISRUhTVpdbYzY0CgrCBb3t/YEdcaM13tUnuTjZ15pdA6g5lx15ZJUdgYXV6PbJdw7tDQgMEr4uXK5TXQ==", "requires": { - "@babel/runtime": "^7.23.9", - "@mui/types": "^7.2.15", + "@babel/runtime": "^7.25.6", + "@mui/types": "^7.2.16", "@types/prop-types": "^15.7.12", "clsx": "^2.1.1", "prop-types": "^15.8.1", @@ -13949,17 +14065,56 @@ } }, "@mui/x-date-pickers": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-7.13.0.tgz", - "integrity": "sha512-cmpAfkzOjUgL4I8WenU4elm1QJO8vWpGmIPCezT3Q9wFjGL1QApQhJ5gMZ+X4tM6Gha9AhIWNQX5eXHKbSoyFQ==", - "requires": { - "@babel/runtime": "^7.25.0", - "@mui/system": "^5.16.5", - "@mui/utils": "^5.16.5", - "@types/react-transition-group": "^4.4.10", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-7.16.0.tgz", + "integrity": "sha512-NjFAoI6NiJ/65LJf5A38Y+aA/zSIow+7i52QBcgryrdBlIu46nssqzohPRWNUFwnxNXhWstfcV3YAb2avCIY5A==", + "requires": { + "@babel/runtime": "^7.25.6", + "@mui/utils": "^5.16.6", + "@mui/x-internals": "7.16.0", + "@types/react-transition-group": "^4.4.11", "clsx": "^2.1.1", "prop-types": "^15.8.1", "react-transition-group": "^4.4.5" + }, + "dependencies": { + "@mui/utils": { + "version": "5.16.6", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.16.6.tgz", + "integrity": "sha512-tWiQqlhxAt3KENNiSRL+DIn9H5xNVK6Jjf70x3PnfQPz1MPBdh7yyIcAyVBT9xiw7hP3SomRhPR7hzBMBCjqEA==", + "requires": { + "@babel/runtime": "^7.23.9", + "@mui/types": "^7.2.15", + "@types/prop-types": "^15.7.12", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "react-is": "^18.3.1" + } + } + } + }, + "@mui/x-internals": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@mui/x-internals/-/x-internals-7.16.0.tgz", + "integrity": "sha512-ijer5XYmWlJqWaTmF6TGH1odG7EAupv8iDWYmDm2yVR9IQ+L2nQSuhiFClI+wmGx40KS2VKOlzDMPpF0t7/HCg==", + "requires": { + "@babel/runtime": "^7.25.6", + "@mui/utils": "^5.16.6" + }, + "dependencies": { + "@mui/utils": { + "version": "5.16.6", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.16.6.tgz", + "integrity": "sha512-tWiQqlhxAt3KENNiSRL+DIn9H5xNVK6Jjf70x3PnfQPz1MPBdh7yyIcAyVBT9xiw7hP3SomRhPR7hzBMBCjqEA==", + "requires": { + "@babel/runtime": "^7.23.9", + "@mui/types": "^7.2.15", + "@types/prop-types": "^15.7.12", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "react-is": "^18.3.1" + } + } } }, "@nodelib/fs.scandir": { @@ -14006,8 +14161,7 @@ "@popperjs/core": { "version": "2.11.8", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", - "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", - "peer": true + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==" }, "@radix-ui/react-icons": { "version": "1.3.0", diff --git a/air-quality-ui/package.json b/air-quality-ui/package.json index 756affce..0179a306 100644 --- a/air-quality-ui/package.json +++ b/air-quality-ui/package.json @@ -16,7 +16,9 @@ "dependencies": { "@emotion/react": "^11.13.0", "@emotion/styled": "^11.13.0", - "@mui/x-date-pickers": "^7.12.0", + "@mui/icons-material": "^6.1.0", + "@mui/material": "^6.1.0", + "@mui/x-date-pickers": "^7.16.0", "@react-three/drei": "^9.109.2", "@react-three/fiber": "^8.16.8", "@tanstack/react-query": "^5.40.1", diff --git a/air-quality-ui/src/components/globe/Controls.module.css b/air-quality-ui/src/components/globe/Controls.module.css new file mode 100644 index 00000000..86962589 --- /dev/null +++ b/air-quality-ui/src/components/globe/Controls.module.css @@ -0,0 +1,55 @@ +/* Controls.module.css */ +.controlsContainer { + display: flex; + justify-content: center; + align-items: center; + gap: 10px; + padding: 10px; + background-color: #f4f4f4; + border-top: 1px solid #ccc; + } + + .controlButton { + width: 50px; + height: 50px; + display: flex; + justify-content: center; + align-items: center; + border: none; + border-radius: 10%; + cursor: pointer; + margin: 5px; + padding: 10px; + background-color: lightgray; /* Default background color */ + } + + .controlButtonActive { + background-color: blue; /* Active background color */ + color: white; /* Icon color when active */ + } + + .sliderContainer { + display: flex; + flex-direction: column; + align-items: center; + } + + .slider { + width: 500px; + } + + .dropdown { + width: 100px; + height: 40px; + font-size: 16px; + border-radius: 5px; + border: 1px solid lightgray; + padding: 5px; + margin: 5px; + cursor: pointer; + } + + .activeIcon { + color: white; + font-weight: bold; + } \ No newline at end of file diff --git a/air-quality-ui/src/components/globe/Controls.tsx b/air-quality-ui/src/components/globe/Controls.tsx index f2eb0b01..1a54a32e 100644 --- a/air-quality-ui/src/components/globe/Controls.tsx +++ b/air-quality-ui/src/components/globe/Controls.tsx @@ -1,5 +1,7 @@ import React, { useState, useEffect } from 'react'; import { useForecastContext } from '../../context'; +import { PlayArrow, Pause, Add, Remove, LocationOn, Public, AccessTime, GridOn } from '@mui/icons-material'; +import { Button, Select, MenuItem } from '@mui/material'; type ControlsProps = { isTimeRunning: boolean; @@ -9,7 +11,7 @@ type ControlsProps = { onLocationMarkerClick: (locationMarkerState: boolean) => void; onGridFilterClick: (filterState: boolean) => void; onTimeInterpolationClick: (filterState: boolean) => void; - onVariableSelect: (variable: string) => void; // New prop for variable selection + onVariableSelect: (variable: string) => void; }; const Controls: React.FC = ({ @@ -20,19 +22,18 @@ const Controls: React.FC = ({ onLocationMarkerClick, onGridFilterClick, onTimeInterpolationClick, - onVariableSelect, // New prop passed from parent + onVariableSelect, }) => { - const [sliderValue, setSliderValue] = useState(0.0); // Default slider value - const [globeAnimationState, setGlobeAnimationState] = useState(false); // State for globe animation - const [locationMarkerState, setLocationMarkerState] = useState(true); // State for location marker - const [filterState, setGridFilterState] = useState(false); // State for grid filter - const [timeInterpolationState, setTimeInterpolationState] = useState(true); // State for time interpolation - const [timeDelta, setTimeDelta] = useState(0.06); // State for the speed of the slider's advancement - const [selectedVariable, setSelectedVariable] = useState('aqi'); // Default variable to display - - // Handle slider change from user input + const [sliderValue, setSliderValue] = useState(0.0); + const [globeAnimationState, setGlobeAnimationState] = useState(false); + const [locationMarkerState, setLocationMarkerState] = useState(true); + const [filterState, setGridFilterState] = useState(false); + const [timeInterpolationState, setTimeInterpolationState] = useState(true); + const [timeDelta, setTimeDelta] = useState(0.06); + const [selectedVariable, setSelectedVariable] = useState('aqi'); + const handleSliderChange = (event: React.ChangeEvent) => { - const value = parseFloat(event.target.value); // Parse as float for decimal values + const value = parseFloat(event.target.value); setSliderValue(value); }; @@ -40,91 +41,75 @@ const Controls: React.FC = ({ const numForecastHours = forecastDetails.maxForecastDate.diff(forecastDetails.forecastBaseDate, 'hours').hours; const numForecastTimeSteps = numForecastHours / 3; - const currentDate = forecastDetails.forecastBaseDate.plus({ hours: Math.floor(sliderValue * 3) }).toFormat('yyyy-MM-dd T')+' UTC'; + const currentDate = forecastDetails.forecastBaseDate.plus({ hours: Math.floor(sliderValue * 3) }).toFormat('yyyy-MM-dd T') + ' UTC'; - // Effect to notify parent of slider changes useEffect(() => { onSliderChange(sliderValue); }, [sliderValue, onSliderChange]); - // Automatically advance the slider when isTimeRunning is true useEffect(() => { if (isTimeRunning) { const interval = setInterval(() => { setSliderValue((prevValue) => (prevValue >= numForecastTimeSteps ? 0 : prevValue + timeDelta)); }, 25); - return () => clearInterval(interval); // Clean up the interval + return () => clearInterval(interval); } }, [isTimeRunning, timeDelta]); - // Handle globe button click const handleGlobeButtonClick = () => { - setGlobeAnimationState((prevState) => !prevState); // Toggle globe animation state - onGlobeButtonClick(!globeAnimationState); // Notify parent of the state change + setGlobeAnimationState((prevState) => !prevState); + onGlobeButtonClick(!globeAnimationState); }; - // Handle location marker button click const handleLocationMarkerClick = () => { - setLocationMarkerState((prevState) => !prevState); // Toggle location marker state - onLocationMarkerClick(!locationMarkerState); // Notify parent of the state change + setLocationMarkerState((prevState) => !prevState); + onLocationMarkerClick(!locationMarkerState); }; - // Handle grid filter button click const handleGridFilterClick = () => { setGridFilterState((prevState) => !prevState); - onGridFilterClick(!filterState); // Notify parent of the state change + onGridFilterClick(!filterState); }; const handleTimeInterpolationClick = () => { setTimeInterpolationState((prevState) => !prevState); - onTimeInterpolationClick(!timeInterpolationState); // Notify parent of the state change + onTimeInterpolationClick(!timeInterpolationState); }; - // Handle variable selection change - const handleVariableSelectChange = (event: React.ChangeEvent) => { - const variable = event.target.value; + const handleVariableSelectChange = (event: React.ChangeEvent<{ value: unknown }>) => { + const variable = event.target.value as string; setSelectedVariable(variable); - onVariableSelect(variable); // Notify parent of the variable change + onVariableSelect(variable); }; - // Increase timeDelta const handleIncreaseTimeDelta = () => { - setTimeDelta((prevDelta) => prevDelta + 0.02); // Increase by 0.01 + setTimeDelta((prevDelta) => prevDelta + 0.02); }; - // Decrease timeDelta const handleDecreaseTimeDelta = () => { - setTimeDelta((prevDelta) => Math.max(0.02, prevDelta - 0.02)); // Decrease by 0.01, but don't go below 0.01 + setTimeDelta((prevDelta) => Math.max(0.02, prevDelta - 0.02)); }; return (
- {/* Button to toggle time update */} - - - {/* Minus Button */} - - - {/* Plus Button */} - - - {/* Slider */} + + + + + +
= ({ />
- {/* Location Marker Button */} - - - {/* Globe Button */} - - - {/* Checkerboard Button */} - - - {/* Step Curve Button */} - - - {/* Variable Selection Dropdown */} - + + + + + + + + +
); }; @@ -188,22 +176,22 @@ const styles = { display: 'flex', justifyContent: 'center', alignItems: 'center', - gap: '10px', + gap: '10px', // Consistent gap between all controls padding: '10px', backgroundColor: '#f4f4f4', borderTop: '1px solid #ccc', }, controlButton: { - width: '40px', - height: '40px', + width: '50px', // Make the buttons consistent in size + height: '50px', display: 'flex', justifyContent: 'center', alignItems: 'center', - fontSize: '32px', - backgroundColor: 'lightgray', border: 'none', - borderRadius: '20%', + borderRadius: '10%', // Consistent round button shape cursor: 'pointer', + margin: '5px', // Add consistent margin around each button + padding: '10px', // Add padding for more consistent button sizing }, sliderContainer: { display: 'flex', @@ -220,33 +208,12 @@ const styles = { borderRadius: '5px', border: '1px solid lightgray', padding: '5px', + margin: '5px', // Add margin to match the buttons cursor: 'pointer', }, - icon: { - fontSize: '28px', - lineHeight: '32px', - }, - checkerboardButton: { - width: '40px', - height: '40px', - display: 'flex', - justifyContent: 'center', - alignItems: 'center', - fontSize: '32px', - backgroundColor: 'gray', - border: 'none', - borderRadius: '20%', - cursor: 'pointer', - backgroundImage: `linear-gradient(45deg, #ccc 25%, transparent 25%), - linear-gradient(-45deg, #ccc 25%, transparent 25%), - linear-gradient(45deg, transparent 75%, #ccc 75%), - linear-gradient(-45deg, transparent 75%, #ccc 75%)`, - backgroundSize: '20px 20px', - backgroundPosition: '0 0, 0 10px, 10px -10px, -10px 0px', - }, - stepIcon: { - fontSize: '28px', - lineHeight: '32px', + activeIcon: { + color: 'white', + fontWeight: 'bold', }, }; diff --git a/air-quality-ui/src/components/globe/LocationMarker.tsx b/air-quality-ui/src/components/globe/LocationMarker.tsx index 2ec1cdde..3eb251df 100644 --- a/air-quality-ui/src/components/globe/LocationMarker.tsx +++ b/air-quality-ui/src/components/globe/LocationMarker.tsx @@ -4,13 +4,14 @@ import CustomShaderMaterial from 'three-custom-shader-material'; import * as THREE from 'three'; import { useThree, useFrame } from '@react-three/fiber'; import { gsap } from 'gsap'; -import { Float } from '@react-three/drei'; +import { ForecastResponseDto, MeasurementSummaryResponseDto } from '../../services/types'; type LocationMarkerProps = { forecastData: Record; measurementData: Record; selectedVariable: string; isVisible: boolean; + cameraControlsRef: React.RefObject; // Add a reference to CameraControls }; export type LocationMarkerRef = { @@ -108,7 +109,7 @@ const createDataArrays = ( }; const LocationMarker = forwardRef( - ({ forecastData, measurementData, selectedVariable, isVisible }, ref): JSX.Element => { + ({ forecastData, measurementData, selectedVariable, isVisible, cameraControlsRef }, ref): JSX.Element => { if ( !forecastData || @@ -195,18 +196,27 @@ const LocationMarker = forwardRef( // Scale based on camera zoom or position const scaleBasedOnZoom = () => { - if (instancedMarkerRef.current) { - const distance = camera.position.z; // Camera distance from origin - const scaleFactor = distance / 10; // Adjust scale sensitivity + if (instancedMarkerRef.current && cameraControlsRef.current) { + const controls = cameraControlsRef.current; + const distance = controls.distance; // Access distance from CameraControls + const scaleFactor = distance ; // Adjust the scale factor based on the distance instancedMarkerRef.current.material.uniforms.uZoomLevel.value = scaleFactor; } }; + useEffect(() => { + if (instancedMarkerRef.current) { + instancedMarkerRef.current.frustumCulled = false; // Disable frustum culling + } + }, []); + useFrame(() => { // Dynamically update scale based on camera distance scaleBasedOnZoom(); }); + + // Implement the tick function const tick = (weight: number) => { shaderUniforms.uFrameWeight.value = weight % 1; @@ -393,8 +403,8 @@ const LocationMarker = forwardRef( posSphere.z = sinPhiRadius * cos(theta); if (uVariableSize) { - posPlane += position * diff; - posSphere += position * diff; + posPlane += position * diff * uZoomLevel * 0.8; + posSphere += position * diff * uZoomLevel * 0.3; } else { posPlane += position; posSphere += position; diff --git a/air-quality-ui/src/components/globe/World.tsx b/air-quality-ui/src/components/globe/World.tsx index 994c385d..2e536a70 100644 --- a/air-quality-ui/src/components/globe/World.tsx +++ b/air-quality-ui/src/components/globe/World.tsx @@ -83,6 +83,7 @@ const World = ({ measurementData={summarizedMeasurementData} selectedVariable={selectedVariable} isVisible={isLocationMarkerOn} + cameraControlsRef={cameraControlsRef} /> From 1b31582440956079bc2d9147f6b74233b8e2ff6d Mon Sep 17 00:00:00 2001 From: sebsteinig Date: Fri, 13 Sep 2024 06:56:19 +0100 Subject: [PATCH 17/39] fixed markers for missing insitud data --- air-quality-ui/Dockerfile | 2 +- .../src/components/globe/CameraSettings.tsx | 8 +- .../src/components/globe/Controls.tsx | 41 ++++-- .../src/components/globe/LocationMarker.tsx | 124 +++++++++++++----- .../src/components/globe/SurfaceLayer.tsx | 21 ++- air-quality-ui/src/components/globe/World.tsx | 6 +- .../components/globe/shaders/surfaceFrag.glsl | 82 ++++++++---- .../src/components/globe/useDataTextures.tsx | 5 +- .../components/summary-view/GlobalSummary.tsx | 18 +-- 9 files changed, 210 insertions(+), 97 deletions(-) diff --git a/air-quality-ui/Dockerfile b/air-quality-ui/Dockerfile index 33242b9a..9caf8958 100644 --- a/air-quality-ui/Dockerfile +++ b/air-quality-ui/Dockerfile @@ -3,7 +3,7 @@ FROM node:22.4.0-alpine AS development WORKDIR /app COPY package.json package.json -RUN npm i --verbose +RUN npm i COPY . . diff --git a/air-quality-ui/src/components/globe/CameraSettings.tsx b/air-quality-ui/src/components/globe/CameraSettings.tsx index 7cfc0a24..f37a739d 100644 --- a/air-quality-ui/src/components/globe/CameraSettings.tsx +++ b/air-quality-ui/src/components/globe/CameraSettings.tsx @@ -5,11 +5,15 @@ import * as THREE from 'three'; type CameraSettingsProps = { globeState: boolean; cameraControlsRef: React.RefObject; + toggle: string; }; -const CameraSettings: React.FC = ({ globeState, cameraControlsRef }) => { +const CameraSettings: React.FC = ({ globeState, cameraControlsRef, toggle }) => { useEffect(() => { if (cameraControlsRef.current) { + + console.log('render camera settings'); + console.log(globeState) const controls = cameraControlsRef.current; if (globeState) { @@ -59,7 +63,7 @@ const CameraSettings: React.FC = ({ globeState, cameraContr }, 5000); } } - }, [globeState, cameraControlsRef]); + }, [globeState, cameraControlsRef, toggle]); return null; }; diff --git a/air-quality-ui/src/components/globe/Controls.tsx b/air-quality-ui/src/components/globe/Controls.tsx index 1a54a32e..647d2408 100644 --- a/air-quality-ui/src/components/globe/Controls.tsx +++ b/air-quality-ui/src/components/globe/Controls.tsx @@ -1,7 +1,8 @@ -import React, { useState, useEffect } from 'react'; +import React, { useState, useEffect, useMemo, useRef } from 'react'; import { useForecastContext } from '../../context'; import { PlayArrow, Pause, Add, Remove, LocationOn, Public, AccessTime, GridOn } from '@mui/icons-material'; import { Button, Select, MenuItem } from '@mui/material'; +import { ForecastResponseDto } from '../../services/types'; type ControlsProps = { isTimeRunning: boolean; @@ -12,6 +13,7 @@ type ControlsProps = { onGridFilterClick: (filterState: boolean) => void; onTimeInterpolationClick: (filterState: boolean) => void; onVariableSelect: (variable: string) => void; + forecastData: Record; }; const Controls: React.FC = ({ @@ -23,6 +25,7 @@ const Controls: React.FC = ({ onGridFilterClick, onTimeInterpolationClick, onVariableSelect, + forecastData, }) => { const [sliderValue, setSliderValue] = useState(0.0); const [globeAnimationState, setGlobeAnimationState] = useState(false); @@ -38,11 +41,25 @@ const Controls: React.FC = ({ }; const { forecastDetails } = useForecastContext(); - const numForecastHours = forecastDetails.maxForecastDate.diff(forecastDetails.forecastBaseDate, 'hours').hours; - const numForecastTimeSteps = numForecastHours / 3; - + const numForecastTimeStepsRef = useRef(0); + const [reRender, setReRender] = useState(false); + + useEffect(() => { + const numForecastHours = forecastDetails.maxForecastDate.diff(forecastDetails.forecastBaseDate, 'hours').hours; + const newNumForecastTimeSteps = numForecastHours / 3; + + if (numForecastTimeStepsRef.current !== newNumForecastTimeSteps) { + numForecastTimeStepsRef.current = newNumForecastTimeSteps; + setReRender((prev) => !prev); + } + }, [forecastDetails.maxForecastDate, forecastDetails.forecastBaseDate]); + const currentDate = forecastDetails.forecastBaseDate.plus({ hours: Math.floor(sliderValue * 3) }).toFormat('yyyy-MM-dd T') + ' UTC'; + useEffect(() => { + setSliderValue(0); + }, [forecastData]); + useEffect(() => { onSliderChange(sliderValue); }, [sliderValue, onSliderChange]); @@ -50,7 +67,7 @@ const Controls: React.FC = ({ useEffect(() => { if (isTimeRunning) { const interval = setInterval(() => { - setSliderValue((prevValue) => (prevValue >= numForecastTimeSteps ? 0 : prevValue + timeDelta)); + setSliderValue((prevValue) => (prevValue >= numForecastTimeStepsRef.current ? 0 : prevValue + timeDelta)); }, 25); return () => clearInterval(interval); @@ -97,7 +114,7 @@ const Controls: React.FC = ({ onClick={onToggleTimeUpdate} style={{ ...styles.controlButton, - backgroundColor: isTimeRunning ? '#1976d2' : 'lightgray', // Blue when time is running + backgroundColor: isTimeRunning ? '#1976d2' : 'lightgray', }}> {isTimeRunning ? : } @@ -116,7 +133,7 @@ const Controls: React.FC = ({ id="slider" type="range" min="0" - max={numForecastTimeSteps.toString()} + max={numForecastTimeStepsRef.current.toString()} step="0.1" value={sliderValue} onChange={handleSliderChange} @@ -128,7 +145,7 @@ const Controls: React.FC = ({ onClick={handleLocationMarkerClick} style={{ ...styles.controlButton, - backgroundColor: locationMarkerState ? '#1976d2' : 'lightgray', // Blue when location markers are visible + backgroundColor: locationMarkerState ? '#1976d2' : 'lightgray', }}> @@ -137,7 +154,7 @@ const Controls: React.FC = ({ onClick={handleGlobeButtonClick} style={{ ...styles.globeButton, - backgroundColor: globeAnimationState ? '#1976d2' : 'lightgray', // Blue when globe animation is active + backgroundColor: globeAnimationState ? '#1976d2' : 'lightgray', }}> @@ -146,7 +163,7 @@ const Controls: React.FC = ({ onClick={handleGridFilterClick} style={{ ...styles.checkerboardButton, - backgroundColor: filterState ? '#1976d2' : 'lightgray', // Blue when grid filter is active + backgroundColor: filterState ? '#1976d2' : 'lightgray', }}> @@ -155,7 +172,7 @@ const Controls: React.FC = ({ onClick={handleTimeInterpolationClick} style={{ ...styles.controlButton, - backgroundColor: timeInterpolationState ? '#1976d2' : 'lightgray', // Blue when time interpolation is active + backgroundColor: timeInterpolationState ? '#1976d2' : 'lightgray', }}> @@ -165,7 +182,9 @@ const Controls: React.FC = ({ onChange={handleVariableSelectChange} style={styles.dropdown}> AQI + PM2.5 PM10 + O3
); diff --git a/air-quality-ui/src/components/globe/LocationMarker.tsx b/air-quality-ui/src/components/globe/LocationMarker.tsx index 3eb251df..1205d49e 100644 --- a/air-quality-ui/src/components/globe/LocationMarker.tsx +++ b/air-quality-ui/src/components/globe/LocationMarker.tsx @@ -36,8 +36,8 @@ const createDataArrays = ( let variable_name; if (variable === 'aqi') { variable_name = 'overall_aqi_level'; - } else if (variable === 'pm10') { - variable_name = 'pm10'; + } else { + variable_name = variable; } const forecastDataArray: number[] = []; @@ -51,6 +51,7 @@ const createDataArrays = ( // Process forecast data cityForecastData.forEach((forecastEntry) => { const forecastValue = forecastEntry[variable_name]; + // console.log(forecastEntry) if (variable === 'aqi') { forecastDataArray.push(forecastValue); } else { @@ -240,6 +241,13 @@ const LocationMarker = forwardRef( setVisible })); + const variableIndex = selectedVariable === "aqi" ? 1 : + selectedVariable === "pm2_5" ? 2 : + selectedVariable === "pm10" ? 3 : + selectedVariable === "o3" ? 4 : + selectedVariable === "no2" ? 5 : + selectedVariable === "so2" ? 6 : undefined; + return ( @@ -258,51 +266,81 @@ const LocationMarker = forwardRef( if (uVariableIndex == 1.0) { // "aqi" if (value == -1.0) { - color = vec3(0.15, 0.15, 0.15); // Default to dark grey for missing values + color = vec3(38, 38, 38); // Default to dark grey for missing values } else if (value >= 1.0 && value < 2.0) { - color = vec3(129.0 / 255.0, 237.0 / 255.0, 229.0 / 255.0); + color = vec3(129.0, 237.0, 229.0); } else if (value >= 2.0 && value < 3.0) { - color = vec3(116.0 / 255.0, 201.0 / 255.0, 172.0 / 255.0); + color = vec3(116.0, 201.0, 172.0); } else if (value >= 3.0 && value < 4.0) { - color = vec3(238.0 / 255.0, 230.0 / 255.0, 97.0 / 255.0); + color = vec3(238.0, 230.0, 97.0); } else if (value >= 4.0 && value < 5.0) { - color = vec3(236.0 / 255.0, 94.0 / 255.0, 87.0 / 255.0); + color = vec3(236.0, 94.00, 87.0); } else if (value >= 5.0 && value < 6.0) { - color = vec3(137.0 / 255.0, 26.0 / 255.0, 52.0 / 255.0); + color = vec3(137.0, 26.0, 52.0); } else if (value >= 6.0 && value < 7.0) { - color = vec3(115.0 / 255.0, 40.0 / 255.0, 125.0 / 255.0); + color = vec3(115.0, 40.0, 125.0); } else { - color = vec3(0.15, 0.15, 0.15); // Default to dark grey - } - } else if (uVariableIndex == 2.0) { // "pm10" + color = vec3(38, 38, 38); // Default to dark grey + } + } else if ( (uVariableIndex == 2.0) || (uVariableIndex == 3.0) ){ // "pm25 and pm10" if (value == -1.0) { - color = vec3(0.15, 0.15, 0.15); // Default to dark grey for missing values + color = vec3(38, 38, 38); // Default to dark grey for missing values } else if (value < 30.0) { - color = vec3(1.0, 1.0, 1.0); + color = vec3(255.0, 255.0, 255.0); } else if (value < 40.0) { - color = vec3(233.0/ 255.0, 249.0/ 255.0, 188.0/ 255.0); // Green + color = vec3(233.0, 249.0, 188.0); // Green } else if (value < 50.0) { - color = vec3(198.0/ 255.0, 255.0/ 255.0, 199.0/ 255.0); // Blue + color = vec3(198.0, 255.0, 199.0); // Blue } else if (value < 60.0) { - color = vec3(144.0/ 255.0, 237.0/ 255.0, 169.0/ 255.0); // Yellow + color = vec3(144.0, 237.0, 169.0); // Yellow } else if (value < 80.0) { - color = vec3(76.0/ 255.0, 180.0/ 255.0, 148.0/ 255.0); // Orange + color = vec3(76.0, 180.0, 148.0); // Orange } else if (value < 100.0) { - color = vec3(48.0/ 255.0, 155.0/ 255.0, 138.0/ 255.0); // Purple + color = vec3(48.0, 155.0, 138.0); // Purple } else if (value < 150.0) { - color = vec3(47.0/ 255.0, 137.0/ 255.0, 169.0/ 255.0); // Yellow + color = vec3(47.0, 137.0, 169.0); // Yellow } else if (value < 200.0) { - color = vec3(16.0/ 255.0, 99.0/ 255.0, 164.0/ 255.0); // Orange + color = vec3(16.0, 99.0, 164.0); // Orange } else if (value < 300.0) { - color = vec3(13.0/ 255.0, 69.0/ 255.0, 126.0/ 255.0); // Purple + color = vec3(13.0, 69.0, 126.0); // Purple } else if (value < 500.0) { - color = vec3(15.0/ 255.0, 26.0/ 255.0, 136.0/ 255.0); // Orange + color = vec3(15.0, 26.0, 136.0); // Orange } else if (value < 1000.0) { - color = vec3(38.0/ 255.0, 2.0/ 255.0, 60.0/ 255.0); // Purple + color = vec3(38.0, 2.0, 60.0); // Purple } else { color = vec3(0.0, 0.0, 0.0); // Black for values out of range + } + } else if (uVariableIndex == 4.0) { // "o3" + if (value < 10.0) { + color = vec3(144.0, 190.0, 228.0); // Red + } else if (value < 20.0) { + color = vec3(20.0, 145.0, 216.0); // Green + } else if (value < 30.0) { + color = vec3(15.0, 109.0, 179.0); // Blue + } else if (value < 40.0) { + color = vec3(35.0, 79.0, 146.0); // Yellow + } else if (value < 50.0) { + color = vec3(37.0, 133.0, 100.0); // Orange + } else if (value < 60.0) { + color = vec3(96.0, 168.0, 83.0); // Purple + } else if (value < 70.0) { + color = vec3(157.0, 193.0, 99.0); // Yellow + } else if (value < 80.0) { + color = vec3(255.0,242.0, 148.0); // Orange + } else if (value < 90.0) { + color = vec3(240.0, 203.0, 62.0); // Purple + } else if (value < 100.0) { + color = vec3(229.0, 172.0, 59.0); // Orange + } else if (value < 120.0) { + color = vec3(214.0, 124.0, 62.0); // Purple + } else if (value < 150.0) { + color = vec3(196.0, 49.0, 50.0); // Purple + } else { + color = vec3(142.0, 25.0, 35.0); // Black for values out of range } } + + color = color / 255.0; return color; } @@ -351,33 +389,51 @@ const LocationMarker = forwardRef( if (uVariableIndex == 1.0) { minValue = 1.0; maxValue = 6.0; - } else if (uVariableIndex == 2.0) { + } else if ( (uVariableIndex == 2.0) || (uVariableIndex == 3.0) ) { minValue = 1.0; maxValue = 1000.0; - } - + } else if (uVariableIndex == 4.0) { + minValue = 1.0; + maxValue = 500.0; + } forecastValue = clamp(forecastValue, minValue, maxValue); // if (measurementValue > 0.0) { - measurementValue = clamp(measurementValue, minValue, maxValue); + // measurementValue = clamp(measurementValue, minValue, maxValue); // } nextForecastValue = clamp(nextForecastValue, minValue, maxValue); nextMeasurementValue = clamp(nextMeasurementValue, minValue, maxValue); - thisDiff = abs(measurementValue-forecastValue); - nextDiff = abs(nextMeasurementValue-nextForecastValue); + if (measurementValue != -1.0) { + thisDiff = abs(measurementValue-forecastValue); + } else { + thisDiff = 0.0; + } + if (nextMeasurementValue != -1.0) { + nextDiff = abs(nextMeasurementValue-nextForecastValue); + } else { + nextDiff = 0.0; + } diff = mix(thisDiff, nextDiff, uFrameWeight); if (uVariableIndex == 1.0) { diff = clamp(diff * 0.8, 1.0, 6.0); - } else if (uVariableIndex == 2.0) { + } else if ( (uVariableIndex == 2.0) || (uVariableIndex == 3.0) ) { diff = clamp(diff/20.0, 1.0, 4.0); + } else if (uVariableIndex == 4.0) { + diff = clamp(diff/30.0, 1.0, 5.0); + } + + if ( measurementValueInterpolated < 0.0 ) { + diff = 0.5; } vec3 color; - if ( (measurementValueInterpolated > 0.0 ) || (diff > 1.0) ) { + // if ( (measurementValueInterpolated > 0.0 ) || (diff > 1.0) ) { + if ( (measurementValueInterpolated > 0.0 ) ) { color = getColorForValue(measurementValue, uVariableIndex); } else { - color = getColorForValue(0.0, uVariableIndex); + // color = getColorForValue(0.0, uVariableIndex); + color = vec3(0.15, 0.15, 0.15); } // color = getColorForValue(measurementValue, uVariableIndex); @@ -438,7 +494,7 @@ const LocationMarker = forwardRef( uOpacity: { value: 1.0 }, forecastTexture: { value: forecastDataTexture.current }, measurementTexture: { value: measurementDataTexture.current }, - uVariableIndex: { value: selectedVariable === 'aqi' ? 1 : 2 }, + uVariableIndex: { value: variableIndex }, uMaxMarkers: { value: forecastDataTexture.current?.image.width }, uNumTimseSteps: { value: forecastDataTexture.current?.image.height }, }} diff --git a/air-quality-ui/src/components/globe/SurfaceLayer.tsx b/air-quality-ui/src/components/globe/SurfaceLayer.tsx index e0ef9efa..0e38edd5 100644 --- a/air-quality-ui/src/components/globe/SurfaceLayer.tsx +++ b/air-quality-ui/src/components/globe/SurfaceLayer.tsx @@ -91,18 +91,19 @@ const SurfaceLayer = memo( colorMap: { value: cmap }, colorMapIndex: { value: 0.0 }, lsmTexture: { value: lsm }, - uVariableIndex: { value: variableIndex }, + uVariableIndex: { value: null }, }, }) ); - var variableIndex; - if (selectedVariable === "aqi") { - variableIndex = 1; - } else if (selectedVariable === "pm10") { - variableIndex = 2; - } + const variableIndex = selectedVariable === "aqi" ? 1 : + selectedVariable === "pm2_5" ? 2 : + selectedVariable === "pm10" ? 3 : + selectedVariable === "o3" ? 4 : + selectedVariable === "no2" ? 5 : + selectedVariable === "so2" ? 6 : undefined; materialRef.current.uniforms.uVariableIndex.value = variableIndex; + console.log(variableIndex) const windowIndexRef = useRef(0); @@ -144,9 +145,6 @@ const SurfaceLayer = memo( thisFrame = windowIndexRef.current - 1; nextFrame = windowIndexRef.current; mode = "backward"; - // thisFrame = Math.floor(sliderValue); - // nextFrame = thisFrame + 1; - // mode = sliderValue > thisFrame ? "forward" : "backward"; } fetchAndUpdateTextures( thisFrame, @@ -164,9 +162,6 @@ const SurfaceLayer = memo( : 0; materialRef.current.uniforms.uFrameWeight.value = weight; - // shaderUniforms.uFrameWeight.value = weight; - // console.log(materialRef.current.uniforms.uTimeInterpolation.value) - // console.log(materialRef.current.uniforms.uFrameWeight.value) } }; diff --git a/air-quality-ui/src/components/globe/World.tsx b/air-quality-ui/src/components/globe/World.tsx index 2e536a70..9fe26969 100644 --- a/air-quality-ui/src/components/globe/World.tsx +++ b/air-quality-ui/src/components/globe/World.tsx @@ -11,11 +11,13 @@ import ControlsHandler from './ControlsHandler'; // Import the ControlsHandler c type WorldProps = { forecastData: Record; summarizedMeasurementData: Record; + toggle: string; }; const World = ({ forecastData, summarizedMeasurementData, + toggle }: WorldProps): JSX.Element => { const surface_layer_ref = useRef(null); const markerRef = useRef(null); @@ -75,6 +77,7 @@ const World = ({ isFilterNearest={isFilterNearest} isTimeInterpolation={isTimeInterpolation} selectedVariable={selectedVariable} + toggle={toggle} /> {/* */} - + ); diff --git a/air-quality-ui/src/components/globe/shaders/surfaceFrag.glsl b/air-quality-ui/src/components/globe/shaders/surfaceFrag.glsl index cabe0e8b..e3d67158 100644 --- a/air-quality-ui/src/components/globe/shaders/surfaceFrag.glsl +++ b/air-quality-ui/src/components/globe/shaders/surfaceFrag.glsl @@ -57,13 +57,23 @@ float opacity_cutoff = 0.0; float remapMin; float remapMax; -if ( uVariableIndex == 1.0 ) { +if ( uVariableIndex == 1.0 ) { // AQI remapMin = 1.0; remapMax = 7.0; -} else if ( uVariableIndex == 2.0 ) { +} else if ( ( uVariableIndex == 2.0 ) || ( uVariableIndex == 3.0 ) ) { // PM10, PM2.5 remapMin = 0.0; remapMax = 1000.0; -} +} else if ( uVariableIndex == 4.0 ) { // O3 + remapMin = 0.0; + remapMax = 500.0; +} else if ( uVariableIndex == 5.0 ) { // NO2 + remapMin = 0.0; + remapMax = 100.0; +} else if ( uVariableIndex == 6.0 ) { // SO2 + remapMin = 0.0; + remapMax = 100.0; +} + // convert relative bitmap value to absolute value for both frames float thisFrameData = remap( @@ -99,45 +109,73 @@ vec3 color; // AQI if ( uVariableIndex == 1.0 ) { if (intData >= 1.0 && intData < 2.0) { - color = vec3(129., 237., 229.); // Red + color = vec3(129., 237., 229.); } else if (intData >= 2.0 && intData < 3.0) { - color = vec3(116.0, 201.0, 172.0); // Green + color = vec3(116.0, 201.0, 172.0); } else if (intData >= 3.0 && intData < 4.0) { - color = vec3(238.0, 230.0, 97.0); // Blue + color = vec3(238.0, 230.0, 97.0); } else if (intData >= 4.0 && intData < 5.0) { - color = vec3(236.0, 94.0, 87.0); // Yellow + color = vec3(236.0, 94.0, 87.0); } else if (intData >= 5.0 && intData < 6.0) { - color = vec3(137.0, 26.0, 52.0); // Orange + color = vec3(137.0, 26.0, 52.0); } else if (intData >= 6.0 && intData < 7.0) { - color = vec3(115.0, 40.0, 125.0); // Purple + color = vec3(115.0, 40.0, 125.0); } else { - color = vec3(0.0, 0.0, 0.0); // Black for values out of range + color = vec3(0.0, 0.0, 0.0); } -} else if ( uVariableIndex == 2.0) { +} else if ( ( uVariableIndex == 2.0) || ( uVariableIndex == 3.0) ) { if (intData < 30.0) { color = vec3(255.0); // Red } else if (intData < 40.0) { - color = vec3(233.0, 249.0, 188.0); // Green + color = vec3(233.0, 249.0, 188.0); } else if (intData < 50.0) { - color = vec3(198.0, 255.0, 199.0); // Blue + color = vec3(198.0, 255.0, 199.0); } else if (intData < 60.0) { - color = vec3(144.0, 237.0, 169.0); // Yellow + color = vec3(144.0, 237.0, 169.0); } else if (intData < 80.0) { - color = vec3(76.0, 180.0, 148.0); // Orange + color = vec3(76.0, 180.0, 148.0); } else if (intData < 100.0) { - color = vec3(48.0, 155.0, 138.0); // Purple + color = vec3(48.0, 155.0, 138.0); } else if (intData < 150.0) { - color = vec3(47.0, 137.0, 169.0); // Yellow + color = vec3(47.0, 137.0, 169.0); } else if (intData < 200.0) { - color = vec3(16.0, 99.0, 164.0); // Orange + color = vec3(16.0, 99.0, 164.0); } else if (intData < 300.0) { - color = vec3(13.0, 69.0, 126.0); // Purple + color = vec3(13.0, 69.0, 126.0); } else if (intData < 500.0) { - color = vec3(15.0, 26.0, 136.0); // Orange + color = vec3(15.0, 26.0, 136.0); } else if (intData < 1000.0) { - color = vec3(38.0, 2.0, 60.0); // Purple + color = vec3(38.0, 2.0, 60.0); + } else { + color = vec3(0.0, 0.0, 0.0); + } +} else if ( uVariableIndex == 4.0 ) { // O3 + if (intData < 10.0) { + color = vec3(144.0, 190.0, 228.0); + } else if (intData < 20.0) { + color = vec3(20.0, 145.0, 216.0); + } else if (intData < 30.0) { + color = vec3(15.0, 109.0, 179.0); + } else if (intData < 40.0) { + color = vec3(35.0, 79.0, 146.0); + } else if (intData < 50.0) { + color = vec3(37.0, 133.0, 100.0); + } else if (intData < 60.0) { + color = vec3(96.0, 168.0, 83.0); + } else if (intData < 70.0) { + color = vec3(157.0, 193.0, 99.0); + } else if (intData < 80.0) { + color = vec3(255.0,242.0, 148.0); + } else if (intData < 90.0) { + color = vec3(240.0, 203.0, 62.0); + } else if (intData < 100.0) { + color = vec3(229.0, 172.0, 59.0); + } else if (intData < 120.0) { + color = vec3(214.0, 124.0, 62.0); + } else if (intData < 150.0) { + color = vec3(196.0, 49.0, 50.0); } else { - color = vec3(0.0, 0.0, 0.0); // Black for values out of range + color = vec3(142.0, 25.0, 35.0); } } diff --git a/air-quality-ui/src/components/globe/useDataTextures.tsx b/air-quality-ui/src/components/globe/useDataTextures.tsx index afc1c890..b5ba3945 100644 --- a/air-quality-ui/src/components/globe/useDataTextures.tsx +++ b/air-quality-ui/src/components/globe/useDataTextures.tsx @@ -1,7 +1,5 @@ import { useRef, useCallback } from "react"; import * as THREE from "three"; -import { getForecastDataTexture } from '../../services/forecast-data-service' -import { useForecastContext } from '../../context' const API_URL = import.meta.env.VITE_AIR_QUALITY_API_URL @@ -10,8 +8,6 @@ const generateImageUrls = ( selectedVariable: string ): string[] => { - const { forecastDetails } = useForecastContext() - // const response = getForecastDataTexture(forecastDetails.forecastBaseDate) return [ `http://localhost:5173/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_1_of_3.webp`, @@ -115,6 +111,7 @@ export const useDataTextures = ( const fullImageCanvasRef = useRef(null); const imageUrls = generateImageUrls(forecastBaseDate, selectedVariable); + console.log(imageUrls) const fetchAndUpdateTextures = useCallback( async ( diff --git a/air-quality-ui/src/components/summary-view/GlobalSummary.tsx b/air-quality-ui/src/components/summary-view/GlobalSummary.tsx index fb1d9479..600caefc 100644 --- a/air-quality-ui/src/components/summary-view/GlobalSummary.tsx +++ b/air-quality-ui/src/components/summary-view/GlobalSummary.tsx @@ -16,13 +16,12 @@ import { } from '../../services/types' import { LoadingSpinner } from '../common/LoadingSpinner' import GlobalSummaryTable from '../summary-grid/table/GlobalSummaryTable' -import World from '../globe/World' // Import your Three.js scene component -// import World from '../globe/World.loop' // Import your Three.js scene component +import World from '../globe/World' const GlobalSummary = (): JSX.Element => { const { forecastDetails } = useForecastContext() const [showAllColoured, setShowAllColoured] = useState(true) - const [showMap, setShowMap] = useState(false) + const [showMap, setShowMap] = useState(true) const wrapSetShowAllColoured = useCallback( (val: boolean) => { @@ -118,6 +117,13 @@ const GlobalSummary = (): JSX.Element => { )} + {showMap && ( + + )} {!forecastPending && !summaryPending && (
{ setShowMap={wrapSetShowMap} showMap={showMap} /> - {showMap && ( - - )}
)} From eb8a69b17ee244d32b5b8f60b95b312c28f55a5e Mon Sep 17 00:00:00 2001 From: sebsteinig Date: Fri, 13 Sep 2024 08:14:06 +0100 Subject: [PATCH 18/39] fixed typescript issues --- .../src/components/globe/Controls.tsx | 14 +-- .../src/components/globe/ControlsHandler.tsx | 14 ++- .../src/components/globe/LocationMarker.tsx | 101 ++++++++---------- .../src/components/globe/SurfaceLayer.tsx | 7 +- .../src/components/globe/TextureProcessor.tsx | 28 +++-- air-quality-ui/src/components/globe/World.tsx | 14 ++- .../src/components/globe/useDataTextures.tsx | 2 +- .../components/summary-view/GlobalSummary.tsx | 2 +- air-quality-ui/src/services/custom.d.ts | 4 + .../src/services/forecast-data-service.ts | 4 +- 10 files changed, 95 insertions(+), 95 deletions(-) create mode 100644 air-quality-ui/src/services/custom.d.ts diff --git a/air-quality-ui/src/components/globe/Controls.tsx b/air-quality-ui/src/components/globe/Controls.tsx index 647d2408..1025fccf 100644 --- a/air-quality-ui/src/components/globe/Controls.tsx +++ b/air-quality-ui/src/components/globe/Controls.tsx @@ -1,7 +1,7 @@ -import React, { useState, useEffect, useMemo, useRef } from 'react'; +import React, { useState, useEffect, useRef, CSSProperties } from 'react'; import { useForecastContext } from '../../context'; import { PlayArrow, Pause, Add, Remove, LocationOn, Public, AccessTime, GridOn } from '@mui/icons-material'; -import { Button, Select, MenuItem } from '@mui/material'; +import { Button, Select, MenuItem, SelectChangeEvent } from '@mui/material'; import { ForecastResponseDto } from '../../services/types'; type ControlsProps = { @@ -94,8 +94,8 @@ const Controls: React.FC = ({ onTimeInterpolationClick(!timeInterpolationState); }; - const handleVariableSelectChange = (event: React.ChangeEvent<{ value: unknown }>) => { - const variable = event.target.value as string; + const handleVariableSelectChange = (event: SelectChangeEvent) => { + const variable = event.target.value; setSelectedVariable(variable); onVariableSelect(variable); }; @@ -190,7 +190,7 @@ const Controls: React.FC = ({ ); }; -const styles = { +const styles: { [key: string]: CSSProperties } = { controlsContainer: { display: 'flex', justifyContent: 'center', @@ -202,7 +202,7 @@ const styles = { }, controlButton: { width: '50px', // Make the buttons consistent in size - height: '50px', + height: '50px', display: 'flex', justifyContent: 'center', alignItems: 'center', @@ -214,7 +214,7 @@ const styles = { }, sliderContainer: { display: 'flex', - flexDirection: 'column', + flexDirection: 'column', // Make sure this is typed correctly alignItems: 'center', }, slider: { diff --git a/air-quality-ui/src/components/globe/ControlsHandler.tsx b/air-quality-ui/src/components/globe/ControlsHandler.tsx index d81dedec..bd6449dc 100644 --- a/air-quality-ui/src/components/globe/ControlsHandler.tsx +++ b/air-quality-ui/src/components/globe/ControlsHandler.tsx @@ -1,6 +1,9 @@ // ControlsHandler.tsx import React from 'react'; import Controls from './Controls'; +import { + ForecastResponseDto, +} from '../../services/types' type ControlsHandlerProps = { toggleTimeUpdate: () => void; @@ -11,10 +14,7 @@ type ControlsHandlerProps = { handleTimeInterpolationClick: (timeInterpolationState: boolean) => void; handleVariableSelect: (variable: string) => void; isTimeRunning: boolean; - isLocationMarkerOn: boolean; - isFilterNearest: boolean; - isTimeInterpolation: boolean; - selectedVariable: string; + forecastData: Record; }; const ControlsHandler: React.FC = ({ @@ -26,10 +26,7 @@ const ControlsHandler: React.FC = ({ handleTimeInterpolationClick, handleVariableSelect, isTimeRunning, - isLocationMarkerOn, - isFilterNearest, - isTimeInterpolation, - selectedVariable, + forecastData, }) => { return ( = ({ onGridFilterClick={handleGridFilterClick} onTimeInterpolationClick={handleTimeInterpolationClick} onVariableSelect={handleVariableSelect} + forecastData={forecastData} /> ); }; diff --git a/air-quality-ui/src/components/globe/LocationMarker.tsx b/air-quality-ui/src/components/globe/LocationMarker.tsx index 1205d49e..986c3bd3 100644 --- a/air-quality-ui/src/components/globe/LocationMarker.tsx +++ b/air-quality-ui/src/components/globe/LocationMarker.tsx @@ -1,10 +1,13 @@ import { useRef, forwardRef, useImperativeHandle, useEffect, useState } from 'react'; -import { InstancedMesh, Object3D, DataTexture, RGBAFormat, FloatType } from 'three'; +import { DataTexture, RGBAFormat, FloatType } from 'three'; import CustomShaderMaterial from 'three-custom-shader-material'; import * as THREE from 'three'; -import { useThree, useFrame } from '@react-three/fiber'; +import { useFrame } from '@react-three/fiber'; import { gsap } from 'gsap'; import { ForecastResponseDto, MeasurementSummaryResponseDto } from '../../services/types'; +import { + PollutantDataDto, +} from '../../services/types' type LocationMarkerProps = { forecastData: Record; @@ -15,70 +18,72 @@ type LocationMarkerProps = { }; export type LocationMarkerRef = { - tick: (weight: number, uSphereWrapAmount: number) => void; + tick: (weight: number) => void; changeProjection: (globeState: boolean) => void; setVisible: (isVisible: boolean) => void; }; -// Uniforms used in the custom shader material const shaderUniforms = { uSphereWrapAmount: { value: 0.0 }, uFrameWeight: { value: 0.5 }, uFrame: { value: 0.0 }, }; -// Utility function to flatten forecast and measurement data const createDataArrays = ( forecastData: Record, measurementData: Record, variable: string ) => { - let variable_name; + let variable_name: keyof ForecastResponseDto; + if (variable === 'aqi') { - variable_name = 'overall_aqi_level'; + variable_name = 'overall_aqi_level' as keyof ForecastResponseDto; } else { - variable_name = variable; + variable_name = variable as keyof ForecastResponseDto; // Ensure variable is a valid key } const forecastDataArray: number[] = []; const measurementDataArray: number[] = []; - // Loop through each city and process forecast and measurement data Object.keys(forecastData).forEach((city) => { const cityForecastData = forecastData[city]; const cityMeasurementData = measurementData[city] || []; // Measurement data may be missing for some cities - // Process forecast data cityForecastData.forEach((forecastEntry) => { - const forecastValue = forecastEntry[variable_name]; - // console.log(forecastEntry) - if (variable === 'aqi') { - forecastDataArray.push(forecastValue); - } else { - forecastDataArray.push(forecastValue.value); + const forecastValue = forecastEntry[variable_name as keyof typeof forecastEntry]; + + if (forecastValue !== undefined && forecastValue !== null) { + if (variable === 'aqi') { + if (typeof forecastValue === 'number') { + forecastDataArray.push(forecastValue); // Push the number value + } + } else { + if (typeof forecastValue === 'object' && 'value' in forecastValue) { + const value = (forecastValue as PollutantDataDto).value; + if (typeof value === 'number') { + forecastDataArray.push(value); + } + } + } } }); - - // Process measurement data by matching valid_time with measurement_base_time cityForecastData.forEach((forecastEntry) => { const matchingMeasurement = cityMeasurementData.find( (measurementEntry) => measurementEntry.measurement_base_time === forecastEntry.valid_time ); - + if (variable === 'aqi') { - // For AQI, return the overall_aqi_level.mean, or -1 if no match is found const measurementValue = - matchingMeasurement && matchingMeasurement[variable_name] - ? matchingMeasurement[variable_name].mean + matchingMeasurement && matchingMeasurement[variable_name as keyof MeasurementSummaryResponseDto] + ? (matchingMeasurement[variable_name as keyof MeasurementSummaryResponseDto] as any).mean : -1; measurementDataArray.push(measurementValue); } else { - // For PM10, return the overall_aqi_level.mean.value, or -1 if no match is found const measurementValue = - matchingMeasurement && matchingMeasurement[variable_name] - ? matchingMeasurement[variable_name].mean.value + matchingMeasurement && matchingMeasurement[variable_name as keyof MeasurementSummaryResponseDto] + ? (matchingMeasurement[variable_name as keyof MeasurementSummaryResponseDto] as any).mean.value : -1.0; measurementDataArray.push(measurementValue); } @@ -86,21 +91,17 @@ const createDataArrays = ( }); - // Convert the data into vec4 (RGBA format) const forecastDataVec4Array = new Float32Array(forecastDataArray.length * 4); const measurementDataVec4Array = new Float32Array(measurementDataArray.length * 4); - const numCities = Object.keys(forecastData).length; const numEntries = forecastDataArray.length / numCities; - // Fill the vec4 array in column-major order (column-first layout) for (let row = 0; row < numEntries; row++) { for (let col = 0; col < numCities; col++) { const index = col * numEntries + row; // Row-major index const columnMajorIndex = row * numCities + col; // Column-major index - // Place the value in the red channel of the vec4 forecastDataVec4Array.set([forecastDataArray[index], 0, 0, 0], columnMajorIndex * 4); measurementDataVec4Array.set([measurementDataArray[index], 0, 0, 0], columnMajorIndex * 4); } @@ -110,7 +111,7 @@ const createDataArrays = ( }; const LocationMarker = forwardRef( - ({ forecastData, measurementData, selectedVariable, isVisible, cameraControlsRef }, ref): JSX.Element => { + ({ forecastData, measurementData, selectedVariable, isVisible, cameraControlsRef }, ref): JSX.Element | null => { if ( !forecastData || @@ -121,36 +122,33 @@ const LocationMarker = forwardRef( return null; } - const instancedMarkerRef = useRef(null); + type InstancedMeshWithUniforms = THREE.InstancedMesh & { + material: THREE.ShaderMaterial | THREE.ShaderMaterial; + }; - const [triggerRender, setTriggerRender] = useState(0); // Using a number state for forcing render + // const instancedMarkerRef = useRef(null); + const instancedMarkerRef = useRef(null); - const { camera } = useThree(); // Access the camera + const [triggerRender, setTriggerRender] = useState(0); - // Create textures for forecast and measurement data const forecastDataTexture = useRef(); const measurementDataTexture = useRef(); - let MAX_MARKERS = Object.keys(forecastData).length; // Calculate dynamically based on forecastData length + let MAX_MARKERS = Object.keys(forecastData).length; - // Arrays to store latitude and longitude for each marker const latitudes = new Float32Array(MAX_MARKERS); const longitudes = new Float32Array(MAX_MARKERS); - // Listen for changes in selectedVariable and trigger re-render useEffect(() => { - - // Trigger state update to force re-render setTriggerRender((prev) => prev + 1); - }, [selectedVariable]); // Depend on `selectedVariable` + }, [selectedVariable, forecastData, measurementData]); useEffect(() => { - const firstKey = Object.keys(forecastData)[0]; // Get the first key + const firstKey = Object.keys(forecastData)[0]; let numEntries = forecastData[firstKey].length; const { forecastDataVec4Array, measurementDataVec4Array } = createDataArrays(forecastData, measurementData, selectedVariable); - // Create textures for forecast and measurement data forecastDataTexture.current = new DataTexture(forecastDataVec4Array, MAX_MARKERS, numEntries, RGBAFormat, FloatType); forecastDataTexture.current.needsUpdate = true; forecastDataTexture.current.minFilter = THREE.NearestFilter @@ -165,7 +163,6 @@ const LocationMarker = forwardRef( const markerSize = 0.025; - // Initialize markers' positions and other properties useEffect(() => { if (instancedMarkerRef.current) { @@ -176,14 +173,12 @@ const LocationMarker = forwardRef( const lat = forecastData[city][0]?.location.latitude || 0; const lon = forecastData[city][0]?.location.longitude || 0; - // store lat and lon in the arrays latitudes[i] = lat; longitudes[i] = lon; i++; }); - // Set markerIndex attribute (used in the shader to reference the correct data point) const markerIndices = new Float32Array(MAX_MARKERS); for (let i = 0; i < MAX_MARKERS; i++) { markerIndices[i] = i; // Each marker gets its index @@ -195,34 +190,28 @@ const LocationMarker = forwardRef( } }, [forecastData, measurementData, selectedVariable]); - // Scale based on camera zoom or position const scaleBasedOnZoom = () => { if (instancedMarkerRef.current && cameraControlsRef.current) { const controls = cameraControlsRef.current; - const distance = controls.distance; // Access distance from CameraControls - const scaleFactor = distance ; // Adjust the scale factor based on the distance + const distance = controls.distance; + const scaleFactor = distance ; instancedMarkerRef.current.material.uniforms.uZoomLevel.value = scaleFactor; } }; useEffect(() => { if (instancedMarkerRef.current) { - instancedMarkerRef.current.frustumCulled = false; // Disable frustum culling + instancedMarkerRef.current.frustumCulled = false; } }, []); useFrame(() => { - // Dynamically update scale based on camera distance scaleBasedOnZoom(); }); - - - // Implement the tick function const tick = (weight: number) => { shaderUniforms.uFrameWeight.value = weight % 1; - // shaderUniforms.uFrameWeight.value = 0.0; - shaderUniforms.uFrame.value = Math.floor(weight).toFixed(1); + shaderUniforms.uFrame.value = parseFloat(Math.floor(weight).toFixed(1)); }; const changeProjection = (globeState: boolean) => { @@ -249,7 +238,7 @@ const LocationMarker = forwardRef( selectedVariable === "so2" ? 6 : undefined; return ( - + ; type SurfaceLayerProps = { isFilterNearest: boolean; isTimeInterpolation: boolean; - selectedVariable: string; // Add this prop + selectedVariable: string; + }; export type SurfaceLayerRef = { type: React.RefObject; - tick: (weight: number, uSphereWrapAmount: number) => void; + tick: (weight: number) => void; changeProjection: (globeState: boolean) => void; changeFilter: (filterState: boolean) => void; changeTimeInterpolation: (timeInterpolationState: boolean) => void; diff --git a/air-quality-ui/src/components/globe/TextureProcessor.tsx b/air-quality-ui/src/components/globe/TextureProcessor.tsx index 205ca213..6ae32956 100644 --- a/air-quality-ui/src/components/globe/TextureProcessor.tsx +++ b/air-quality-ui/src/components/globe/TextureProcessor.tsx @@ -1,12 +1,12 @@ -import React, { useState, useEffect, useRef } from 'react'; +import { useState, useEffect, useRef } from 'react'; const ImageProcessor = () => { - const [processedImage, setProcessedImage] = useState(null); + const [processedImage, setProcessedImage] = useState(null); const imageUrl = 'http://localhost:5173/data_textures/2024-08-04_00/aqi_2024-08-04_00_CAMS_global.chunk_1_of_3.webp'; // Create refs to store the image and canvas - const imageRef = useRef(null); - const canvasRef = useRef(null); + const imageRef = useRef(null); + const canvasRef = useRef(null); useEffect(() => { const processImage = async () => { @@ -26,7 +26,7 @@ const ImageProcessor = () => { canvas.height = img.height; // Draw the entire image on the canvas - context.drawImage(img, 0, 0); + context?.drawImage(img, 0, 0); // Set initial section to display (first 900 pixels in width) extractAndSetImage(0, 0, 900, img.height); @@ -38,15 +38,25 @@ const ImageProcessor = () => { processImage(); }, [imageUrl]); - const extractAndSetImage = (x, y, width, height) => { + const extractAndSetImage = (x: number, y: number, width: number, height: number) => { const canvas = canvasRef.current; - const context = canvas.getContext('2d'); + const context = canvas?.getContext('2d'); + + if (!canvas) { + console.error('Canvas is not available'); + return; + } + + if (!context || !imageRef.current) { + console.error('Context or image is not available'); + return; + } // Clear the canvas - context.clearRect(0, 0, canvas.width, canvas.height); + context?.clearRect(0, 0, canvas.width, canvas.height); // Draw the specified section of the image onto the canvas - context.drawImage(imageRef.current, x, y, width, height, 0, 0, width, height); + context?.drawImage(imageRef.current, x, y, width, height, 0, 0, width, height); // Convert canvas to a data URL and set it as the processed image const newImageUrl = canvas.toDataURL('image/webp'); diff --git a/air-quality-ui/src/components/globe/World.tsx b/air-quality-ui/src/components/globe/World.tsx index 9fe26969..1fd4a8a0 100644 --- a/air-quality-ui/src/components/globe/World.tsx +++ b/air-quality-ui/src/components/globe/World.tsx @@ -1,12 +1,15 @@ // World.tsx -import { useRef, useState } from 'react'; +import { useRef, useState, CSSProperties } from 'react'; import { Canvas } from '@react-three/fiber'; -// import { Perf } from 'r3f-perf'; import { CameraControls } from '@react-three/drei'; import { SurfaceLayer, SurfaceLayerRef } from './SurfaceLayer'; import LocationMarker, { LocationMarkerRef } from './LocationMarker'; import CameraSettings from './CameraSettings'; // Import the CameraSettings component import ControlsHandler from './ControlsHandler'; // Import the ControlsHandler component +import { + ForecastResponseDto, + MeasurementSummaryResponseDto, +} from '../../services/types' type WorldProps = { forecastData: Record; @@ -77,7 +80,6 @@ const World = ({ isFilterNearest={isFilterNearest} isTimeInterpolation={isTimeInterpolation} selectedVariable={selectedVariable} - toggle={toggle} /> ); }; -const styles = { +const styles: { worldContainer: CSSProperties } = { worldContainer: { display: 'flex', flexDirection: 'column', diff --git a/air-quality-ui/src/components/globe/useDataTextures.tsx b/air-quality-ui/src/components/globe/useDataTextures.tsx index b5ba3945..c17493ad 100644 --- a/air-quality-ui/src/components/globe/useDataTextures.tsx +++ b/air-quality-ui/src/components/globe/useDataTextures.tsx @@ -80,7 +80,7 @@ const createCanvasTextureFromCanvas = ( textureCanvas.width = 900; textureCanvas.height = 450; - textureContext.drawImage( + textureContext?.drawImage( canvas, index * 900, 0, diff --git a/air-quality-ui/src/components/summary-view/GlobalSummary.tsx b/air-quality-ui/src/components/summary-view/GlobalSummary.tsx index 600caefc..75fad432 100644 --- a/air-quality-ui/src/components/summary-view/GlobalSummary.tsx +++ b/air-quality-ui/src/components/summary-view/GlobalSummary.tsx @@ -119,7 +119,7 @@ const GlobalSummary = (): JSX.Element => { )} {showMap && ( diff --git a/air-quality-ui/src/services/custom.d.ts b/air-quality-ui/src/services/custom.d.ts new file mode 100644 index 00000000..090cf13e --- /dev/null +++ b/air-quality-ui/src/services/custom.d.ts @@ -0,0 +1,4 @@ +declare module '*.glsl' { + const value: string; + export default value; + } \ No newline at end of file diff --git a/air-quality-ui/src/services/forecast-data-service.ts b/air-quality-ui/src/services/forecast-data-service.ts index 90b7ca13..a6c9ab4d 100644 --- a/air-quality-ui/src/services/forecast-data-service.ts +++ b/air-quality-ui/src/services/forecast-data-service.ts @@ -12,7 +12,7 @@ export const getForecastData = async ( baseTime: DateTime, locationName?: string, locationType: LocationType = 'city', -): Promise => { +): Promise => { const params: Record = { location_type: locationType, valid_time_from: dateFrom.toJSDate().toISOString(), @@ -25,7 +25,7 @@ export const getForecastData = async ( export const getForecastDataTexture = async ( baseTime: DateTime, -): Promise => { +): Promise => { const params: Record = { base_time: baseTime.toJSDate().toISOString(), } From bf77e5d2931797bd1fbbdfd47f4253219966aea2 Mon Sep 17 00:00:00 2001 From: sebsteinig Date: Fri, 13 Sep 2024 08:28:19 +0100 Subject: [PATCH 19/39] fixed remaining TS hints --- .../src/components/globe/Controls.tsx | 6 +++--- .../src/components/globe/LocationMarker.tsx | 21 +++++++++---------- .../src/components/globe/useDataTextures.tsx | 2 +- 3 files changed, 14 insertions(+), 15 deletions(-) diff --git a/air-quality-ui/src/components/globe/Controls.tsx b/air-quality-ui/src/components/globe/Controls.tsx index 1025fccf..7207bfbb 100644 --- a/air-quality-ui/src/components/globe/Controls.tsx +++ b/air-quality-ui/src/components/globe/Controls.tsx @@ -1,4 +1,4 @@ -import React, { useState, useEffect, useRef, CSSProperties } from 'react'; +import React, { useState, useEffect, useRef, CSSProperties, useReducer } from 'react'; import { useForecastContext } from '../../context'; import { PlayArrow, Pause, Add, Remove, LocationOn, Public, AccessTime, GridOn } from '@mui/icons-material'; import { Button, Select, MenuItem, SelectChangeEvent } from '@mui/material'; @@ -42,7 +42,7 @@ const Controls: React.FC = ({ const { forecastDetails } = useForecastContext(); const numForecastTimeStepsRef = useRef(0); - const [reRender, setReRender] = useState(false); + const [, forceUpdate] = useReducer(x => x + 1, 0); useEffect(() => { const numForecastHours = forecastDetails.maxForecastDate.diff(forecastDetails.forecastBaseDate, 'hours').hours; @@ -50,7 +50,7 @@ const Controls: React.FC = ({ if (numForecastTimeStepsRef.current !== newNumForecastTimeSteps) { numForecastTimeStepsRef.current = newNumForecastTimeSteps; - setReRender((prev) => !prev); + forceUpdate(); // This will trigger a re-render } }, [forecastDetails.maxForecastDate, forecastDetails.forecastBaseDate]); diff --git a/air-quality-ui/src/components/globe/LocationMarker.tsx b/air-quality-ui/src/components/globe/LocationMarker.tsx index 986c3bd3..3acfa726 100644 --- a/air-quality-ui/src/components/globe/LocationMarker.tsx +++ b/air-quality-ui/src/components/globe/LocationMarker.tsx @@ -1,4 +1,4 @@ -import { useRef, forwardRef, useImperativeHandle, useEffect, useState } from 'react'; +import { useRef, forwardRef, useImperativeHandle, useEffect, useReducer } from 'react'; import { DataTexture, RGBAFormat, FloatType } from 'three'; import CustomShaderMaterial from 'three-custom-shader-material'; import * as THREE from 'three'; @@ -14,7 +14,7 @@ type LocationMarkerProps = { measurementData: Record; selectedVariable: string; isVisible: boolean; - cameraControlsRef: React.RefObject; // Add a reference to CameraControls + cameraControlsRef: React.RefObject; }; export type LocationMarkerRef = { @@ -39,7 +39,7 @@ const createDataArrays = ( if (variable === 'aqi') { variable_name = 'overall_aqi_level' as keyof ForecastResponseDto; } else { - variable_name = variable as keyof ForecastResponseDto; // Ensure variable is a valid key + variable_name = variable as keyof ForecastResponseDto; } const forecastDataArray: number[] = []; @@ -47,7 +47,7 @@ const createDataArrays = ( Object.keys(forecastData).forEach((city) => { const cityForecastData = forecastData[city]; - const cityMeasurementData = measurementData[city] || []; // Measurement data may be missing for some cities + const cityMeasurementData = measurementData[city] || []; cityForecastData.forEach((forecastEntry) => { const forecastValue = forecastEntry[variable_name as keyof typeof forecastEntry]; @@ -55,7 +55,7 @@ const createDataArrays = ( if (forecastValue !== undefined && forecastValue !== null) { if (variable === 'aqi') { if (typeof forecastValue === 'number') { - forecastDataArray.push(forecastValue); // Push the number value + forecastDataArray.push(forecastValue); } } else { if (typeof forecastValue === 'object' && 'value' in forecastValue) { @@ -99,8 +99,8 @@ const createDataArrays = ( for (let row = 0; row < numEntries; row++) { for (let col = 0; col < numCities; col++) { - const index = col * numEntries + row; // Row-major index - const columnMajorIndex = row * numCities + col; // Column-major index + const index = col * numEntries + row; + const columnMajorIndex = row * numCities + col; forecastDataVec4Array.set([forecastDataArray[index], 0, 0, 0], columnMajorIndex * 4); measurementDataVec4Array.set([measurementDataArray[index], 0, 0, 0], columnMajorIndex * 4); @@ -126,10 +126,9 @@ const LocationMarker = forwardRef( material: THREE.ShaderMaterial | THREE.ShaderMaterial; }; - // const instancedMarkerRef = useRef(null); const instancedMarkerRef = useRef(null); - const [triggerRender, setTriggerRender] = useState(0); + const [, forceUpdate] = useReducer(x => x + 1, 0); const forecastDataTexture = useRef(); const measurementDataTexture = useRef(); @@ -140,7 +139,7 @@ const LocationMarker = forwardRef( const longitudes = new Float32Array(MAX_MARKERS); useEffect(() => { - setTriggerRender((prev) => prev + 1); + forceUpdate(); }, [selectedVariable, forecastData, measurementData]); useEffect(() => { @@ -181,7 +180,7 @@ const LocationMarker = forwardRef( const markerIndices = new Float32Array(MAX_MARKERS); for (let i = 0; i < MAX_MARKERS; i++) { - markerIndices[i] = i; // Each marker gets its index + markerIndices[i] = i; } instancedMarkerRef.current.geometry.setAttribute('lat', new THREE.InstancedBufferAttribute(latitudes, 1)); instancedMarkerRef.current.geometry.setAttribute('lon', new THREE.InstancedBufferAttribute(longitudes, 1)); diff --git a/air-quality-ui/src/components/globe/useDataTextures.tsx b/air-quality-ui/src/components/globe/useDataTextures.tsx index c17493ad..3a7d4348 100644 --- a/air-quality-ui/src/components/globe/useDataTextures.tsx +++ b/air-quality-ui/src/components/globe/useDataTextures.tsx @@ -1,7 +1,7 @@ import { useRef, useCallback } from "react"; import * as THREE from "three"; -const API_URL = import.meta.env.VITE_AIR_QUALITY_API_URL +// const API_URL = import.meta.env.VITE_AIR_QUALITY_API_URL const generateImageUrls = ( forecastBaseDate: string, From 5459000c21b633c907d87a1ded7ec6c4c0833671 Mon Sep 17 00:00:00 2001 From: sebsteinig Date: Fri, 13 Sep 2024 08:36:57 +0100 Subject: [PATCH 20/39] auto lint fixes --- .../src/components/globe/CameraSettings.tsx | 97 ++--- .../src/components/globe/Controls.tsx | 261 +++++++------ .../src/components/globe/ControlsHandler.tsx | 35 +- .../src/components/globe/LocationMarker.tsx | 346 +++++++++++------- .../src/components/globe/SurfaceLayer.tsx | 198 +++++----- .../src/components/globe/TextureProcessor.tsx | 94 +++-- air-quality-ui/src/components/globe/World.tsx | 97 ++--- .../src/components/globe/useDataTextures.tsx | 214 ++++++----- .../components/summary-view/GlobalSummary.tsx | 24 +- .../components/summary-view/MapViewHeader.tsx | 1 - air-quality-ui/src/services/custom.d.ts | 6 +- air-quality-ui/src/services/types.ts | 2 +- air-quality-ui/vite.config copy.ts | 8 - air-quality-ui/vite.config.ts | 15 +- 14 files changed, 758 insertions(+), 640 deletions(-) delete mode 100644 air-quality-ui/vite.config copy.ts diff --git a/air-quality-ui/src/components/globe/CameraSettings.tsx b/air-quality-ui/src/components/globe/CameraSettings.tsx index f37a739d..fc130c7d 100644 --- a/air-quality-ui/src/components/globe/CameraSettings.tsx +++ b/air-quality-ui/src/components/globe/CameraSettings.tsx @@ -1,71 +1,74 @@ // CameraSettings.tsx -import React, { useEffect } from 'react'; -import * as THREE from 'three'; +import React, { useEffect } from 'react' +import * as THREE from 'three' type CameraSettingsProps = { - globeState: boolean; - cameraControlsRef: React.RefObject; - toggle: string; -}; + globeState: boolean + cameraControlsRef: React.RefObject + toggle: string +} -const CameraSettings: React.FC = ({ globeState, cameraControlsRef, toggle }) => { +const CameraSettings: React.FC = ({ + globeState, + cameraControlsRef, + toggle, +}) => { useEffect(() => { if (cameraControlsRef.current) { - - console.log('render camera settings'); - console.log(globeState) - const controls = cameraControlsRef.current; + console.log('render camera settings') + console.log(globeState) + const controls = cameraControlsRef.current if (globeState) { // Globe settings - controls.minDistance = 1.2; - controls.maxDistance = 1.6; - controls.minPolarAngle = 0; - controls.maxPolarAngle = Math.PI; - controls.minAzimuthAngle = -Infinity; - controls.maxAzimuthAngle = Infinity; - controls.dollyToCursor = false; + controls.minDistance = 1.2 + controls.maxDistance = 1.6 + controls.minPolarAngle = 0 + controls.maxPolarAngle = Math.PI + controls.minAzimuthAngle = -Infinity + controls.maxAzimuthAngle = Infinity + controls.dollyToCursor = false - controls.mouseButtons.left = 1; - controls.mouseButtons.right = 2; + controls.mouseButtons.left = 1 + controls.mouseButtons.right = 2 - const lat = 48.0; - const lon = 8.0; - const newTheta = lon * THREE.MathUtils.DEG2RAD; - const newPhi = -1.0 * (lat - 90) * THREE.MathUtils.DEG2RAD; - controls.reset(false); + const lat = 48.0 + const lon = 8.0 + const newTheta = lon * THREE.MathUtils.DEG2RAD + const newPhi = -1.0 * (lat - 90) * THREE.MathUtils.DEG2RAD + controls.reset(false) - controls.smoothTime = 1.5; - controls.rotateTo(newTheta, newPhi, true); - controls.zoomTo(0.75, true); + controls.smoothTime = 1.5 + controls.rotateTo(newTheta, newPhi, true) + controls.zoomTo(0.75, true) setTimeout(() => { - controls.smoothTime = 1.0; - }, 3000); + controls.smoothTime = 1.0 + }, 3000) } else { // Map settings - controls.minDistance = 0.25; - controls.maxDistance = 1.7; - controls.minPolarAngle = Math.PI * 0.5; - controls.maxPolarAngle = Math.PI * 1.0; - controls.minAzimuthAngle = 0; - controls.maxAzimuthAngle = 0; - controls.dollyToCursor = true; + controls.minDistance = 0.25 + controls.maxDistance = 1.7 + controls.minPolarAngle = Math.PI * 0.5 + controls.maxPolarAngle = Math.PI * 1.0 + controls.minAzimuthAngle = 0 + controls.maxAzimuthAngle = 0 + controls.dollyToCursor = true - controls.mouseButtons.left = 2; - controls.mouseButtons.right = 1; + controls.mouseButtons.left = 2 + controls.mouseButtons.right = 1 - controls.smoothTime = 1.0; - controls.reset(true); + controls.smoothTime = 1.0 + controls.reset(true) setTimeout(() => { - controls.smoothTime = 3.0; - }, 5000); + controls.smoothTime = 3.0 + }, 5000) } } - }, [globeState, cameraControlsRef, toggle]); + }, [globeState, cameraControlsRef, toggle]) - return null; -}; + return null +} -export default CameraSettings; \ No newline at end of file +export default CameraSettings diff --git a/air-quality-ui/src/components/globe/Controls.tsx b/air-quality-ui/src/components/globe/Controls.tsx index 7207bfbb..0efb9ba1 100644 --- a/air-quality-ui/src/components/globe/Controls.tsx +++ b/air-quality-ui/src/components/globe/Controls.tsx @@ -1,20 +1,36 @@ -import React, { useState, useEffect, useRef, CSSProperties, useReducer } from 'react'; -import { useForecastContext } from '../../context'; -import { PlayArrow, Pause, Add, Remove, LocationOn, Public, AccessTime, GridOn } from '@mui/icons-material'; -import { Button, Select, MenuItem, SelectChangeEvent } from '@mui/material'; -import { ForecastResponseDto } from '../../services/types'; +import { + AccessTime, + Add, + GridOn, + LocationOn, + Pause, + PlayArrow, + Public, + Remove, +} from '@mui/icons-material' +import { Button, MenuItem, Select, SelectChangeEvent } from '@mui/material' +import React, { + CSSProperties, + useEffect, + useReducer, + useRef, + useState, +} from 'react' + +import { useForecastContext } from '../../context' +import { ForecastResponseDto } from '../../services/types' type ControlsProps = { - isTimeRunning: boolean; - onToggleTimeUpdate: () => void; - onSliderChange: (value: number) => void; - onGlobeButtonClick: (globeAnimationState: boolean) => void; - onLocationMarkerClick: (locationMarkerState: boolean) => void; - onGridFilterClick: (filterState: boolean) => void; - onTimeInterpolationClick: (filterState: boolean) => void; - onVariableSelect: (variable: string) => void; - forecastData: Record; -}; + isTimeRunning: boolean + onToggleTimeUpdate: () => void + onSliderChange: (value: number) => void + onGlobeButtonClick: (globeAnimationState: boolean) => void + onLocationMarkerClick: (locationMarkerState: boolean) => void + onGridFilterClick: (filterState: boolean) => void + onTimeInterpolationClick: (filterState: boolean) => void + onVariableSelect: (variable: string) => void + forecastData: Record +} const Controls: React.FC = ({ isTimeRunning, @@ -27,96 +43,114 @@ const Controls: React.FC = ({ onVariableSelect, forecastData, }) => { - const [sliderValue, setSliderValue] = useState(0.0); - const [globeAnimationState, setGlobeAnimationState] = useState(false); - const [locationMarkerState, setLocationMarkerState] = useState(true); - const [filterState, setGridFilterState] = useState(false); - const [timeInterpolationState, setTimeInterpolationState] = useState(true); - const [timeDelta, setTimeDelta] = useState(0.06); - const [selectedVariable, setSelectedVariable] = useState('aqi'); + const [sliderValue, setSliderValue] = useState(0.0) + const [globeAnimationState, setGlobeAnimationState] = useState(false) + const [locationMarkerState, setLocationMarkerState] = useState(true) + const [filterState, setGridFilterState] = useState(false) + const [timeInterpolationState, setTimeInterpolationState] = useState(true) + const [timeDelta, setTimeDelta] = useState(0.06) + const [selectedVariable, setSelectedVariable] = useState('aqi') const handleSliderChange = (event: React.ChangeEvent) => { - const value = parseFloat(event.target.value); - setSliderValue(value); - }; + const value = parseFloat(event.target.value) + setSliderValue(value) + } - const { forecastDetails } = useForecastContext(); - const numForecastTimeStepsRef = useRef(0); - const [, forceUpdate] = useReducer(x => x + 1, 0); + const { forecastDetails } = useForecastContext() + const numForecastTimeStepsRef = useRef(0) + const [, forceUpdate] = useReducer((x) => x + 1, 0) useEffect(() => { - const numForecastHours = forecastDetails.maxForecastDate.diff(forecastDetails.forecastBaseDate, 'hours').hours; - const newNumForecastTimeSteps = numForecastHours / 3; + const numForecastHours = forecastDetails.maxForecastDate.diff( + forecastDetails.forecastBaseDate, + 'hours', + ).hours + const newNumForecastTimeSteps = numForecastHours / 3 if (numForecastTimeStepsRef.current !== newNumForecastTimeSteps) { - numForecastTimeStepsRef.current = newNumForecastTimeSteps; - forceUpdate(); // This will trigger a re-render + numForecastTimeStepsRef.current = newNumForecastTimeSteps + forceUpdate() // This will trigger a re-render } - }, [forecastDetails.maxForecastDate, forecastDetails.forecastBaseDate]); + }, [forecastDetails.maxForecastDate, forecastDetails.forecastBaseDate]) - const currentDate = forecastDetails.forecastBaseDate.plus({ hours: Math.floor(sliderValue * 3) }).toFormat('yyyy-MM-dd T') + ' UTC'; + const currentDate = + forecastDetails.forecastBaseDate + .plus({ hours: Math.floor(sliderValue * 3) }) + .toFormat('yyyy-MM-dd T') + ' UTC' useEffect(() => { - setSliderValue(0); - }, [forecastData]); - + setSliderValue(0) + }, [forecastData]) + useEffect(() => { - onSliderChange(sliderValue); - }, [sliderValue, onSliderChange]); + onSliderChange(sliderValue) + }, [sliderValue, onSliderChange]) useEffect(() => { if (isTimeRunning) { const interval = setInterval(() => { - setSliderValue((prevValue) => (prevValue >= numForecastTimeStepsRef.current ? 0 : prevValue + timeDelta)); - }, 25); + setSliderValue((prevValue) => + prevValue >= numForecastTimeStepsRef.current + ? 0 + : prevValue + timeDelta, + ) + }, 25) - return () => clearInterval(interval); + return () => clearInterval(interval) } - }, [isTimeRunning, timeDelta]); + }, [isTimeRunning, timeDelta]) const handleGlobeButtonClick = () => { - setGlobeAnimationState((prevState) => !prevState); - onGlobeButtonClick(!globeAnimationState); - }; + setGlobeAnimationState((prevState) => !prevState) + onGlobeButtonClick(!globeAnimationState) + } const handleLocationMarkerClick = () => { - setLocationMarkerState((prevState) => !prevState); - onLocationMarkerClick(!locationMarkerState); - }; + setLocationMarkerState((prevState) => !prevState) + onLocationMarkerClick(!locationMarkerState) + } const handleGridFilterClick = () => { - setGridFilterState((prevState) => !prevState); - onGridFilterClick(!filterState); - }; + setGridFilterState((prevState) => !prevState) + onGridFilterClick(!filterState) + } const handleTimeInterpolationClick = () => { - setTimeInterpolationState((prevState) => !prevState); - onTimeInterpolationClick(!timeInterpolationState); - }; + setTimeInterpolationState((prevState) => !prevState) + onTimeInterpolationClick(!timeInterpolationState) + } const handleVariableSelectChange = (event: SelectChangeEvent) => { - const variable = event.target.value; - setSelectedVariable(variable); - onVariableSelect(variable); - }; + const variable = event.target.value + setSelectedVariable(variable) + onVariableSelect(variable) + } const handleIncreaseTimeDelta = () => { - setTimeDelta((prevDelta) => prevDelta + 0.02); - }; + setTimeDelta((prevDelta) => prevDelta + 0.02) + } const handleDecreaseTimeDelta = () => { - setTimeDelta((prevDelta) => Math.max(0.02, prevDelta - 0.02)); - }; + setTimeDelta((prevDelta) => Math.max(0.02, prevDelta - 0.02)) + } return (
-
- - - - - AQI PM2.5 PM10 O3 - ); -}; + ) +} const styles: { [key: string]: CSSProperties } = { controlsContainer: { @@ -234,6 +285,6 @@ const styles: { [key: string]: CSSProperties } = { color: 'white', fontWeight: 'bold', }, -}; +} -export default Controls; \ No newline at end of file +export default Controls diff --git a/air-quality-ui/src/components/globe/ControlsHandler.tsx b/air-quality-ui/src/components/globe/ControlsHandler.tsx index bd6449dc..4140ead1 100644 --- a/air-quality-ui/src/components/globe/ControlsHandler.tsx +++ b/air-quality-ui/src/components/globe/ControlsHandler.tsx @@ -1,21 +1,20 @@ // ControlsHandler.tsx -import React from 'react'; -import Controls from './Controls'; -import { - ForecastResponseDto, -} from '../../services/types' +import React from 'react' + +import Controls from './Controls' +import { ForecastResponseDto } from '../../services/types' type ControlsHandlerProps = { - toggleTimeUpdate: () => void; - handleSliderChange: (value: number) => void; - handleGlobeButtonClick: (globeState: boolean) => void; - handleLocationMarkerButtonClick: (locationMarkerState: boolean) => void; - handleGridFilterClick: (filterState: boolean) => void; - handleTimeInterpolationClick: (timeInterpolationState: boolean) => void; - handleVariableSelect: (variable: string) => void; - isTimeRunning: boolean; - forecastData: Record; -}; + toggleTimeUpdate: () => void + handleSliderChange: (value: number) => void + handleGlobeButtonClick: (globeState: boolean) => void + handleLocationMarkerButtonClick: (locationMarkerState: boolean) => void + handleGridFilterClick: (filterState: boolean) => void + handleTimeInterpolationClick: (timeInterpolationState: boolean) => void + handleVariableSelect: (variable: string) => void + isTimeRunning: boolean + forecastData: Record +} const ControlsHandler: React.FC = ({ toggleTimeUpdate, @@ -40,7 +39,7 @@ const ControlsHandler: React.FC = ({ onVariableSelect={handleVariableSelect} forecastData={forecastData} /> - ); -}; + ) +} -export default ControlsHandler; \ No newline at end of file +export default ControlsHandler diff --git a/air-quality-ui/src/components/globe/LocationMarker.tsx b/air-quality-ui/src/components/globe/LocationMarker.tsx index 3acfa726..bea06d2b 100644 --- a/air-quality-ui/src/components/globe/LocationMarker.tsx +++ b/air-quality-ui/src/components/globe/LocationMarker.tsx @@ -1,243 +1,316 @@ -import { useRef, forwardRef, useImperativeHandle, useEffect, useReducer } from 'react'; -import { DataTexture, RGBAFormat, FloatType } from 'three'; -import CustomShaderMaterial from 'three-custom-shader-material'; -import * as THREE from 'three'; -import { useFrame } from '@react-three/fiber'; -import { gsap } from 'gsap'; -import { ForecastResponseDto, MeasurementSummaryResponseDto } from '../../services/types'; +import { useFrame } from '@react-three/fiber' +import { gsap } from 'gsap' import { + forwardRef, + useEffect, + useImperativeHandle, + useReducer, + useRef, +} from 'react' +import { DataTexture, FloatType, RGBAFormat } from 'three' +import * as THREE from 'three' +import CustomShaderMaterial from 'three-custom-shader-material' + +import { + ForecastResponseDto, + MeasurementSummaryResponseDto, PollutantDataDto, } from '../../services/types' type LocationMarkerProps = { - forecastData: Record; - measurementData: Record; - selectedVariable: string; - isVisible: boolean; - cameraControlsRef: React.RefObject; -}; + forecastData: Record + measurementData: Record + selectedVariable: string + isVisible: boolean + cameraControlsRef: React.RefObject +} export type LocationMarkerRef = { - tick: (weight: number) => void; - changeProjection: (globeState: boolean) => void; - setVisible: (isVisible: boolean) => void; -}; + tick: (weight: number) => void + changeProjection: (globeState: boolean) => void + setVisible: (isVisible: boolean) => void +} const shaderUniforms = { uSphereWrapAmount: { value: 0.0 }, uFrameWeight: { value: 0.5 }, uFrame: { value: 0.0 }, -}; +} const createDataArrays = ( forecastData: Record, measurementData: Record, - variable: string + variable: string, ) => { - let variable_name: keyof ForecastResponseDto; + let variable_name: keyof ForecastResponseDto if (variable === 'aqi') { - variable_name = 'overall_aqi_level' as keyof ForecastResponseDto; + variable_name = 'overall_aqi_level' as keyof ForecastResponseDto } else { - variable_name = variable as keyof ForecastResponseDto; + variable_name = variable as keyof ForecastResponseDto } - const forecastDataArray: number[] = []; - const measurementDataArray: number[] = []; + const forecastDataArray: number[] = [] + const measurementDataArray: number[] = [] Object.keys(forecastData).forEach((city) => { - const cityForecastData = forecastData[city]; - const cityMeasurementData = measurementData[city] || []; + const cityForecastData = forecastData[city] + const cityMeasurementData = measurementData[city] || [] cityForecastData.forEach((forecastEntry) => { - const forecastValue = forecastEntry[variable_name as keyof typeof forecastEntry]; - + const forecastValue = + forecastEntry[variable_name as keyof typeof forecastEntry] + if (forecastValue !== undefined && forecastValue !== null) { if (variable === 'aqi') { if (typeof forecastValue === 'number') { - forecastDataArray.push(forecastValue); + forecastDataArray.push(forecastValue) } } else { if (typeof forecastValue === 'object' && 'value' in forecastValue) { - const value = (forecastValue as PollutantDataDto).value; + const value = (forecastValue as PollutantDataDto).value if (typeof value === 'number') { - forecastDataArray.push(value); + forecastDataArray.push(value) } } } } - }); + }) cityForecastData.forEach((forecastEntry) => { const matchingMeasurement = cityMeasurementData.find( (measurementEntry) => - measurementEntry.measurement_base_time === forecastEntry.valid_time - ); - + measurementEntry.measurement_base_time === forecastEntry.valid_time, + ) + if (variable === 'aqi') { const measurementValue = - matchingMeasurement && matchingMeasurement[variable_name as keyof MeasurementSummaryResponseDto] - ? (matchingMeasurement[variable_name as keyof MeasurementSummaryResponseDto] as any).mean - : -1; - measurementDataArray.push(measurementValue); + matchingMeasurement && + matchingMeasurement[ + variable_name as keyof MeasurementSummaryResponseDto + ] + ? ( + matchingMeasurement[ + variable_name as keyof MeasurementSummaryResponseDto + ] as any + ).mean + : -1 + measurementDataArray.push(measurementValue) } else { const measurementValue = - matchingMeasurement && matchingMeasurement[variable_name as keyof MeasurementSummaryResponseDto] - ? (matchingMeasurement[variable_name as keyof MeasurementSummaryResponseDto] as any).mean.value - : -1.0; - measurementDataArray.push(measurementValue); + matchingMeasurement && + matchingMeasurement[ + variable_name as keyof MeasurementSummaryResponseDto + ] + ? ( + matchingMeasurement[ + variable_name as keyof MeasurementSummaryResponseDto + ] as any + ).mean.value + : -1.0 + measurementDataArray.push(measurementValue) } - }); - }); - + }) + }) - const forecastDataVec4Array = new Float32Array(forecastDataArray.length * 4); - const measurementDataVec4Array = new Float32Array(measurementDataArray.length * 4); + const forecastDataVec4Array = new Float32Array(forecastDataArray.length * 4) + const measurementDataVec4Array = new Float32Array( + measurementDataArray.length * 4, + ) - const numCities = Object.keys(forecastData).length; - const numEntries = forecastDataArray.length / numCities; + const numCities = Object.keys(forecastData).length + const numEntries = forecastDataArray.length / numCities for (let row = 0; row < numEntries; row++) { for (let col = 0; col < numCities; col++) { - const index = col * numEntries + row; - const columnMajorIndex = row * numCities + col; - - forecastDataVec4Array.set([forecastDataArray[index], 0, 0, 0], columnMajorIndex * 4); - measurementDataVec4Array.set([measurementDataArray[index], 0, 0, 0], columnMajorIndex * 4); + const index = col * numEntries + row + const columnMajorIndex = row * numCities + col + + forecastDataVec4Array.set( + [forecastDataArray[index], 0, 0, 0], + columnMajorIndex * 4, + ) + measurementDataVec4Array.set( + [measurementDataArray[index], 0, 0, 0], + columnMajorIndex * 4, + ) } } - return { forecastDataVec4Array, measurementDataVec4Array }; -}; + return { forecastDataVec4Array, measurementDataVec4Array } +} const LocationMarker = forwardRef( - ({ forecastData, measurementData, selectedVariable, isVisible, cameraControlsRef }, ref): JSX.Element | null => { - + ( + { + forecastData, + measurementData, + selectedVariable, + isVisible, + cameraControlsRef, + }, + ref, + ): JSX.Element | null => { if ( - !forecastData || - Object.keys(forecastData).length === 0 || - !measurementData || + !forecastData || + Object.keys(forecastData).length === 0 || + !measurementData || Object.keys(measurementData).length === 0 ) { - return null; + return null } - + type InstancedMeshWithUniforms = THREE.InstancedMesh & { - material: THREE.ShaderMaterial | THREE.ShaderMaterial; - }; + material: THREE.ShaderMaterial | THREE.ShaderMaterial + } - const instancedMarkerRef = useRef(null); + const instancedMarkerRef = useRef(null) - const [, forceUpdate] = useReducer(x => x + 1, 0); + const [, forceUpdate] = useReducer((x) => x + 1, 0) - const forecastDataTexture = useRef(); - const measurementDataTexture = useRef(); + const forecastDataTexture = useRef() + const measurementDataTexture = useRef() - let MAX_MARKERS = Object.keys(forecastData).length; + const MAX_MARKERS = Object.keys(forecastData).length - const latitudes = new Float32Array(MAX_MARKERS); - const longitudes = new Float32Array(MAX_MARKERS); + const latitudes = new Float32Array(MAX_MARKERS) + const longitudes = new Float32Array(MAX_MARKERS) useEffect(() => { - forceUpdate(); - }, [selectedVariable, forecastData, measurementData]); + forceUpdate() + }, [selectedVariable, forecastData, measurementData]) useEffect(() => { - const firstKey = Object.keys(forecastData)[0]; - let numEntries = forecastData[firstKey].length; - - const { forecastDataVec4Array, measurementDataVec4Array } = createDataArrays(forecastData, measurementData, selectedVariable); - - forecastDataTexture.current = new DataTexture(forecastDataVec4Array, MAX_MARKERS, numEntries, RGBAFormat, FloatType); - forecastDataTexture.current.needsUpdate = true; + const firstKey = Object.keys(forecastData)[0] + const numEntries = forecastData[firstKey].length + + const { forecastDataVec4Array, measurementDataVec4Array } = + createDataArrays(forecastData, measurementData, selectedVariable) + + forecastDataTexture.current = new DataTexture( + forecastDataVec4Array, + MAX_MARKERS, + numEntries, + RGBAFormat, + FloatType, + ) + forecastDataTexture.current.needsUpdate = true forecastDataTexture.current.minFilter = THREE.NearestFilter forecastDataTexture.current.magFilter = THREE.NearestFilter - measurementDataTexture.current = new DataTexture(measurementDataVec4Array, MAX_MARKERS, numEntries, RGBAFormat, FloatType); - measurementDataTexture.current.needsUpdate = true; + measurementDataTexture.current = new DataTexture( + measurementDataVec4Array, + MAX_MARKERS, + numEntries, + RGBAFormat, + FloatType, + ) + measurementDataTexture.current.needsUpdate = true measurementDataTexture.current.minFilter = THREE.NearestFilter measurementDataTexture.current.magFilter = THREE.NearestFilter - }, [forecastData, measurementData, selectedVariable]); - + }, [forecastData, measurementData, selectedVariable]) - const markerSize = 0.025; + const markerSize = 0.025 useEffect(() => { if (instancedMarkerRef.current) { + instancedMarkerRef.current.visible = isVisible - instancedMarkerRef.current.visible = isVisible; - - let i = 0; + let i = 0 Object.keys(forecastData).forEach((city) => { - const lat = forecastData[city][0]?.location.latitude || 0; - const lon = forecastData[city][0]?.location.longitude || 0; + const lat = forecastData[city][0]?.location.latitude || 0 + const lon = forecastData[city][0]?.location.longitude || 0 - latitudes[i] = lat; - longitudes[i] = lon; + latitudes[i] = lat + longitudes[i] = lon - i++; - }); + i++ + }) - const markerIndices = new Float32Array(MAX_MARKERS); + const markerIndices = new Float32Array(MAX_MARKERS) for (let i = 0; i < MAX_MARKERS; i++) { - markerIndices[i] = i; + markerIndices[i] = i } - instancedMarkerRef.current.geometry.setAttribute('lat', new THREE.InstancedBufferAttribute(latitudes, 1)); - instancedMarkerRef.current.geometry.setAttribute('lon', new THREE.InstancedBufferAttribute(longitudes, 1)); - instancedMarkerRef.current.geometry.setAttribute('markerIndex', new THREE.InstancedBufferAttribute(markerIndices, 1)); - instancedMarkerRef.current.instanceMatrix.needsUpdate = true; + instancedMarkerRef.current.geometry.setAttribute( + 'lat', + new THREE.InstancedBufferAttribute(latitudes, 1), + ) + instancedMarkerRef.current.geometry.setAttribute( + 'lon', + new THREE.InstancedBufferAttribute(longitudes, 1), + ) + instancedMarkerRef.current.geometry.setAttribute( + 'markerIndex', + new THREE.InstancedBufferAttribute(markerIndices, 1), + ) + instancedMarkerRef.current.instanceMatrix.needsUpdate = true } - }, [forecastData, measurementData, selectedVariable]); + }, [forecastData, measurementData, selectedVariable]) const scaleBasedOnZoom = () => { if (instancedMarkerRef.current && cameraControlsRef.current) { - const controls = cameraControlsRef.current; - const distance = controls.distance; - const scaleFactor = distance ; - instancedMarkerRef.current.material.uniforms.uZoomLevel.value = scaleFactor; + const controls = cameraControlsRef.current + const distance = controls.distance + const scaleFactor = distance + instancedMarkerRef.current.material.uniforms.uZoomLevel.value = + scaleFactor } - }; + } useEffect(() => { if (instancedMarkerRef.current) { - instancedMarkerRef.current.frustumCulled = false; + instancedMarkerRef.current.frustumCulled = false } - }, []); + }, []) useFrame(() => { - scaleBasedOnZoom(); - }); + scaleBasedOnZoom() + }) const tick = (weight: number) => { - shaderUniforms.uFrameWeight.value = weight % 1; - shaderUniforms.uFrame.value = parseFloat(Math.floor(weight).toFixed(1)); - }; + shaderUniforms.uFrameWeight.value = weight % 1 + shaderUniforms.uFrame.value = parseFloat(Math.floor(weight).toFixed(1)) + } const changeProjection = (globeState: boolean) => { - gsap.to(shaderUniforms.uSphereWrapAmount, { value: globeState ? 1.0 : 0.0, duration: 2 }); - }; + gsap.to(shaderUniforms.uSphereWrapAmount, { + value: globeState ? 1.0 : 0.0, + duration: 2, + }) + } const setVisible = (isVisible: boolean) => { if (instancedMarkerRef.current) { - instancedMarkerRef.current.visible = isVisible; + instancedMarkerRef.current.visible = isVisible } - }; + } useImperativeHandle(ref, () => ({ tick, changeProjection, - setVisible - })); - - const variableIndex = selectedVariable === "aqi" ? 1 : - selectedVariable === "pm2_5" ? 2 : - selectedVariable === "pm10" ? 3 : - selectedVariable === "o3" ? 4 : - selectedVariable === "no2" ? 5 : - selectedVariable === "so2" ? 6 : undefined; + setVisible, + })) + + const variableIndex = + selectedVariable === 'aqi' + ? 1 + : selectedVariable === 'pm2_5' + ? 2 + : selectedVariable === 'pm10' + ? 3 + : selectedVariable === 'o3' + ? 4 + : selectedVariable === 'no2' + ? 5 + : selectedVariable === 'so2' + ? 6 + : undefined return ( - + ( measurementTexture: { value: measurementDataTexture.current }, uVariableIndex: { value: variableIndex }, uMaxMarkers: { value: forecastDataTexture.current?.image.width }, - uNumTimseSteps: { value: forecastDataTexture.current?.image.height }, + uNumTimseSteps: { + value: forecastDataTexture.current?.image.height, + }, }} transparent /> - ); - } - - - -); + ) + }, +) -export default LocationMarker; \ No newline at end of file +export default LocationMarker diff --git a/air-quality-ui/src/components/globe/SurfaceLayer.tsx b/air-quality-ui/src/components/globe/SurfaceLayer.tsx index db5eefd8..05ec1891 100644 --- a/air-quality-ui/src/components/globe/SurfaceLayer.tsx +++ b/air-quality-ui/src/components/globe/SurfaceLayer.tsx @@ -1,16 +1,17 @@ +import { gsap } from 'gsap' import { forwardRef, - useImperativeHandle, - useRef, memo, - useEffect, // Import useEffect -} from "react"; -import * as THREE from "three"; -import vertexShader from "./shaders/surfaceVert.glsl"; -import fragmentShader from "./shaders/surfaceFrag.glsl"; -import { useForecastContext } from "../../context"; -import { gsap } from "gsap"; -import { useDataTextures } from "./useDataTextures"; + useEffect, + useImperativeHandle, + useRef, // Import useEffect +} from 'react' +import * as THREE from 'three' + +import fragmentShader from './shaders/surfaceFrag.glsl' +import vertexShader from './shaders/surfaceVert.glsl' +import { useDataTextures } from './useDataTextures' +import { useForecastContext } from '../../context' // const API_URL = import.meta.env.VITE_AIR_QUALITY_API_URL @@ -18,51 +19,43 @@ const shaderUniforms = { uSphereWrapAmount: { value: 0.0 }, uFrameWeight: { value: 0.5 }, uFrame: { value: 0.0 }, -}; +} -type PlaneType = THREE.Mesh; +type PlaneType = THREE.Mesh type SurfaceLayerProps = { - isFilterNearest: boolean; - isTimeInterpolation: boolean; - selectedVariable: string; - -}; + isFilterNearest: boolean + isTimeInterpolation: boolean + selectedVariable: string +} export type SurfaceLayerRef = { - type: React.RefObject; - tick: (weight: number) => void; - changeProjection: (globeState: boolean) => void; - changeFilter: (filterState: boolean) => void; - changeTimeInterpolation: (timeInterpolationState: boolean) => void; -}; + type: React.RefObject + tick: (weight: number) => void + changeProjection: (globeState: boolean) => void + changeFilter: (filterState: boolean) => void + changeTimeInterpolation: (timeInterpolationState: boolean) => void +} // Preload textures globally so they are not reloaded during re-renders -const loader = new THREE.TextureLoader(); -const cmap = loader.load("/all_colormaps.png"); -const lsm = loader.load("/NaturalEarthCoastline2.jpg"); -const height = loader.load("/gebco_08_rev_elev_2k_HQ.jpg"); +const loader = new THREE.TextureLoader() +const cmap = loader.load('/all_colormaps.png') +const lsm = loader.load('/NaturalEarthCoastline2.jpg') +const height = loader.load('/gebco_08_rev_elev_2k_HQ.jpg') -cmap.minFilter = THREE.NearestFilter; -cmap.magFilter = THREE.NearestFilter; -lsm.minFilter = THREE.NearestFilter; -lsm.magFilter = THREE.NearestFilter; -height.minFilter = THREE.NearestFilter; -height.magFilter = THREE.NearestFilter; +cmap.minFilter = THREE.NearestFilter +cmap.magFilter = THREE.NearestFilter +lsm.minFilter = THREE.NearestFilter +lsm.magFilter = THREE.NearestFilter +height.minFilter = THREE.NearestFilter +height.magFilter = THREE.NearestFilter -const geometry = new THREE.PlaneGeometry(4, 2, 64 * 4, 32 * 4); +const geometry = new THREE.PlaneGeometry(4, 2, 64 * 4, 32 * 4) const SurfaceLayer = memo( forwardRef( - ( - { - isFilterNearest, - isTimeInterpolation, - selectedVariable, - }, - ref - ) => { - const surface_layer_ref = useRef(null); + ({ isFilterNearest, isTimeInterpolation, selectedVariable }, ref) => { + const surface_layer_ref = useRef(null) const materialRef = useRef( new THREE.ShaderMaterial({ vertexShader: vertexShader, @@ -94,97 +87,106 @@ const SurfaceLayer = memo( lsmTexture: { value: lsm }, uVariableIndex: { value: null }, }, - }) - ); - - const variableIndex = selectedVariable === "aqi" ? 1 : - selectedVariable === "pm2_5" ? 2 : - selectedVariable === "pm10" ? 3 : - selectedVariable === "o3" ? 4 : - selectedVariable === "no2" ? 5 : - selectedVariable === "so2" ? 6 : undefined; - materialRef.current.uniforms.uVariableIndex.value = variableIndex; + }), + ) + + const variableIndex = + selectedVariable === 'aqi' + ? 1 + : selectedVariable === 'pm2_5' + ? 2 + : selectedVariable === 'pm10' + ? 3 + : selectedVariable === 'o3' + ? 4 + : selectedVariable === 'no2' + ? 5 + : selectedVariable === 'so2' + ? 6 + : undefined + materialRef.current.uniforms.uVariableIndex.value = variableIndex console.log(variableIndex) - const windowIndexRef = useRef(0); + const windowIndexRef = useRef(0) - const { forecastDetails } = useForecastContext(); - const forecastBaseDate = forecastDetails.forecastBaseDate.toFormat( - "yyyy-MM-dd_HH" - ); + const { forecastDetails } = useForecastContext() + const forecastBaseDate = + forecastDetails.forecastBaseDate.toFormat('yyyy-MM-dd_HH') - const { fetchAndUpdateTextures, updateTextureFilter } = useDataTextures(forecastBaseDate, selectedVariable); + const { fetchAndUpdateTextures, updateTextureFilter } = useDataTextures( + forecastBaseDate, + selectedVariable, + ) useEffect(() => { fetchAndUpdateTextures( 0, 1, - "reset", - isFilterNearest ? "nearest" : "linear", + 'reset', + isFilterNearest ? 'nearest' : 'linear', true, - materialRef - ); - }, [selectedVariable]); - + materialRef, + ) + }, [selectedVariable]) // Handle the tick function to externally control weight and sphere wrapping const tick = (sliderValue: number) => { if (materialRef.current) { - if (windowIndexRef.current != Math.floor(sliderValue)) { - - let thisFrame, nextFrame, mode; + let thisFrame, nextFrame, mode if (Math.floor(sliderValue) === 0) { - thisFrame = 0; - nextFrame = 1; - mode = "reset" + thisFrame = 0 + nextFrame = 1 + mode = 'reset' } else if (Math.floor(sliderValue) > windowIndexRef.current) { - thisFrame = windowIndexRef.current + 1; - nextFrame = windowIndexRef.current + 2; - mode = "forward"; + thisFrame = windowIndexRef.current + 1 + nextFrame = windowIndexRef.current + 2 + mode = 'forward' } else { - thisFrame = windowIndexRef.current - 1; - nextFrame = windowIndexRef.current; - mode = "backward"; + thisFrame = windowIndexRef.current - 1 + nextFrame = windowIndexRef.current + mode = 'backward' } fetchAndUpdateTextures( thisFrame, nextFrame, mode, - isFilterNearest ? "nearest" : "linear", + isFilterNearest ? 'nearest' : 'linear', false, - materialRef - ); - windowIndexRef.current = thisFrame; + materialRef, + ) + windowIndexRef.current = thisFrame } const weight = materialRef.current.uniforms.uTimeInterpolation.value ? sliderValue % 1 - : 0; - - materialRef.current.uniforms.uFrameWeight.value = weight; + : 0 + materialRef.current.uniforms.uFrameWeight.value = weight } - }; + } const changeProjection = (globeState: boolean) => { - gsap.to(shaderUniforms.uSphereWrapAmount, { value: globeState ? 1.0 : 0.0, duration: 2 }); - }; + gsap.to(shaderUniforms.uSphereWrapAmount, { + value: globeState ? 1.0 : 0.0, + duration: 2, + }) + } const changeFilter = (filterState: boolean) => { if (materialRef.current) { - const filter = filterState ? "nearest" : "linear"; - updateTextureFilter(filter, materialRef); + const filter = filterState ? 'nearest' : 'linear' + updateTextureFilter(filter, materialRef) } - }; + } const changeTimeInterpolation = (timeInterpolationState: boolean) => { if (materialRef.current) { // console.log('change time', timeInterpolationState) materialRef.current.uniforms.uTimeInterpolation.value = - timeInterpolationState; + timeInterpolationState } - }; + } useImperativeHandle(ref, () => ({ type: surface_layer_ref, @@ -192,7 +194,7 @@ const SurfaceLayer = memo( changeProjection, changeFilter, changeTimeInterpolation, - })); + })) return ( - ); - } - ) -); + ) + }, + ), +) -export { SurfaceLayer }; \ No newline at end of file +export { SurfaceLayer } diff --git a/air-quality-ui/src/components/globe/TextureProcessor.tsx b/air-quality-ui/src/components/globe/TextureProcessor.tsx index 6ae32956..f53d61d1 100644 --- a/air-quality-ui/src/components/globe/TextureProcessor.tsx +++ b/air-quality-ui/src/components/globe/TextureProcessor.tsx @@ -1,79 +1,99 @@ -import { useState, useEffect, useRef } from 'react'; +import { useEffect, useRef, useState } from 'react' const ImageProcessor = () => { - const [processedImage, setProcessedImage] = useState(null); - const imageUrl = 'http://localhost:5173/data_textures/2024-08-04_00/aqi_2024-08-04_00_CAMS_global.chunk_1_of_3.webp'; + const [processedImage, setProcessedImage] = useState(null) + const imageUrl = + 'http://localhost:5173/data_textures/2024-08-04_00/aqi_2024-08-04_00_CAMS_global.chunk_1_of_3.webp' // Create refs to store the image and canvas - const imageRef = useRef(null); - const canvasRef = useRef(null); + const imageRef = useRef(null) + const canvasRef = useRef(null) useEffect(() => { const processImage = async () => { - const img = new Image(); - img.crossOrigin = 'Anonymous'; // Handle cross-origin issues + const img = new Image() + img.crossOrigin = 'Anonymous' // Handle cross-origin issues img.onload = () => { // Store the image reference - imageRef.current = img; + imageRef.current = img - const canvas = document.createElement('canvas'); - canvasRef.current = canvas; // Store the canvas reference - const context = canvas.getContext('2d'); + const canvas = document.createElement('canvas') + canvasRef.current = canvas // Store the canvas reference + const context = canvas.getContext('2d') // Initialize canvas size - canvas.width = img.width; - canvas.height = img.height; + canvas.width = img.width + canvas.height = img.height // Draw the entire image on the canvas - context?.drawImage(img, 0, 0); + context?.drawImage(img, 0, 0) // Set initial section to display (first 900 pixels in width) - extractAndSetImage(0, 0, 900, img.height); - }; + extractAndSetImage(0, 0, 900, img.height) + } - img.src = imageUrl; - }; + img.src = imageUrl + } - processImage(); - }, [imageUrl]); + processImage() + }, [imageUrl]) - const extractAndSetImage = (x: number, y: number, width: number, height: number) => { - const canvas = canvasRef.current; - const context = canvas?.getContext('2d'); + const extractAndSetImage = ( + x: number, + y: number, + width: number, + height: number, + ) => { + const canvas = canvasRef.current + const context = canvas?.getContext('2d') if (!canvas) { - console.error('Canvas is not available'); - return; + console.error('Canvas is not available') + return } if (!context || !imageRef.current) { - console.error('Context or image is not available'); - return; + console.error('Context or image is not available') + return } // Clear the canvas - context?.clearRect(0, 0, canvas.width, canvas.height); + context?.clearRect(0, 0, canvas.width, canvas.height) // Draw the specified section of the image onto the canvas - context?.drawImage(imageRef.current, x, y, width, height, 0, 0, width, height); + context?.drawImage( + imageRef.current, + x, + y, + width, + height, + 0, + 0, + width, + height, + ) // Convert canvas to a data URL and set it as the processed image - const newImageUrl = canvas.toDataURL('image/webp'); - setProcessedImage(newImageUrl); - }; + const newImageUrl = canvas.toDataURL('image/webp') + setProcessedImage(newImageUrl) + } return (
- - + + {processedImage ? ( Processed ) : (

Loading...

)}
- ); -}; + ) +} -export default ImageProcessor; \ No newline at end of file +export default ImageProcessor diff --git a/air-quality-ui/src/components/globe/World.tsx b/air-quality-ui/src/components/globe/World.tsx index 1fd4a8a0..92a8e7ca 100644 --- a/air-quality-ui/src/components/globe/World.tsx +++ b/air-quality-ui/src/components/globe/World.tsx @@ -1,75 +1,76 @@ // World.tsx -import { useRef, useState, CSSProperties } from 'react'; -import { Canvas } from '@react-three/fiber'; -import { CameraControls } from '@react-three/drei'; -import { SurfaceLayer, SurfaceLayerRef } from './SurfaceLayer'; -import LocationMarker, { LocationMarkerRef } from './LocationMarker'; -import CameraSettings from './CameraSettings'; // Import the CameraSettings component -import ControlsHandler from './ControlsHandler'; // Import the ControlsHandler component +import { CameraControls } from '@react-three/drei' +import { Canvas } from '@react-three/fiber' +import { CSSProperties, useRef, useState } from 'react' + +import CameraSettings from './CameraSettings' // Import the CameraSettings component +import ControlsHandler from './ControlsHandler' // Import the ControlsHandler component +import LocationMarker, { LocationMarkerRef } from './LocationMarker' +import { SurfaceLayer, SurfaceLayerRef } from './SurfaceLayer' import { ForecastResponseDto, MeasurementSummaryResponseDto, } from '../../services/types' type WorldProps = { - forecastData: Record; - summarizedMeasurementData: Record; - toggle: string; -}; + forecastData: Record + summarizedMeasurementData: Record + toggle: string +} const World = ({ forecastData, summarizedMeasurementData, - toggle + toggle, }: WorldProps): JSX.Element => { - const surface_layer_ref = useRef(null); - const markerRef = useRef(null); - const cameraControlsRef = useRef(null); + const surface_layer_ref = useRef(null) + const markerRef = useRef(null) + const cameraControlsRef = useRef(null) - const [isTimeRunning, setIsTimeRunning] = useState(true); - const [isLocationMarkerOn, setIsLocationMarkerOn] = useState(true); - const [isFilterNearest, setGridFilterState] = useState(false); - const [isTimeInterpolation, setTimeInterpolationState] = useState(true); - const [selectedVariable, setSelectedVariable] = useState('aqi'); - const [globeState, setGlobeState] = useState(false); + const [isTimeRunning, setIsTimeRunning] = useState(true) + const [isLocationMarkerOn, setIsLocationMarkerOn] = useState(true) + const [isFilterNearest, setGridFilterState] = useState(false) + const [isTimeInterpolation, setTimeInterpolationState] = useState(true) + const [selectedVariable, setSelectedVariable] = useState('aqi') + const [globeState, setGlobeState] = useState(false) - const toggleTimeUpdate = () => setIsTimeRunning((prev) => !prev); + const toggleTimeUpdate = () => setIsTimeRunning((prev) => !prev) const handleGlobeButtonClick = (globeState: boolean) => { - setGlobeState(globeState); - surface_layer_ref.current?.changeProjection(globeState); - markerRef.current?.changeProjection(globeState); - }; + setGlobeState(globeState) + surface_layer_ref.current?.changeProjection(globeState) + markerRef.current?.changeProjection(globeState) + } const handleLocationMarkerButtonClick = (locationMarkerState: boolean) => { - setIsLocationMarkerOn(locationMarkerState); - markerRef.current?.setVisible(locationMarkerState); - }; + setIsLocationMarkerOn(locationMarkerState) + markerRef.current?.setVisible(locationMarkerState) + } const handleGridFilterClick = (filterState: boolean) => { - setGridFilterState(filterState); - surface_layer_ref.current?.changeFilter(filterState); - }; + setGridFilterState(filterState) + surface_layer_ref.current?.changeFilter(filterState) + } const handleTimeInterpolationClick = (timeInterpolationState: boolean) => { - setTimeInterpolationState(timeInterpolationState); - surface_layer_ref.current?.changeTimeInterpolation(timeInterpolationState); - }; + setTimeInterpolationState(timeInterpolationState) + surface_layer_ref.current?.changeTimeInterpolation(timeInterpolationState) + } const handleVariableSelect = (variable: string) => { - setSelectedVariable(variable); - }; + setSelectedVariable(variable) + } const handleSliderChange = (value: number) => { - surface_layer_ref.current?.tick(value); - markerRef.current?.tick(value); - }; + surface_layer_ref.current?.tick(value) + markerRef.current?.tick(value) + } return (
@@ -94,7 +95,11 @@ const World = ({ {/* */} - +
- ); -}; + ) +} const styles: { worldContainer: CSSProperties } = { worldContainer: { @@ -118,6 +123,6 @@ const styles: { worldContainer: CSSProperties } = { flexDirection: 'column', alignItems: 'center', }, -}; +} -export default World; \ No newline at end of file +export default World diff --git a/air-quality-ui/src/components/globe/useDataTextures.tsx b/air-quality-ui/src/components/globe/useDataTextures.tsx index 3a7d4348..8b25ca83 100644 --- a/air-quality-ui/src/components/globe/useDataTextures.tsx +++ b/air-quality-ui/src/components/globe/useDataTextures.tsx @@ -1,116 +1,106 @@ -import { useRef, useCallback } from "react"; -import * as THREE from "three"; +import { useCallback, useRef } from 'react' +import * as THREE from 'three' // const API_URL = import.meta.env.VITE_AIR_QUALITY_API_URL const generateImageUrls = ( forecastBaseDate: string, - selectedVariable: string + selectedVariable: string, ): string[] => { - - return [ `http://localhost:5173/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_1_of_3.webp`, `http://localhost:5173/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_2_of_3.webp`, `http://localhost:5173/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_3_of_3.webp`, - ]; + ] - // const imageUrls = [ - // `http://64.225.143.231/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_1_of_3.webp`, - // `http://64.225.143.231/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_2_of_3.webp`, - // `http://64.225.143.231/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_3_of_3.webp`, - // ]; + // const imageUrls = [ + // `http://64.225.143.231/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_1_of_3.webp`, + // `http://64.225.143.231/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_2_of_3.webp`, + // `http://64.225.143.231/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_3_of_3.webp`, + // ]; - // const imageUrls = [ - // `/volume/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_1_of_3.webp`, - // `/volume/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_2_of_3.webp`, - // `/volume/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_3_of_3.webp`, - // ]; -}; + // const imageUrls = [ + // `/volume/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_1_of_3.webp`, + // `/volume/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_2_of_3.webp`, + // `/volume/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_3_of_3.webp`, + // ]; +} const createCanvasTextureFromMultipleImages = async ( - imageUrls: string[] + imageUrls: string[], ): Promise => { return new Promise((resolve, reject) => { - const images: HTMLImageElement[] = []; - let imagesLoaded = 0; + const images: HTMLImageElement[] = [] + let imagesLoaded = 0 const onLoadImage = () => { - imagesLoaded++; + imagesLoaded++ if (imagesLoaded === imageUrls.length) { - const canvas = document.createElement("canvas"); - const context = canvas.getContext("2d"); + const canvas = document.createElement('canvas') + const context = canvas.getContext('2d') if (context) { - const singleImageWidth = images[0].width; - const singleImageHeight = images[0].height; - canvas.width = singleImageWidth * imageUrls.length; - canvas.height = singleImageHeight; + const singleImageWidth = images[0].width + const singleImageHeight = images[0].height + canvas.width = singleImageWidth * imageUrls.length + canvas.height = singleImageHeight images.forEach((img, index) => { - context.drawImage(img, index * singleImageWidth, 0); - }); + context.drawImage(img, index * singleImageWidth, 0) + }) - resolve(canvas); + resolve(canvas) } else { - reject(new Error("Failed to get canvas context")); + reject(new Error('Failed to get canvas context')) } } - }; + } imageUrls.forEach((url) => { - const img = new Image(); - img.crossOrigin = "Anonymous"; - img.onload = onLoadImage; - img.onerror = (error) => reject(error); - img.src = url; - images.push(img); - }); - }); -}; + const img = new Image() + img.crossOrigin = 'Anonymous' + img.onload = onLoadImage + img.onerror = (error) => reject(error) + img.src = url + images.push(img) + }) + }) +} const createCanvasTextureFromCanvas = ( canvas: HTMLCanvasElement, index: number, - filter: string + filter: string, ): THREE.CanvasTexture => { - const context = canvas.getContext("2d"); + const context = canvas.getContext('2d') if (context) { - const textureCanvas = document.createElement("canvas"); - const textureContext = textureCanvas.getContext("2d"); - - textureCanvas.width = 900; - textureCanvas.height = 450; - textureContext?.drawImage( - canvas, - index * 900, - 0, - 900, - 450, - 0, - 0, - 900, - 450 - ); - - const texture = new THREE.CanvasTexture(textureCanvas); - texture.wrapS = texture.wrapT = THREE.RepeatWrapping; - texture.minFilter = filter === "nearest" ? THREE.NearestFilter : THREE.LinearFilter; - texture.magFilter = filter === "nearest" ? THREE.NearestFilter : THREE.LinearFilter; - - return texture; + const textureCanvas = document.createElement('canvas') + const textureContext = textureCanvas.getContext('2d') + + textureCanvas.width = 900 + textureCanvas.height = 450 + textureContext?.drawImage(canvas, index * 900, 0, 900, 450, 0, 0, 900, 450) + + const texture = new THREE.CanvasTexture(textureCanvas) + texture.wrapS = texture.wrapT = THREE.RepeatWrapping + texture.minFilter = + filter === 'nearest' ? THREE.NearestFilter : THREE.LinearFilter + texture.magFilter = + filter === 'nearest' ? THREE.NearestFilter : THREE.LinearFilter + + return texture } else { - throw new Error("Failed to get texture canvas context"); + throw new Error('Failed to get texture canvas context') } -}; +} // Custom hook for managing textures export const useDataTextures = ( forecastBaseDate: string, - selectedVariable: string + selectedVariable: string, ) => { - const fullImageCanvasRef = useRef(null); + const fullImageCanvasRef = useRef(null) - const imageUrls = generateImageUrls(forecastBaseDate, selectedVariable); + const imageUrls = generateImageUrls(forecastBaseDate, selectedVariable) console.log(imageUrls) const fetchAndUpdateTextures = useCallback( @@ -120,78 +110,78 @@ export const useDataTextures = ( mode: string, filter: string, newVariable: boolean, - materialRef: React.RefObject + materialRef: React.RefObject, ) => { - if (newVariable && fullImageCanvasRef.current) { - fullImageCanvasRef.current = null; - } + if (newVariable && fullImageCanvasRef.current) { + fullImageCanvasRef.current = null + } try { const fullCanvas = fullImageCanvasRef.current || - (await createCanvasTextureFromMultipleImages(imageUrls)); - fullImageCanvasRef.current = fullCanvas; + (await createCanvasTextureFromMultipleImages(imageUrls)) + fullImageCanvasRef.current = fullCanvas if (materialRef.current) { - let thisCanvasTexture, nextCanvasTexture; + let thisCanvasTexture, nextCanvasTexture - if (mode === "forward") { + if (mode === 'forward') { nextCanvasTexture = createCanvasTextureFromCanvas( fullCanvas, nextFrame, - filter - ); + filter, + ) materialRef.current.uniforms.thisDataTexture.value = - materialRef.current.uniforms.nextDataTexture.value; + materialRef.current.uniforms.nextDataTexture.value materialRef.current.uniforms.nextDataTexture.value = - nextCanvasTexture; - } else if (mode === "backward") { + nextCanvasTexture + } else if (mode === 'backward') { thisCanvasTexture = createCanvasTextureFromCanvas( fullCanvas, thisFrame, - filter - ); + filter, + ) materialRef.current.uniforms.nextDataTexture.value = - materialRef.current.uniforms.thisDataTexture.value; + materialRef.current.uniforms.thisDataTexture.value materialRef.current.uniforms.thisDataTexture.value = - thisCanvasTexture; - } else if (mode === "reset") { + thisCanvasTexture + } else if (mode === 'reset') { thisCanvasTexture = createCanvasTextureFromCanvas( fullCanvas, thisFrame, - filter - ); + filter, + ) nextCanvasTexture = createCanvasTextureFromCanvas( fullCanvas, nextFrame, - filter - ); + filter, + ) materialRef.current.uniforms.thisDataTexture.value = - thisCanvasTexture; + thisCanvasTexture materialRef.current.uniforms.nextDataTexture.value = - nextCanvasTexture; + nextCanvasTexture } } } catch (error) { - console.error("Error processing image:", error); + console.error('Error processing image:', error) } }, - [imageUrls] - ); + [imageUrls], + ) -const updateTextureFilter = useCallback( + const updateTextureFilter = useCallback( (filter: string, materialRef: React.RefObject) => { - if (materialRef.current) { - materialRef.current.uniforms.thisDataTexture.value.magFilter = - filter === "nearest" ? THREE.NearestFilter : THREE.LinearFilter; - materialRef.current.uniforms.thisDataTexture.value.needsUpdate = true; - - materialRef.current.uniforms.nextDataTexture.value.magFilter = - filter === "nearest" ? THREE.NearestFilter : THREE.LinearFilter; - materialRef.current.uniforms.nextDataTexture.value.needsUpdate = true; - } + if (materialRef.current) { + materialRef.current.uniforms.thisDataTexture.value.magFilter = + filter === 'nearest' ? THREE.NearestFilter : THREE.LinearFilter + materialRef.current.uniforms.thisDataTexture.value.needsUpdate = true + + materialRef.current.uniforms.nextDataTexture.value.magFilter = + filter === 'nearest' ? THREE.NearestFilter : THREE.LinearFilter + materialRef.current.uniforms.nextDataTexture.value.needsUpdate = true + } }, - [] -); + [], + ) - return { fetchAndUpdateTextures, updateTextureFilter }; -}; \ No newline at end of file + return { fetchAndUpdateTextures, updateTextureFilter } +} diff --git a/air-quality-ui/src/components/summary-view/GlobalSummary.tsx b/air-quality-ui/src/components/summary-view/GlobalSummary.tsx index 75fad432..5f10ef75 100644 --- a/air-quality-ui/src/components/summary-view/GlobalSummary.tsx +++ b/air-quality-ui/src/components/summary-view/GlobalSummary.tsx @@ -4,8 +4,8 @@ import 'ag-grid-community/styles/ag-theme-quartz.css' import { useCallback, useMemo, useState } from 'react' import classes from './GlobalSummary.module.css' -import { SummaryViewHeader } from './SummaryViewHeader' import { MapViewHeader } from './MapViewHeader' +import { SummaryViewHeader } from './SummaryViewHeader' import { useForecastContext } from '../../context' import { getForecastData } from '../../services/forecast-data-service' import { getValidForecastTimesBetween } from '../../services/forecast-time-service' @@ -15,8 +15,8 @@ import { MeasurementSummaryResponseDto, } from '../../services/types' import { LoadingSpinner } from '../common/LoadingSpinner' -import GlobalSummaryTable from '../summary-grid/table/GlobalSummaryTable' import World from '../globe/World' +import GlobalSummaryTable from '../summary-grid/table/GlobalSummaryTable' const GlobalSummary = (): JSX.Element => { const { forecastDetails } = useForecastContext() @@ -73,7 +73,6 @@ const GlobalSummary = (): JSX.Element => { ) }, [forecastDetails]) - const { data: summarizedMeasurementData, isPending: summaryPending, @@ -117,13 +116,13 @@ const GlobalSummary = (): JSX.Element => { )} - {showMap && ( - - )} + {showMap && ( + + )} {!forecastPending && !summaryPending && (
{ summarizedMeasurements={summarizedMeasurementData} showAllColoured={showAllColoured} /> - +
)} diff --git a/air-quality-ui/src/components/summary-view/MapViewHeader.tsx b/air-quality-ui/src/components/summary-view/MapViewHeader.tsx index 77641fef..f5c7dddd 100644 --- a/air-quality-ui/src/components/summary-view/MapViewHeader.tsx +++ b/air-quality-ui/src/components/summary-view/MapViewHeader.tsx @@ -11,7 +11,6 @@ export const MapViewHeader = ({ showMap, setShowMap, }: MapViewHeaderProps): JSX.Element => { - return (
diff --git a/air-quality-ui/src/services/custom.d.ts b/air-quality-ui/src/services/custom.d.ts index 090cf13e..c31c5c1a 100644 --- a/air-quality-ui/src/services/custom.d.ts +++ b/air-quality-ui/src/services/custom.d.ts @@ -1,4 +1,4 @@ declare module '*.glsl' { - const value: string; - export default value; - } \ No newline at end of file + const value: string + export default value +} diff --git a/air-quality-ui/src/services/types.ts b/air-quality-ui/src/services/types.ts index 2329580a..155c8a87 100644 --- a/air-quality-ui/src/services/types.ts +++ b/air-quality-ui/src/services/types.ts @@ -45,7 +45,7 @@ export type ForecastTextureResponseDto = { texture_uri: string min_value: number max_value: number -} +} export type MeasurementsResponseDto = { measurement_date: string diff --git a/air-quality-ui/vite.config copy.ts b/air-quality-ui/vite.config copy.ts deleted file mode 100644 index 03fac352..00000000 --- a/air-quality-ui/vite.config copy.ts +++ /dev/null @@ -1,8 +0,0 @@ -import react from '@vitejs/plugin-react' -import glsl from 'vite-plugin-glsl'; -import { defineConfig } from 'vite' - -// https://vitejs.dev/config/ -export default defineConfig({ - plugins: [react(),glsl()], -}) diff --git a/air-quality-ui/vite.config.ts b/air-quality-ui/vite.config.ts index c894a733..29d892d4 100644 --- a/air-quality-ui/vite.config.ts +++ b/air-quality-ui/vite.config.ts @@ -1,19 +1,8 @@ import react from '@vitejs/plugin-react' -import glsl from 'vite-plugin-glsl'; import { defineConfig } from 'vite' +import glsl from 'vite-plugin-glsl' // https://vitejs.dev/config/ export default defineConfig({ plugins: [react(), glsl()], - server: { - proxy: { - // proxy requests to test retrieving data texture from deployed server - // otherwise prevented due to CORS policy issues - '/volume': { - target: 'http://64.225.143.231', - changeOrigin: true, - rewrite: (path) => path.replace(/^\/volume/, ''), - } - } - } -}); \ No newline at end of file +}) From 1104cc3aa92eec0f94db1886fe3dceff32992fe7 Mon Sep 17 00:00:00 2001 From: sebsteinig Date: Fri, 13 Sep 2024 08:59:51 +0100 Subject: [PATCH 21/39] fixed remaining linting issues --- .../src/components/globe/CameraSettings.tsx | 3 +- .../src/components/globe/LocationMarker.tsx | 34 ++++++++----------- .../src/components/globe/SurfaceLayer.tsx | 2 +- air-quality-ui/src/components/globe/World.tsx | 21 +++++++----- 4 files changed, 31 insertions(+), 29 deletions(-) diff --git a/air-quality-ui/src/components/globe/CameraSettings.tsx b/air-quality-ui/src/components/globe/CameraSettings.tsx index fc130c7d..196a3b94 100644 --- a/air-quality-ui/src/components/globe/CameraSettings.tsx +++ b/air-quality-ui/src/components/globe/CameraSettings.tsx @@ -1,10 +1,11 @@ // CameraSettings.tsx +import { CameraControls } from '@react-three/drei' import React, { useEffect } from 'react' import * as THREE from 'three' type CameraSettingsProps = { globeState: boolean - cameraControlsRef: React.RefObject + cameraControlsRef: React.RefObject toggle: string } diff --git a/air-quality-ui/src/components/globe/LocationMarker.tsx b/air-quality-ui/src/components/globe/LocationMarker.tsx index bea06d2b..e4714281 100644 --- a/air-quality-ui/src/components/globe/LocationMarker.tsx +++ b/air-quality-ui/src/components/globe/LocationMarker.tsx @@ -1,3 +1,4 @@ +import { CameraControls } from '@react-three/drei' import { useFrame } from '@react-three/fiber' import { gsap } from 'gsap' import { @@ -22,7 +23,7 @@ type LocationMarkerProps = { measurementData: Record selectedVariable: string isVisible: boolean - cameraControlsRef: React.RefObject + cameraControlsRef: React.RefObject } export type LocationMarkerRef = { @@ -92,7 +93,7 @@ const createDataArrays = ( ? ( matchingMeasurement[ variable_name as keyof MeasurementSummaryResponseDto - ] as any + ] as { mean: number } ).mean : -1 measurementDataArray.push(measurementValue) @@ -105,7 +106,7 @@ const createDataArrays = ( ? ( matchingMeasurement[ variable_name as keyof MeasurementSummaryResponseDto - ] as any + ] as { mean: { value: number } } ).mean.value : -1.0 measurementDataArray.push(measurementValue) @@ -151,31 +152,17 @@ const LocationMarker = forwardRef( }, ref, ): JSX.Element | null => { - if ( - !forecastData || - Object.keys(forecastData).length === 0 || - !measurementData || - Object.keys(measurementData).length === 0 - ) { - return null - } - type InstancedMeshWithUniforms = THREE.InstancedMesh & { material: THREE.ShaderMaterial | THREE.ShaderMaterial } const instancedMarkerRef = useRef(null) - const [, forceUpdate] = useReducer((x) => x + 1, 0) - const forecastDataTexture = useRef() const measurementDataTexture = useRef() const MAX_MARKERS = Object.keys(forecastData).length - const latitudes = new Float32Array(MAX_MARKERS) - const longitudes = new Float32Array(MAX_MARKERS) - useEffect(() => { forceUpdate() }, [selectedVariable, forecastData, measurementData]) @@ -208,7 +195,7 @@ const LocationMarker = forwardRef( measurementDataTexture.current.needsUpdate = true measurementDataTexture.current.minFilter = THREE.NearestFilter measurementDataTexture.current.magFilter = THREE.NearestFilter - }, [forecastData, measurementData, selectedVariable]) + }, [forecastData, measurementData, selectedVariable, MAX_MARKERS]) const markerSize = 0.025 @@ -216,6 +203,9 @@ const LocationMarker = forwardRef( if (instancedMarkerRef.current) { instancedMarkerRef.current.visible = isVisible + const latitudes = new Float32Array(MAX_MARKERS) + const longitudes = new Float32Array(MAX_MARKERS) + let i = 0 Object.keys(forecastData).forEach((city) => { const lat = forecastData[city][0]?.location.latitude || 0 @@ -245,7 +235,13 @@ const LocationMarker = forwardRef( ) instancedMarkerRef.current.instanceMatrix.needsUpdate = true } - }, [forecastData, measurementData, selectedVariable]) + }, [ + forecastData, + measurementData, + selectedVariable, + MAX_MARKERS, + isVisible, + ]) const scaleBasedOnZoom = () => { if (instancedMarkerRef.current && cameraControlsRef.current) { diff --git a/air-quality-ui/src/components/globe/SurfaceLayer.tsx b/air-quality-ui/src/components/globe/SurfaceLayer.tsx index 05ec1891..2bafe7e6 100644 --- a/air-quality-ui/src/components/globe/SurfaceLayer.tsx +++ b/air-quality-ui/src/components/globe/SurfaceLayer.tsx @@ -127,7 +127,7 @@ const SurfaceLayer = memo( true, materialRef, ) - }, [selectedVariable]) + }, [selectedVariable, fetchAndUpdateTextures, isFilterNearest]) // Handle the tick function to externally control weight and sphere wrapping const tick = (sliderValue: number) => { diff --git a/air-quality-ui/src/components/globe/World.tsx b/air-quality-ui/src/components/globe/World.tsx index 92a8e7ca..f48ba9b6 100644 --- a/air-quality-ui/src/components/globe/World.tsx +++ b/air-quality-ui/src/components/globe/World.tsx @@ -83,14 +83,19 @@ const World = ({ selectedVariable={selectedVariable} /> - + {!forecastData || + Object.keys(forecastData).length === 0 || + !summarizedMeasurementData || + Object.keys(summarizedMeasurementData).length === 0 ? null : ( + + )} {/* */} From c5bf628cf4cc2fdf998842aa0b1914ab52f4f37a Mon Sep 17 00:00:00 2001 From: sebsteinig Date: Fri, 13 Sep 2024 09:05:38 +0100 Subject: [PATCH 22/39] try to mock WebGL environment for Jest tests --- air-quality-ui/jest.setup.ts | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/air-quality-ui/jest.setup.ts b/air-quality-ui/jest.setup.ts index aac58d2b..3c4b3d83 100644 --- a/air-quality-ui/jest.setup.ts +++ b/air-quality-ui/jest.setup.ts @@ -9,3 +9,28 @@ Object.defineProperty(global.self, 'crypto', { subtle: crypto.webcrypto.subtle, }, }) + +// moke three.js and react-three-fiber components which rely on WebGL +jest.mock('@react-three/fiber', () => { + const ReactThreeFiber = jest.requireActual('@react-three/fiber'); + + return { + ...ReactThreeFiber, + Canvas: ({ children }) =>
{children}
, // Mocking the Canvas + }; +}); + +jest.mock('@react-three/drei', () => { + return { + CameraControls: () =>
, // Mocking CameraControls component + // Add more mocks as needed + }; +}); + +window.HTMLCanvasElement.prototype.getContext = () => { + return { + fillStyle: jest.fn(), + fillRect: jest.fn(), + // Add more mocked methods if needed + }; +}; From de54a813a09eab77f4689b07d4c320208d6a42c0 Mon Sep 17 00:00:00 2001 From: sebsteinig Date: Fri, 13 Sep 2024 09:24:49 +0100 Subject: [PATCH 23/39] jest webgl mocking --- air-quality-ui/jest.setup.ts | 39 +++++++++++++++++------------------- 1 file changed, 18 insertions(+), 21 deletions(-) diff --git a/air-quality-ui/jest.setup.ts b/air-quality-ui/jest.setup.ts index 3c4b3d83..e990e114 100644 --- a/air-quality-ui/jest.setup.ts +++ b/air-quality-ui/jest.setup.ts @@ -10,27 +10,24 @@ Object.defineProperty(global.self, 'crypto', { }, }) -// moke three.js and react-three-fiber components which rely on WebGL -jest.mock('@react-three/fiber', () => { - const ReactThreeFiber = jest.requireActual('@react-three/fiber'); +// mock three.js and react-three-fiber components which rely on WebGL +jest.mock('three', () => ({ + WebGLRenderer: jest.fn(), + Scene: jest.fn(), + PerspectiveCamera: jest.fn(), +})) - return { - ...ReactThreeFiber, - Canvas: ({ children }) =>
{children}
, // Mocking the Canvas - }; -}); +jest.mock('three-stdlib', () => ({ + LottieLoader: jest.fn(), +})) -jest.mock('@react-three/drei', () => { - return { - CameraControls: () =>
, // Mocking CameraControls component - // Add more mocks as needed - }; -}); +// Mock @react-three/drei components like CameraControls +jest.mock('@react-three/drei', () => ({ + CameraControls: jest.fn(), +})) -window.HTMLCanvasElement.prototype.getContext = () => { - return { - fillStyle: jest.fn(), - fillRect: jest.fn(), - // Add more mocked methods if needed - }; -}; +// Mock HTMLCanvasElement getContext method to prevent WebGL context from being called in tests +window.HTMLCanvasElement.prototype.getContext = () => ({ + fillStyle: jest.fn(), + fillRect: jest.fn(), +}) From 62454e7c8fd719f42577fd14bbae8835791ebdee Mon Sep 17 00:00:00 2001 From: sebsteinig Date: Fri, 13 Sep 2024 09:28:16 +0100 Subject: [PATCH 24/39] updated jest mocking --- air-quality-ui/jest.setup.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/air-quality-ui/jest.setup.ts b/air-quality-ui/jest.setup.ts index e990e114..d3facd0d 100644 --- a/air-quality-ui/jest.setup.ts +++ b/air-quality-ui/jest.setup.ts @@ -27,7 +27,7 @@ jest.mock('@react-three/drei', () => ({ })) // Mock HTMLCanvasElement getContext method to prevent WebGL context from being called in tests -window.HTMLCanvasElement.prototype.getContext = () => ({ - fillStyle: jest.fn(), - fillRect: jest.fn(), -}) +// window.HTMLCanvasElement.prototype.getContext = () => ({ +// fillStyle: jest.fn(), +// fillRect: jest.fn(), +// }) From bc64a65cfb6dfb1f95690f41e777a428f8b4542a Mon Sep 17 00:00:00 2001 From: sebsteinig Date: Fri, 13 Sep 2024 09:32:30 +0100 Subject: [PATCH 25/39] jest mocking --- air-quality-ui/jest.setup.ts | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/air-quality-ui/jest.setup.ts b/air-quality-ui/jest.setup.ts index d3facd0d..7d2ddeb6 100644 --- a/air-quality-ui/jest.setup.ts +++ b/air-quality-ui/jest.setup.ts @@ -26,8 +26,6 @@ jest.mock('@react-three/drei', () => ({ CameraControls: jest.fn(), })) -// Mock HTMLCanvasElement getContext method to prevent WebGL context from being called in tests -// window.HTMLCanvasElement.prototype.getContext = () => ({ -// fillStyle: jest.fn(), -// fillRect: jest.fn(), -// }) +jest.mock('three-custom-shader-material', () => { + return jest.fn(() => null) // Mock CustomShaderMaterial +}) From cf09c367dde63b045b8d3192d9e47ff5351851a9 Mon Sep 17 00:00:00 2001 From: sebsteinig Date: Fri, 13 Sep 2024 09:51:46 +0100 Subject: [PATCH 26/39] map GLSL files for jest tests --- air-quality-ui/jest.config.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/air-quality-ui/jest.config.ts b/air-quality-ui/jest.config.ts index b06c6f57..0925736f 100644 --- a/air-quality-ui/jest.config.ts +++ b/air-quality-ui/jest.config.ts @@ -31,6 +31,7 @@ export default { moduleNameMapper: { '\\.(gif|ttf|eot|svg|png)$': '/test/__ mocks __/fileMock.js', '\\.(css|less)$': 'identity-obj-proxy', + '\\.glsl$': '/test/__mocks__/glslMock.js', }, testPathIgnorePatterns: ['/node_modules/', '/system_tests/'], setupFiles: ['./jest.setup.ts'], From 6ba5760550bbc5dbe171389044d4dfc0f73dbab6 Mon Sep 17 00:00:00 2001 From: sebsteinig Date: Fri, 13 Sep 2024 09:55:55 +0100 Subject: [PATCH 27/39] updated jest mocking --- air-quality-ui/jest.config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/air-quality-ui/jest.config.ts b/air-quality-ui/jest.config.ts index 0925736f..03800380 100644 --- a/air-quality-ui/jest.config.ts +++ b/air-quality-ui/jest.config.ts @@ -31,7 +31,7 @@ export default { moduleNameMapper: { '\\.(gif|ttf|eot|svg|png)$': '/test/__ mocks __/fileMock.js', '\\.(css|less)$': 'identity-obj-proxy', - '\\.glsl$': '/test/__mocks__/glslMock.js', + '\\.glsl$': '/test/__ mocks __/fileMock.js', }, testPathIgnorePatterns: ['/node_modules/', '/system_tests/'], setupFiles: ['./jest.setup.ts'], From f78e4f8f6ccca19cd0f2d806885f484e25bbc55b Mon Sep 17 00:00:00 2001 From: sebsteinig Date: Fri, 13 Sep 2024 10:01:57 +0100 Subject: [PATCH 28/39] jest mocking --- air-quality-ui/jest.config.ts | 2 +- air-quality-ui/test/jest/__mocks__/glslMock.js | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 air-quality-ui/test/jest/__mocks__/glslMock.js diff --git a/air-quality-ui/jest.config.ts b/air-quality-ui/jest.config.ts index 03800380..2de04cdf 100644 --- a/air-quality-ui/jest.config.ts +++ b/air-quality-ui/jest.config.ts @@ -31,7 +31,7 @@ export default { moduleNameMapper: { '\\.(gif|ttf|eot|svg|png)$': '/test/__ mocks __/fileMock.js', '\\.(css|less)$': 'identity-obj-proxy', - '\\.glsl$': '/test/__ mocks __/fileMock.js', + '\\.glsl$': '/test/__ mocks __/glslMock.js', }, testPathIgnorePatterns: ['/node_modules/', '/system_tests/'], setupFiles: ['./jest.setup.ts'], diff --git a/air-quality-ui/test/jest/__mocks__/glslMock.js b/air-quality-ui/test/jest/__mocks__/glslMock.js new file mode 100644 index 00000000..dc731152 --- /dev/null +++ b/air-quality-ui/test/jest/__mocks__/glslMock.js @@ -0,0 +1 @@ +module.exports = 'void main() {}'; \ No newline at end of file From 06cca05264afda4826b999c9fc6b9efe85abcfbe Mon Sep 17 00:00:00 2001 From: sebsteinig Date: Fri, 13 Sep 2024 10:05:43 +0100 Subject: [PATCH 29/39] jest mocking --- air-quality-ui/jest.config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/air-quality-ui/jest.config.ts b/air-quality-ui/jest.config.ts index 2de04cdf..0925736f 100644 --- a/air-quality-ui/jest.config.ts +++ b/air-quality-ui/jest.config.ts @@ -31,7 +31,7 @@ export default { moduleNameMapper: { '\\.(gif|ttf|eot|svg|png)$': '/test/__ mocks __/fileMock.js', '\\.(css|less)$': 'identity-obj-proxy', - '\\.glsl$': '/test/__ mocks __/glslMock.js', + '\\.glsl$': '/test/__mocks__/glslMock.js', }, testPathIgnorePatterns: ['/node_modules/', '/system_tests/'], setupFiles: ['./jest.setup.ts'], From b24f61a2888a6ef77080921c929cda613a9caad2 Mon Sep 17 00:00:00 2001 From: sebsteinig Date: Fri, 13 Sep 2024 10:12:09 +0100 Subject: [PATCH 30/39] jest mocking --- air-quality-ui/jest.config.ts | 2 +- air-quality-ui/package-lock.json | 13 +++++++++++++ air-quality-ui/package.json | 1 + 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/air-quality-ui/jest.config.ts b/air-quality-ui/jest.config.ts index 0925736f..52d9ffa2 100644 --- a/air-quality-ui/jest.config.ts +++ b/air-quality-ui/jest.config.ts @@ -31,7 +31,7 @@ export default { moduleNameMapper: { '\\.(gif|ttf|eot|svg|png)$': '/test/__ mocks __/fileMock.js', '\\.(css|less)$': 'identity-obj-proxy', - '\\.glsl$': '/test/__mocks__/glslMock.js', + "^.+.(vert|frag|glsl)$": "jest-transform-stub" }, testPathIgnorePatterns: ['/node_modules/', '/system_tests/'], setupFiles: ['./jest.setup.ts'], diff --git a/air-quality-ui/package-lock.json b/air-quality-ui/package-lock.json index fdffd1cf..46eb91f9 100644 --- a/air-quality-ui/package-lock.json +++ b/air-quality-ui/package-lock.json @@ -54,6 +54,7 @@ "identity-obj-proxy": "^3.0.0", "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", + "jest-transform-stub": "^2.0.0", "r3f-perf": "^7.2.1", "ts-jest": "^29.1.4", "ts-jest-mock-import-meta": "^1.2.0", @@ -8918,6 +8919,12 @@ "node": ">=8" } }, + "node_modules/jest-transform-stub": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jest-transform-stub/-/jest-transform-stub-2.0.0.tgz", + "integrity": "sha512-lspHaCRx/mBbnm3h4uMMS3R5aZzMwyNpNIJLXj4cEsV0mIUtS4IjYJLSoyjRCtnxb6RIGJ4NL2quZzfIeNhbkg==", + "dev": true + }, "node_modules/jest-util": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", @@ -18746,6 +18753,12 @@ } } }, + "jest-transform-stub": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jest-transform-stub/-/jest-transform-stub-2.0.0.tgz", + "integrity": "sha512-lspHaCRx/mBbnm3h4uMMS3R5aZzMwyNpNIJLXj4cEsV0mIUtS4IjYJLSoyjRCtnxb6RIGJ4NL2quZzfIeNhbkg==", + "dev": true + }, "jest-util": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", diff --git a/air-quality-ui/package.json b/air-quality-ui/package.json index 0179a306..f15fe6bc 100644 --- a/air-quality-ui/package.json +++ b/air-quality-ui/package.json @@ -60,6 +60,7 @@ "identity-obj-proxy": "^3.0.0", "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", + "jest-transform-stub": "^2.0.0", "r3f-perf": "^7.2.1", "ts-jest": "^29.1.4", "ts-jest-mock-import-meta": "^1.2.0", From d585788e5885a05a87fcf60919fff0109c4eda87 Mon Sep 17 00:00:00 2001 From: sebsteinig Date: Fri, 13 Sep 2024 10:13:46 +0100 Subject: [PATCH 31/39] fixed linting --- air-quality-ui/jest.config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/air-quality-ui/jest.config.ts b/air-quality-ui/jest.config.ts index 52d9ffa2..10ae8bd0 100644 --- a/air-quality-ui/jest.config.ts +++ b/air-quality-ui/jest.config.ts @@ -31,7 +31,7 @@ export default { moduleNameMapper: { '\\.(gif|ttf|eot|svg|png)$': '/test/__ mocks __/fileMock.js', '\\.(css|less)$': 'identity-obj-proxy', - "^.+.(vert|frag|glsl)$": "jest-transform-stub" + '^.+.(vert|frag|glsl)$': 'jest-transform-stub', }, testPathIgnorePatterns: ['/node_modules/', '/system_tests/'], setupFiles: ['./jest.setup.ts'], From 2e3019ab64b5ab2f86431985275d145192e31d7d Mon Sep 17 00:00:00 2001 From: sebsteinig Date: Fri, 13 Sep 2024 10:21:35 +0100 Subject: [PATCH 32/39] simplified texture loading --- .../src/components/globe/SurfaceLayer.tsx | 21 ++++++------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/air-quality-ui/src/components/globe/SurfaceLayer.tsx b/air-quality-ui/src/components/globe/SurfaceLayer.tsx index 2bafe7e6..0d530c4e 100644 --- a/air-quality-ui/src/components/globe/SurfaceLayer.tsx +++ b/air-quality-ui/src/components/globe/SurfaceLayer.tsx @@ -7,6 +7,7 @@ import { useRef, // Import useEffect } from 'react' import * as THREE from 'three' +import { useTexture } from '@react-three/drei'; import fragmentShader from './shaders/surfaceFrag.glsl' import vertexShader from './shaders/surfaceVert.glsl' @@ -37,25 +38,17 @@ export type SurfaceLayerRef = { changeTimeInterpolation: (timeInterpolationState: boolean) => void } -// Preload textures globally so they are not reloaded during re-renders -const loader = new THREE.TextureLoader() -const cmap = loader.load('/all_colormaps.png') -const lsm = loader.load('/NaturalEarthCoastline2.jpg') -const height = loader.load('/gebco_08_rev_elev_2k_HQ.jpg') - -cmap.minFilter = THREE.NearestFilter -cmap.magFilter = THREE.NearestFilter -lsm.minFilter = THREE.NearestFilter -lsm.magFilter = THREE.NearestFilter -height.minFilter = THREE.NearestFilter -height.magFilter = THREE.NearestFilter - const geometry = new THREE.PlaneGeometry(4, 2, 64 * 4, 32 * 4) const SurfaceLayer = memo( forwardRef( ({ isFilterNearest, isTimeInterpolation, selectedVariable }, ref) => { const surface_layer_ref = useRef(null) + + const lsm = useTexture('/NaturalEarthCoastline2.jpg'); + lsm.minFilter = THREE.NearestFilter; + lsm.magFilter = THREE.NearestFilter; + const materialRef = useRef( new THREE.ShaderMaterial({ vertexShader: vertexShader, @@ -78,11 +71,9 @@ const SurfaceLayer = memo( thisDataMax: { value: new Float32Array(1) }, nextDataMin: { value: null }, nextDataMax: { value: null }, - referenceHeightTexture: { value: height }, referenceDataMin: { value: null }, referenceDataMax: { value: null }, referenceDataHeightFlag: { value: false }, - colorMap: { value: cmap }, colorMapIndex: { value: 0.0 }, lsmTexture: { value: lsm }, uVariableIndex: { value: null }, From 46ca42863888cfa236429fbf8f2b8a82659abd52 Mon Sep 17 00:00:00 2001 From: sebsteinig Date: Fri, 13 Sep 2024 10:22:19 +0100 Subject: [PATCH 33/39] fixed linting --- air-quality-ui/src/components/globe/SurfaceLayer.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/air-quality-ui/src/components/globe/SurfaceLayer.tsx b/air-quality-ui/src/components/globe/SurfaceLayer.tsx index 0d530c4e..934db0de 100644 --- a/air-quality-ui/src/components/globe/SurfaceLayer.tsx +++ b/air-quality-ui/src/components/globe/SurfaceLayer.tsx @@ -1,3 +1,4 @@ +import { useTexture } from '@react-three/drei' import { gsap } from 'gsap' import { forwardRef, @@ -7,7 +8,6 @@ import { useRef, // Import useEffect } from 'react' import * as THREE from 'three' -import { useTexture } from '@react-three/drei'; import fragmentShader from './shaders/surfaceFrag.glsl' import vertexShader from './shaders/surfaceVert.glsl' @@ -45,9 +45,9 @@ const SurfaceLayer = memo( ({ isFilterNearest, isTimeInterpolation, selectedVariable }, ref) => { const surface_layer_ref = useRef(null) - const lsm = useTexture('/NaturalEarthCoastline2.jpg'); - lsm.minFilter = THREE.NearestFilter; - lsm.magFilter = THREE.NearestFilter; + const lsm = useTexture('/NaturalEarthCoastline2.jpg') + lsm.minFilter = THREE.NearestFilter + lsm.magFilter = THREE.NearestFilter const materialRef = useRef( new THREE.ShaderMaterial({ From 06c54cbaa54812aa5f19a235d1e1d0ba0027111c Mon Sep 17 00:00:00 2001 From: sebsteinig Date: Fri, 13 Sep 2024 10:27:04 +0100 Subject: [PATCH 34/39] make map hidden by default --- .../src/components/globe/SurfaceLayer.tsx | 4 ++-- .../components/summary-view/GlobalSummary.tsx | 16 ++++++++-------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/air-quality-ui/src/components/globe/SurfaceLayer.tsx b/air-quality-ui/src/components/globe/SurfaceLayer.tsx index 934db0de..f825b2a3 100644 --- a/air-quality-ui/src/components/globe/SurfaceLayer.tsx +++ b/air-quality-ui/src/components/globe/SurfaceLayer.tsx @@ -38,7 +38,7 @@ export type SurfaceLayerRef = { changeTimeInterpolation: (timeInterpolationState: boolean) => void } -const geometry = new THREE.PlaneGeometry(4, 2, 64 * 4, 32 * 4) +// const geometry = const SurfaceLayer = memo( forwardRef( @@ -190,7 +190,7 @@ const SurfaceLayer = memo( return ( diff --git a/air-quality-ui/src/components/summary-view/GlobalSummary.tsx b/air-quality-ui/src/components/summary-view/GlobalSummary.tsx index 5f10ef75..e48f06b2 100644 --- a/air-quality-ui/src/components/summary-view/GlobalSummary.tsx +++ b/air-quality-ui/src/components/summary-view/GlobalSummary.tsx @@ -21,7 +21,7 @@ import GlobalSummaryTable from '../summary-grid/table/GlobalSummaryTable' const GlobalSummary = (): JSX.Element => { const { forecastDetails } = useForecastContext() const [showAllColoured, setShowAllColoured] = useState(true) - const [showMap, setShowMap] = useState(true) + const [showMap, setShowMap] = useState(false) const wrapSetShowAllColoured = useCallback( (val: boolean) => { @@ -116,13 +116,6 @@ const GlobalSummary = (): JSX.Element => { )} - {showMap && ( - - )} {!forecastPending && !summaryPending && (
{ showAllColoured={showAllColoured} /> + {showMap && ( + + )}
)} From fcd04ea715bf557843c52446b2fe79e0fdfd74a2 Mon Sep 17 00:00:00 2001 From: sebsteinig Date: Fri, 13 Sep 2024 10:31:24 +0100 Subject: [PATCH 35/39] removed unnecesary assets --- .../public/Maximum_Voltage_Regular.json | 1 - .../public/gebco_08_rev_elev_2k_HQ.jpg | Bin 290299 -> 0 bytes 2 files changed, 1 deletion(-) delete mode 100644 air-quality-ui/public/Maximum_Voltage_Regular.json delete mode 100644 air-quality-ui/public/gebco_08_rev_elev_2k_HQ.jpg diff --git a/air-quality-ui/public/Maximum_Voltage_Regular.json b/air-quality-ui/public/Maximum_Voltage_Regular.json deleted file mode 100644 index ac076524..00000000 --- a/air-quality-ui/public/Maximum_Voltage_Regular.json +++ /dev/null @@ -1 +0,0 @@ -{"glyphs":{"0":{"ha":949,"x_min":0,"x_max":949,"o":"m 475 0 q 139 139 278 0 q 0 475 0 278 q 139 810 0 671 q 475 949 278 949 q 810 810 671 949 q 949 475 949 671 q 810 139 949 278 q 475 0 671 0 m 475 271 q 618 331 559 271 q 678 475 678 391 q 618 618 678 559 q 475 678 559 678 q 331 618 391 678 q 271 475 271 559 q 331 331 271 391 q 475 271 391 271 z "},"1":{"ha":407,"x_min":68,"x_max":340,"o":"m 340 949 l 340 0 l 68 0 l 68 949 l 340 949 z "},"2":{"ha":882,"x_min":68,"x_max":882,"o":"m 814 0 l 68 0 l 68 311 q 475 610 68 610 l 543 610 q 610 638 610 610 q 543 678 610 678 l 136 678 l 136 949 l 475 949 q 882 638 882 949 q 475 339 882 339 q 339 311 339 339 l 339 271 l 814 271 l 814 0 z "},"3":{"ha":882,"x_min":68,"x_max":814,"o":"m 271 339 l 271 610 l 475 610 q 543 644 543 610 q 475 678 543 678 l 68 678 l 68 949 l 475 949 q 814 644 814 949 q 746 475 814 534 q 814 305 814 416 q 475 0 814 0 l 68 0 l 68 271 l 475 271 q 543 305 543 271 q 475 339 543 339 l 271 339 z "},"4":{"ha":882,"x_min":0,"x_max":882,"o":"m 746 339 l 746 0 l 475 0 l 475 339 l 0 339 l 136 949 l 407 949 l 339 610 l 475 610 l 475 949 l 746 949 l 746 610 l 882 610 l 882 339 l 746 339 z "},"5":{"ha":882,"x_min":68,"x_max":882,"o":"m 136 0 l 136 271 l 543 271 q 610 305 610 271 q 543 339 610 339 l 68 339 l 68 949 l 814 949 l 814 678 l 339 678 l 339 610 l 610 610 q 882 311 882 610 q 610 0 882 0 l 136 0 z "},"6":{"ha":882,"x_min":63,"x_max":877,"o":"m 402 678 q 334 610 334 678 l 538 610 q 877 305 877 610 q 538 0 877 0 l 402 0 q 63 305 63 0 l 63 644 q 402 949 63 949 l 814 949 l 814 678 l 402 678 m 538 271 q 606 305 606 271 q 538 339 606 339 l 402 339 q 334 305 334 339 q 402 271 334 271 l 538 271 z "},"7":{"ha":886,"x_min":136,"x_max":850,"o":"m 443 678 l 136 678 l 136 949 l 850 949 l 475 0 l 172 0 l 443 678 z "},"8":{"ha":949,"x_min":68,"x_max":882,"o":"m 543 610 q 610 644 610 610 q 543 678 610 678 l 407 678 q 339 644 339 678 q 407 610 339 610 l 543 610 m 543 949 q 882 644 882 949 q 814 475 882 534 q 882 305 882 416 q 543 0 882 0 l 407 0 q 68 305 68 0 q 136 475 68 416 q 68 644 68 534 q 407 949 68 949 l 543 949 m 543 271 q 610 305 610 271 l 610 307 q 545 339 610 339 l 409 339 q 339 305 341 339 q 407 271 339 271 l 543 271 z "},"9":{"ha":949,"x_min":68,"x_max":882,"o":"m 543 271 q 610 339 610 271 l 407 339 q 68 644 68 339 q 407 949 68 949 l 543 949 q 882 644 882 949 l 882 305 q 543 0 882 0 l 131 0 l 131 271 l 543 271 m 407 678 q 339 644 339 678 q 407 610 339 610 l 543 610 q 610 644 610 610 q 543 678 610 678 l 407 678 z "},"\u0000":{"ha":0,"x_min":0,"x_max":0,"o":""},"\u001d":{"ha":0,"x_min":0,"x_max":0,"o":""}," ":{"ha":543,"x_min":0,"x_max":0,"o":""}," ":{"ha":543,"x_min":0,"x_max":0,"o":""},"!":{"ha":543,"x_min":102,"x_max":441,"o":"m 136 339 l 102 949 l 441 949 l 408 339 l 136 339 m 136 0 l 136 271 l 408 271 l 408 0 l 136 0 z "},"\"":{"ha":625,"x_min":8,"x_max":618,"o":"m 279 949 l 245 543 l 42 543 l 8 949 l 279 949 m 618 949 l 585 543 l 381 543 l 347 949 l 618 949 z "},"#":{"ha":1085,"x_min":68,"x_max":1017,"o":"m 203 407 l 203 543 l 68 543 l 68 814 l 203 814 l 203 949 l 475 949 l 475 814 l 610 814 l 610 949 l 882 949 l 882 814 l 1017 814 l 1017 543 l 882 543 l 882 407 l 1017 407 l 1017 136 l 882 136 l 882 0 l 610 0 l 610 136 l 475 136 l 475 0 l 203 0 l 203 136 l 68 136 l 68 407 l 203 407 m 475 543 l 475 407 l 610 407 l 610 543 l 475 543 z "},"$":{"ha":814,"x_min":-1,"x_max":813,"o":"m 339 949 l 339 1085 l 475 1085 l 475 949 l 678 949 l 679 678 l 338 678 q 271 647 271 678 q 338 610 271 610 l 474 610 q 813 308 813 610 q 475 0 813 0 l 475 -136 l 339 -136 l 339 0 l 56 0 l 56 271 l 474 271 q 542 308 542 271 q 474 339 542 339 l 338 339 q -1 647 -1 339 q 338 949 -1 949 l 339 949 z "},"%":{"ha":919,"x_min":24,"x_max":906,"o":"m 906 949 l 330 0 l 24 0 l 603 949 l 906 949 m 296 610 l 24 610 l 24 882 l 296 882 l 296 610 m 906 68 l 635 68 l 635 339 l 906 339 l 906 68 z "},"&":{"ha":949,"x_min":68,"x_max":949,"o":"m 543 610 q 610 644 610 610 q 543 678 610 678 l 407 678 q 339 644 339 678 q 407 610 339 610 l 543 610 m 543 271 q 610 305 610 271 l 610 307 q 545 339 610 339 l 409 339 q 339 305 341 339 q 407 271 339 271 l 543 271 m 407 0 q 68 305 68 0 q 136 475 68 416 q 68 644 68 534 q 407 949 68 949 l 543 949 q 882 644 882 949 q 814 475 882 534 q 882 305 882 416 q 880 271 882 288 l 949 271 l 949 0 l 407 0 z "},"'":{"ha":287,"x_min":8,"x_max":279,"o":"m 279 949 l 245 543 l 42 543 l 8 949 l 279 949 z "},"(":{"ha":543,"x_min":68,"x_max":543,"o":"m 68 610 q 543 1085 68 1085 l 543 814 q 339 610 339 814 l 339 339 q 543 136 339 136 l 543 -136 q 68 339 68 -136 l 68 610 z "},")":{"ha":543,"x_min":68,"x_max":543,"o":"m 543 339 q 68 -136 543 -136 l 68 136 q 271 339 271 136 l 271 610 q 68 814 271 814 l 68 1085 q 543 610 543 1085 l 543 339 z "},"*":{"ha":678,"x_min":0,"x_max":678,"o":"m 407 775 l 530 899 l 626 804 l 502 678 l 678 678 l 678 543 l 502 543 l 626 417 l 530 321 l 407 446 l 407 271 l 271 271 l 271 446 l 149 321 l 52 417 l 176 543 l 0 543 l 0 678 l 176 678 l 52 804 l 149 899 l 271 775 l 271 949 l 407 949 l 407 775 z "},"+":{"ha":678,"x_min":0,"x_max":678,"o":"m 475 610 l 678 610 l 678 339 l 475 339 l 475 136 l 203 136 l 203 339 l 0 339 l 0 610 l 203 610 l 203 814 l 475 814 l 475 610 z "},",":{"ha":407,"x_min":-68,"x_max":339,"o":"m 339 136 l -68 -271 l 68 136 l 339 136 z "},"-":{"ha":543,"x_min":0,"x_max":543,"o":"m 543 610 l 543 339 l 0 339 l 0 610 l 543 610 z "},"­":{"ha":543,"x_min":0,"x_max":543,"o":"m 543 610 l 543 339 l 0 339 l 0 610 l 543 610 z "},".":{"ha":407,"x_min":68,"x_max":339,"o":"m 339 0 l 68 0 l 68 271 l 339 271 l 339 0 z "},"/":{"ha":678,"x_min":-104,"x_max":787,"o":"m 787 1085 l 179 -136 l -104 -136 l 512 1085 l 787 1085 z "},":":{"ha":407,"x_min":68,"x_max":339,"o":"m 339 543 l 68 543 l 68 814 l 339 814 l 339 543 m 339 136 l 68 136 l 68 407 l 339 407 l 339 136 z "},";":{"ha":407,"x_min":-68,"x_max":339,"o":"m 339 814 l 339 543 l 68 543 l 68 814 l 339 814 m 339 271 l -68 -271 l 68 271 l 339 271 z "},";":{"ha":407,"x_min":-68,"x_max":339,"o":"m 339 814 l 339 543 l 68 543 l 68 814 l 339 814 m 339 271 l -68 -271 l 68 271 l 339 271 z "},"<":{"ha":745,"x_min":0,"x_max":746,"o":"m 0 610 l 746 949 l 746 678 l 271 475 l 746 271 l 746 0 l 0 339 l 0 610 z "},"=":{"ha":746,"x_min":68,"x_max":678,"o":"m 678 814 l 678 543 l 68 543 l 68 814 l 678 814 m 678 407 l 678 136 l 68 136 l 68 407 l 678 407 z "},">":{"ha":814,"x_min":68,"x_max":814,"o":"m 814 339 l 68 0 l 68 271 l 543 475 l 68 678 l 68 949 l 814 610 l 814 339 z "},"?":{"ha":781,"x_min":68,"x_max":778,"o":"m 168 610 l 405 610 q 473 638 473 610 q 405 678 473 678 l 68 678 l 68 949 l 371 949 q 778 638 778 949 q 439 409 778 427 l 439 339 l 168 339 l 168 610 m 439 0 l 168 0 l 168 271 l 439 271 l 439 0 z "},"@":{"ha":949,"x_min":0,"x_max":956,"o":"m 488 288 q 352 243 435 243 q 239 288 275 243 q 213 365 213 319 q 218 409 213 385 q 345 625 243 531 q 566 719 447 719 q 733 667 627 719 q 644 469 657 507 q 625 404 631 431 q 623 388 623 395 q 632 374 623 374 q 728 437 682 374 q 792 587 774 500 q 804 663 804 629 q 769 757 804 722 q 614 813 713 813 q 328 694 456 813 q 163 395 201 576 q 155 323 155 357 q 190 206 155 254 q 350 135 242 135 q 467 155 407 135 q 581 222 528 174 l 643 111 q 478 28 570 57 q 309 0 387 0 q 58 106 141 0 q 0 286 0 180 q 11 382 0 331 q 244 786 62 624 q 655 948 426 948 q 900 857 820 948 q 956 695 956 792 q 946 607 956 654 q 818 358 916 467 q 597 250 720 250 q 488 288 514 250 m 537 601 q 441 543 490 601 q 377 416 392 484 q 375 397 375 406 q 398 372 375 372 q 459 399 430 372 q 508 473 488 426 q 556 595 527 519 q 537 601 551 601 z "},"A":{"ha":780,"x_min":-197,"x_max":882,"o":"m 407 1289 l 882 0 l 291 0 l 394 271 l 519 271 l 407 610 l 68 -271 l -197 -271 l 253 903 l 407 1289 z "},"B":{"ha":882,"x_min":-68,"x_max":882,"o":"m 407 610 l 475 610 q 543 661 543 610 q 475 712 543 712 l 340 712 l 340 271 l 543 271 q 611 339 611 271 q 543 407 611 407 l 407 407 l 407 610 m 475 949 q 764 814 679 949 q 802 690 802 752 q 747 543 802 616 q 882 339 882 475 q 543 0 882 0 l 68 0 l 68 814 l -68 949 l 475 949 z "},"C":{"ha":814,"x_min":0,"x_max":746,"o":"m 475 949 l 746 949 l 746 678 l 475 678 q 331 618 391 678 q 271 475 271 559 q 331 331 271 391 q 475 271 391 271 l 746 271 l 746 0 l 475 0 q 139 139 278 0 q 0 475 0 278 q 139 810 0 671 q 475 949 278 949 z "},"D":{"ha":882,"x_min":1,"x_max":882,"o":"m 340 271 l 408 271 q 551 331 492 271 q 611 475 611 391 q 551 618 611 559 q 408 678 492 678 l 340 678 l 340 271 m 408 949 q 743 810 604 949 q 882 475 882 671 q 743 139 882 278 q 408 0 604 0 l 68 0 l 68 882 l 1 949 l 408 949 z "},"E":{"ha":814,"x_min":-68,"x_max":746,"o":"m 407 610 l 746 610 l 746 339 l 407 339 l 407 610 m 746 949 l 746 678 l 340 678 l 340 271 l 746 271 l 746 0 l 68 0 l 68 814 l -68 949 l 746 949 z "},"F":{"ha":814,"x_min":-68,"x_max":746,"o":"m 407 610 l 746 610 l 746 339 l 407 339 l 407 610 m 746 949 l 746 678 l 340 678 l 339 -271 l 68 -271 l 68 814 l -68 949 l 746 949 z "},"G":{"ha":814,"x_min":0,"x_max":746,"o":"m 475 271 l 475 610 l 746 610 l 746 -271 l 475 -271 l 475 0 q 139 139 278 0 q 0 475 0 278 q 139 810 0 671 q 475 949 278 949 l 746 949 l 746 678 l 475 678 q 331 618 391 678 q 271 475 271 559 q 331 331 271 391 q 475 271 391 271 z "},"H":{"ha":1017,"x_min":-68,"x_max":950,"o":"m 950 949 l 950 0 l 679 0 l 679 339 l 340 339 l 340 0 l 68 0 l 68 814 l -68 949 l 340 949 l 340 610 l 679 610 l 678 814 l 543 949 l 950 949 z "},"I":{"ha":407,"x_min":68,"x_max":340,"o":"m 340 949 l 340 0 l 68 0 l 68 949 l 340 949 z "},"J":{"ha":543,"x_min":0,"x_max":473,"o":"m 473 949 l 473 475 q 0 0 473 0 l 0 271 l 66 271 q 201 475 201 271 l 201 804 l 68 949 l 473 949 z "},"K":{"ha":949,"x_min":-68,"x_max":1086,"o":"m 340 949 l 340 509 l 641 949 l 950 949 l 610 434 l 1086 -271 l 781 -271 l 340 351 l 340 0 l 68 0 l 68 813 l -68 949 l 340 949 z "},"L":{"ha":610,"x_min":-68,"x_max":610,"o":"m 340 949 l 340 271 l 610 271 l 610 0 l 68 0 l 68 814 l -68 949 l 340 949 z "},"M":{"ha":1221,"x_min":68,"x_max":1154,"o":"m 68 1103 l 610 339 l 1153 1085 l 1154 0 l 882 0 l 882 271 l 611 -136 l 339 271 l 340 0 l 68 0 l 68 882 l 68 1103 z "},"N":{"ha":1017,"x_min":68,"x_max":949,"o":"m 949 949 l 949 -136 l 339 407 l 339 0 l 68 0 l 68 1085 l 678 509 l 678 814 l 543 949 l 949 949 z "},"O":{"ha":949,"x_min":0,"x_max":949,"o":"m 475 0 q 139 139 278 0 q 0 475 0 278 q 139 810 0 671 q 475 949 278 949 q 810 810 671 949 q 949 475 949 671 q 810 139 949 278 q 475 0 671 0 m 475 271 q 618 331 559 271 q 678 475 678 391 q 618 618 678 559 q 475 678 559 678 q 331 618 391 678 q 271 475 271 559 q 331 331 271 391 q 475 271 391 271 z "},"P":{"ha":882,"x_min":-68,"x_max":881,"o":"m 542 949 q 881 610 881 949 q 542 271 881 271 l 406 271 l 406 543 l 542 543 q 610 610 610 543 q 542 678 610 678 l 338 678 l 339 -271 l 68 -271 l 67 814 l -68 949 l 542 949 z "},"Q":{"ha":949,"x_min":0,"x_max":1153,"o":"m 618 331 q 648 361 618 331 q 678 475 678 391 q 618 618 678 559 q 475 678 559 678 q 331 618 391 678 q 271 475 271 559 q 331 331 271 391 q 475 271 391 271 q 618 331 559 271 m 650 32 q 475 0 569 0 q 139 139 278 0 q 0 475 0 278 q 139 810 0 671 q 475 949 278 949 q 810 810 671 949 q 949 475 949 671 q 861 197 949 318 l 1153 -271 l 846 -271 l 650 32 z "},"R":{"ha":882,"x_min":-68,"x_max":1084,"o":"m 542 949 q 881 610 881 949 q 745 304 881 339 l 1084 -271 l 782 -271 l 406 300 l 405 543 l 542 543 q 610 610 610 543 q 542 678 610 678 l 338 678 l 338 0 l 67 0 l 67 814 l -68 949 l 542 949 z "},"S":{"ha":814,"x_min":-1,"x_max":813,"o":"m 338 339 q -1 647 -1 339 q 338 949 -1 949 l 678 949 l 679 678 l 338 678 q 271 647 271 678 q 338 610 271 610 l 474 610 q 813 308 813 610 q 474 0 813 0 l 56 0 l 56 271 l 474 271 q 542 308 542 271 q 474 339 542 339 l 338 339 z "},"T":{"ha":678,"x_min":-3,"x_max":678,"o":"m -3 949 l 678 949 l 678 678 l 475 678 l 475 -271 l 203 -271 l 203 678 l 0 678 l -3 949 z "},"U":{"ha":949,"x_min":-68,"x_max":882,"o":"m 339 949 l 339 475 q 475 271 339 271 q 610 475 610 271 l 610 814 l 475 949 l 882 949 l 882 475 q 475 0 882 0 q 68 475 68 0 l 68 814 l -68 949 l 339 949 z "},"V":{"ha":882,"x_min":-35,"x_max":920,"o":"m 920 949 l 446 -271 l -35 949 l 242 949 l 446 407 l 620 872 l 543 949 l 920 949 z "},"W":{"ha":1289,"x_min":-30,"x_max":1329,"o":"m 1329 949 l 893 -271 l 647 300 l 407 -271 l -30 949 l 244 949 l 448 407 l 651 1017 l 854 407 l 1028 871 l 949 949 l 1329 949 z "},"X":{"ha":867,"x_min":-32,"x_max":918,"o":"m 291 475 l -32 949 l 275 949 l 441 703 l 610 949 l 918 949 l 599 473 l 918 0 l 616 0 l 439 245 l 278 0 l -32 0 l 291 475 z "},"Y":{"ha":832,"x_min":-68,"x_max":882,"o":"m 269 441 l -68 949 l 239 949 l 405 703 l 574 949 l 882 949 l 541 441 l 541 -271 l 269 -271 l 269 441 z "},"Z":{"ha":882,"x_min":-64,"x_max":954,"o":"m 814 0 l -64 0 l 445 678 l 132 678 l 136 949 l 954 949 l 479 271 l 814 271 l 814 0 z "},"[":{"ha":543,"x_min":68,"x_max":543,"o":"m 543 1085 l 543 814 l 339 814 l 339 136 l 543 136 l 543 -136 l 68 -136 l 68 1085 l 543 1085 z "},"\\":{"ha":949,"x_min":34,"x_max":926,"o":"m 309 1085 l 926 -136 l 642 -136 l 34 1085 l 309 1085 z "},"]":{"ha":543,"x_min":68,"x_max":543,"o":"m 543 1085 l 543 -136 l 68 -136 l 68 136 l 271 136 l 271 814 l 68 814 l 68 1085 l 543 1085 z "},"^":{"ha":746,"x_min":34,"x_max":712,"o":"m 576 949 l 712 610 l 441 610 l 373 780 l 305 610 l 34 610 l 170 949 l 576 949 z "},"_":{"ha":882,"x_min":68,"x_max":814,"o":"m 814 271 l 814 0 l 68 0 l 68 271 l 814 271 z "},"`":{"ha":475,"x_min":34,"x_max":441,"o":"m 34 1356 l 305 1356 l 441 1017 l 170 1017 l 34 1356 z "},"a":{"ha":780,"x_min":-197,"x_max":882,"o":"m 407 1289 l 882 0 l 291 0 l 394 271 l 519 271 l 407 610 l 68 -271 l -197 -271 l 253 903 l 407 1289 z "},"b":{"ha":882,"x_min":-68,"x_max":882,"o":"m 407 610 l 475 610 q 543 661 543 610 q 475 712 543 712 l 340 712 l 340 271 l 543 271 q 611 339 611 271 q 543 407 611 407 l 407 407 l 407 610 m 475 949 q 764 814 679 949 q 802 690 802 752 q 747 543 802 616 q 882 339 882 475 q 543 0 882 0 l 68 0 l 68 814 l -68 949 l 475 949 z "},"c":{"ha":814,"x_min":0,"x_max":746,"o":"m 475 949 l 746 949 l 746 678 l 475 678 q 331 618 391 678 q 271 475 271 559 q 331 331 271 391 q 475 271 391 271 l 746 271 l 746 0 l 475 0 q 139 139 278 0 q 0 475 0 278 q 139 810 0 671 q 475 949 278 949 z "},"d":{"ha":882,"x_min":1,"x_max":882,"o":"m 340 271 l 408 271 q 551 331 492 271 q 611 475 611 391 q 551 618 611 559 q 408 678 492 678 l 340 678 l 340 271 m 408 949 q 743 810 604 949 q 882 475 882 671 q 743 139 882 278 q 408 0 604 0 l 68 0 l 68 882 l 1 949 l 408 949 z "},"e":{"ha":814,"x_min":-68,"x_max":746,"o":"m 407 610 l 746 610 l 746 339 l 407 339 l 407 610 m 746 949 l 746 678 l 340 678 l 340 271 l 746 271 l 746 0 l 68 0 l 68 814 l -68 949 l 746 949 z "},"f":{"ha":814,"x_min":-68,"x_max":746,"o":"m 407 610 l 746 610 l 746 339 l 407 339 l 407 610 m 746 949 l 746 678 l 340 678 l 339 -271 l 68 -271 l 68 814 l -68 949 l 746 949 z "},"g":{"ha":814,"x_min":0,"x_max":746,"o":"m 475 271 l 475 610 l 746 610 l 746 -271 l 475 -271 l 475 0 q 139 139 278 0 q 0 475 0 278 q 139 810 0 671 q 475 949 278 949 l 746 949 l 746 678 l 475 678 q 331 618 391 678 q 271 475 271 559 q 331 331 271 391 q 475 271 391 271 z "},"h":{"ha":1017,"x_min":-68,"x_max":950,"o":"m 950 949 l 950 0 l 679 0 l 679 339 l 340 339 l 340 0 l 68 0 l 68 814 l -68 949 l 340 949 l 340 610 l 679 610 l 678 814 l 543 949 l 950 949 z "},"i":{"ha":407,"x_min":68,"x_max":340,"o":"m 340 949 l 340 0 l 68 0 l 68 949 l 340 949 z "},"j":{"ha":543,"x_min":0,"x_max":473,"o":"m 473 949 l 473 475 q 0 0 473 0 l 0 271 l 66 271 q 201 475 201 271 l 201 804 l 68 949 l 473 949 z "},"k":{"ha":949,"x_min":-68,"x_max":1086,"o":"m 340 949 l 340 509 l 641 949 l 950 949 l 610 434 l 1086 -271 l 781 -271 l 340 351 l 340 0 l 68 0 l 68 813 l -68 949 l 340 949 z "},"l":{"ha":610,"x_min":-68,"x_max":610,"o":"m 340 949 l 340 271 l 610 271 l 610 0 l 68 0 l 68 814 l -68 949 l 340 949 z "},"m":{"ha":1221,"x_min":68,"x_max":1154,"o":"m 68 1103 l 610 339 l 1153 1085 l 1154 0 l 882 0 l 882 271 l 611 -136 l 339 271 l 340 0 l 68 0 l 68 882 l 68 1103 z "},"n":{"ha":1017,"x_min":68,"x_max":949,"o":"m 949 949 l 949 -136 l 339 407 l 339 0 l 68 0 l 68 1085 l 678 509 l 678 814 l 543 949 l 949 949 z "},"o":{"ha":949,"x_min":0,"x_max":949,"o":"m 475 0 q 139 139 278 0 q 0 475 0 278 q 139 810 0 671 q 475 949 278 949 q 810 810 671 949 q 949 475 949 671 q 810 139 949 278 q 475 0 671 0 m 475 271 q 618 331 559 271 q 678 475 678 391 q 618 618 678 559 q 475 678 559 678 q 331 618 391 678 q 271 475 271 559 q 331 331 271 391 q 475 271 391 271 z "},"p":{"ha":882,"x_min":-68,"x_max":881,"o":"m 542 949 q 881 610 881 949 q 542 271 881 271 l 406 271 l 406 543 l 542 543 q 610 610 610 543 q 542 678 610 678 l 338 678 l 339 -271 l 68 -271 l 67 814 l -68 949 l 542 949 z "},"q":{"ha":949,"x_min":0,"x_max":1153,"o":"m 618 331 q 648 361 618 331 q 678 475 678 391 q 618 618 678 559 q 475 678 559 678 q 331 618 391 678 q 271 475 271 559 q 331 331 271 391 q 475 271 391 271 q 618 331 559 271 m 650 32 q 475 0 569 0 q 139 139 278 0 q 0 475 0 278 q 139 810 0 671 q 475 949 278 949 q 810 810 671 949 q 949 475 949 671 q 861 197 949 318 l 1153 -271 l 846 -271 l 650 32 z "},"r":{"ha":882,"x_min":-68,"x_max":1084,"o":"m 907 29 l 1084 -271 l 782 -271 l 585 28 l 907 29 m 585 28 l 406 300 l 405 543 l 542 543 q 610 610 610 543 q 542 678 610 678 l 338 678 l 338 0 l 67 0 l 67 814 l -68 949 l 542 949 q 881 610 881 949 q 745 304 881 339 l 907 29 l 585 28 z "},"s":{"ha":814,"x_min":-1,"x_max":813,"o":"m 338 339 q -1 647 -1 339 q 338 949 -1 949 l 678 949 l 679 678 l 338 678 q 271 647 271 678 q 338 610 271 610 l 474 610 q 813 308 813 610 q 474 0 813 0 l 56 0 l 56 271 l 474 271 q 542 308 542 271 q 474 339 542 339 l 338 339 z "},"t":{"ha":678,"x_min":-3,"x_max":678,"o":"m -3 949 l 678 949 l 678 678 l 475 678 l 475 -271 l 203 -271 l 203 678 l 0 678 l -3 949 z "},"u":{"ha":949,"x_min":-68,"x_max":882,"o":"m 339 949 l 339 475 q 475 271 339 271 q 610 475 610 271 l 610 814 l 475 949 l 882 949 l 882 475 q 475 0 882 0 q 68 475 68 0 l 68 814 l -68 949 l 339 949 z "},"v":{"ha":882,"x_min":-35,"x_max":920,"o":"m 920 949 l 446 -271 l -35 949 l 242 949 l 446 407 l 620 872 l 543 949 l 920 949 z "},"w":{"ha":1289,"x_min":-30,"x_max":1329,"o":"m 1329 949 l 893 -271 l 647 300 l 407 -271 l -30 949 l 244 949 l 448 407 l 651 1017 l 854 407 l 1028 871 l 949 949 l 1329 949 z "},"x":{"ha":867,"x_min":-32,"x_max":918,"o":"m 291 475 l -32 949 l 275 949 l 441 703 l 610 949 l 918 949 l 599 473 l 918 0 l 616 0 l 439 245 l 278 0 l -32 0 l 291 475 z "},"y":{"ha":832,"x_min":-68,"x_max":882,"o":"m 269 441 l -68 949 l 239 949 l 405 703 l 574 949 l 882 949 l 541 441 l 541 -271 l 269 -271 l 269 441 z "},"z":{"ha":882,"x_min":-64,"x_max":954,"o":"m 814 0 l -64 0 l 445 678 l 132 678 l 136 949 l 954 949 l 479 271 l 814 271 l 814 0 z "},"{":{"ha":678,"x_min":68,"x_max":678,"o":"m 203 610 q 678 1085 203 1085 l 678 814 q 475 610 475 814 l 475 339 q 678 136 475 136 l 678 -136 q 203 339 203 -136 l 68 339 l 68 610 l 203 610 z "},"|":{"ha":407,"x_min":68,"x_max":339,"o":"m 339 1085 l 339 -136 l 68 -136 l 68 1085 l 339 1085 z "},"}":{"ha":678,"x_min":68,"x_max":678,"o":"m 543 339 q 68 -136 543 -136 l 68 136 q 271 339 271 136 l 271 610 q 68 814 271 814 l 68 1085 q 543 610 543 1085 l 678 610 l 678 339 l 543 339 z "},"~":{"ha":746,"x_min":68,"x_max":746,"o":"m 68 294 l 68 565 q 254 599 170 599 q 407 565 339 599 q 505 543 452 543 q 746 633 610 543 l 746 361 q 505 271 610 271 q 407 294 452 271 q 254 328 339 328 q 68 294 170 328 z "},"¡":{"ha":407,"x_min":34,"x_max":373,"o":"m 339 610 l 373 0 l 34 0 l 68 610 l 339 610 m 339 678 l 68 678 l 68 949 l 339 949 l 339 678 z "},"¢":{"ha":968,"x_min":68,"x_max":968,"o":"m 475 945 l 475 1085 l 610 1085 l 610 945 q 878 810 764 925 q 968 689 935 754 l 726 564 q 686 618 711 593 q 543 678 627 678 q 399 618 458 678 q 339 475 339 559 q 399 331 339 391 q 543 271 458 271 q 686 331 627 271 q 715 367 703 348 l 945 221 q 878 139 917 178 q 610 4 764 24 l 610 -136 l 475 -136 l 475 4 q 207 139 321 24 q 68 475 68 278 q 207 810 68 671 q 475 945 321 925 z "},"£":{"ha":882,"x_min":68,"x_max":882,"o":"m 656 610 l 655 610 q 543 678 621 678 q 431 610 465 678 l 610 610 l 610 339 l 407 339 l 407 270 l 882 270 l 882 0 l 136 0 l 136 339 l 68 339 l 68 610 l 145 610 q 543 949 199 949 q 844 836 741 949 l 712 678 l 656 610 z "},"¤":{"ha":916,"x_min":34,"x_max":882,"o":"m 576 374 q 600 398 576 374 q 625 492 625 422 q 576 610 625 561 q 458 659 527 659 q 340 610 389 659 q 291 492 291 561 q 340 374 291 422 q 458 325 389 325 q 576 374 527 325 m 258 156 l 140 8 l 34 93 l 155 245 q 68 492 68 351 q 145 726 68 625 l 34 865 l 140 949 l 244 819 q 458 882 338 882 q 671 819 578 882 l 776 949 l 882 865 l 770 726 q 848 492 848 625 q 760 245 848 351 l 882 93 l 776 8 l 658 156 q 458 102 569 102 q 258 156 347 102 z "},"¥":{"ha":1017,"x_min":34,"x_max":983,"o":"m 373 203 l 373 271 l 203 271 l 203 407 l 373 407 l 34 949 l 323 949 l 509 678 l 694 949 l 983 949 l 644 407 l 814 407 l 814 271 l 644 271 l 644 203 l 814 203 l 814 68 l 644 68 l 644 0 l 373 0 l 373 68 l 203 68 l 203 203 l 373 203 z "},"¦":{"ha":407,"x_min":68,"x_max":339,"o":"m 68 509 l 68 1085 l 339 1085 l 339 509 l 68 509 m 339 441 l 339 -136 l 68 -136 l 68 441 l 339 441 z "},"§":{"ha":814,"x_min":-1,"x_max":813,"o":"m 338 339 q -1 647 -1 339 q 338 949 -1 949 l 678 949 l 679 678 l 338 678 q 271 647 271 678 q 338 610 271 610 l 474 610 q 813 308 813 610 q 474 0 813 0 l 56 0 l 56 271 l 474 271 q 542 308 542 271 q 474 339 542 339 l 338 339 z "},"¨":{"ha":678,"x_min":34,"x_max":644,"o":"m 305 1017 l 34 1017 l 34 1289 l 305 1289 l 305 1017 m 644 1017 l 373 1017 l 373 1289 l 644 1289 l 644 1017 z "},"©":{"ha":926,"x_min":-7,"x_max":942,"o":"m 467 0 q 132 139 271 0 q -7 475 -7 278 q 132 810 -7 671 q 467 949 271 949 q 803 810 664 949 q 942 475 942 671 q 803 139 942 278 q 467 0 664 0 m 469 136 q 708 234 609 136 q 806 473 806 333 q 708 712 806 613 q 469 810 609 810 q 230 712 329 810 q 132 473 132 613 q 230 234 132 333 q 469 136 329 136 m 484 712 l 603 712 l 620 576 l 484 576 q 412 547 442 576 q 382 475 382 517 q 412 403 382 433 q 484 373 442 373 l 603 373 l 620 237 l 484 237 q 316 307 386 237 q 247 475 247 376 q 316 643 247 573 q 484 712 386 712 z "},"«":{"ha":1526,"x_min":34,"x_max":1492,"o":"m 34 610 l 780 949 l 780 678 l 305 475 l 780 271 l 780 0 l 34 339 l 34 610 m 746 610 l 1492 949 l 1492 678 l 1017 475 l 1492 271 l 1492 0 l 746 339 l 746 610 z "},"®":{"ha":1017,"x_min":34,"x_max":983,"o":"m 509 0 q 173 139 312 0 q 34 475 34 278 q 173 810 34 671 q 509 949 312 949 q 844 810 705 949 q 983 475 983 671 q 844 139 983 278 q 509 0 705 0 m 511 136 q 749 234 650 136 q 848 473 848 333 q 749 712 848 613 q 511 810 650 810 q 272 712 370 810 q 173 473 173 613 q 272 234 173 333 q 511 136 370 136 m 457 577 l 457 509 l 559 509 q 593 543 593 509 q 559 577 593 577 l 457 577 m 479 373 l 457 373 l 457 237 l 321 237 l 321 713 l 559 713 q 729 543 729 713 q 626 381 729 410 l 729 237 l 576 237 l 479 373 z "},"¯":{"ha":610,"x_min":34,"x_max":576,"o":"m 576 1289 l 576 1017 l 34 1017 l 34 1289 l 576 1289 z "},"°":{"ha":339,"x_min":34,"x_max":305,"o":"m 305 1017 l 34 1017 l 34 1289 l 305 1289 l 305 1017 z "},"±":{"ha":746,"x_min":34,"x_max":712,"o":"m 509 610 l 712 610 l 712 339 l 509 339 l 509 136 l 237 136 l 237 339 l 34 339 l 34 610 l 237 610 l 237 814 l 509 814 l 509 610 m 712 -203 l 34 -203 l 34 68 l 712 68 l 712 -203 z "},"´":{"ha":475,"x_min":34,"x_max":441,"o":"m 305 1017 l 34 1017 l 170 1356 l 441 1356 l 305 1017 z "},"µ":{"ha":882,"x_min":34,"x_max":848,"o":"m 305 475 q 441 271 305 271 q 576 475 576 271 l 576 949 l 848 949 l 848 475 q 441 0 848 0 q 305 16 366 0 l 305 -203 l 34 -203 l 34 949 l 305 949 l 305 475 z "},"¶":{"ha":882,"x_min":34,"x_max":848,"o":"m 848 949 l 848 678 l 780 678 l 780 -203 l 509 -203 l 509 678 l 373 678 l 373 -203 l 102 -203 l 102 441 l 34 441 l 34 949 l 848 949 z "},"»":{"ha":1526,"x_min":34,"x_max":1492,"o":"m 1492 610 l 1492 339 l 746 0 l 746 271 l 1221 475 l 746 678 l 746 949 l 1492 610 m 780 610 l 780 339 l 34 0 l 34 271 l 509 475 l 34 678 l 34 949 l 780 610 z "},"¼":{"ha":1085,"x_min":34,"x_max":1051,"o":"m 271 947 l 271 475 l 136 475 l 136 812 l 102 812 l 119 947 l 271 947 m 916 949 l 340 0 l 34 0 l 612 949 l 916 949 m 983 170 l 983 0 l 848 0 l 848 170 l 610 170 l 678 475 l 814 475 l 780 305 l 848 305 l 848 475 l 983 475 l 983 305 l 1034 305 l 1051 170 l 983 170 z "},"½":{"ha":1085,"x_min":34,"x_max":1051,"o":"m 271 947 l 271 475 l 136 475 l 136 812 l 102 812 l 119 947 l 271 947 m 916 949 l 340 0 l 34 0 l 612 949 l 916 949 m 848 475 q 1051 319 1051 475 q 848 170 1051 170 q 780 156 780 170 l 780 136 l 1034 136 l 1051 0 l 644 0 l 644 156 q 848 305 644 305 l 882 305 q 916 319 916 305 q 882 339 916 339 l 678 339 l 661 475 l 848 475 z "},"¾":{"ha":1153,"x_min":34,"x_max":1119,"o":"m 983 949 l 408 0 l 102 0 l 680 949 l 983 949 m 1051 170 l 1051 0 l 916 0 l 916 170 l 678 170 l 746 475 l 882 475 l 848 305 l 916 305 l 916 475 l 1051 475 l 1051 305 l 1102 305 l 1119 170 l 1051 170 m 136 643 l 136 779 l 238 779 q 273 796 273 779 q 238 813 273 813 l 51 813 l 34 949 l 238 949 q 408 796 408 949 q 374 711 408 741 q 408 626 408 682 q 238 473 408 473 l 51 473 l 34 609 l 238 609 q 273 626 273 609 q 238 643 273 643 l 136 643 z "},"¿":{"ha":882,"x_min":68,"x_max":814,"o":"m 203 339 l 203 610 l 475 610 l 475 541 q 814 311 814 522 q 407 0 814 0 l 68 0 l 68 271 l 441 271 q 509 311 509 271 q 441 339 509 339 l 203 339 m 475 949 l 475 678 l 203 678 l 203 949 l 475 949 z "},"À":{"ha":780,"x_min":-197,"x_max":882,"o":"m 452 1165 l 882 0 l 291 0 l 394 271 l 519 271 l 407 610 l 68 -271 l -197 -271 l 253 903 l 357 1165 l 314 1165 l 246 1369 l 450 1369 l 517 1165 l 452 1165 z "},"Á":{"ha":780,"x_min":-197,"x_max":882,"o":"m 457 1153 l 882 0 l 291 0 l 394 271 l 519 271 l 407 610 l 68 -271 l -197 -271 l 253 903 l 353 1153 l 293 1153 l 361 1356 l 564 1356 l 496 1153 l 457 1153 z "},"Â":{"ha":780,"x_min":-197,"x_max":882,"o":"m 482 1085 l 882 0 l 291 0 l 394 271 l 519 271 l 407 610 l 68 -271 l -197 -271 l 253 903 l 326 1085 l 136 1085 l 407 1356 l 678 1085 l 482 1085 z "},"Ã":{"ha":780,"x_min":-197,"x_max":882,"o":"m 465 1132 l 882 0 l 291 0 l 394 271 l 519 271 l 407 610 l 68 -271 l -197 -271 l 253 903 l 358 1167 q 285 1176 324 1176 q 136 1149 217 1176 l 136 1369 q 285 1396 217 1396 q 407 1369 353 1396 q 486 1351 444 1351 q 678 1424 570 1351 l 678 1204 q 486 1131 570 1131 q 465 1132 475 1131 z "},"Ä":{"ha":780,"x_min":-197,"x_max":882,"o":"m 407 1289 l 882 0 l 291 0 l 394 271 l 519 271 l 407 610 l 68 -271 l -197 -271 l 253 903 l 407 1289 m 237 1153 q 165 1183 195 1153 q 136 1255 136 1213 q 165 1326 136 1297 q 237 1356 195 1356 q 309 1326 279 1356 q 339 1255 339 1297 q 309 1183 339 1213 q 237 1153 279 1153 m 576 1153 q 505 1183 534 1153 q 475 1255 475 1213 q 505 1326 475 1297 q 576 1356 534 1356 q 648 1326 618 1356 q 678 1255 678 1297 q 648 1183 678 1213 q 576 1153 618 1153 z "},"Å":{"ha":780,"x_min":-197,"x_max":882,"o":"m 407 1121 q 455 1141 435 1121 q 475 1189 475 1161 q 455 1237 475 1217 q 407 1257 435 1257 q 359 1237 379 1257 q 339 1189 339 1217 q 359 1141 339 1161 q 407 1121 379 1121 m 497 1043 l 882 0 l 291 0 l 394 271 l 519 271 l 407 610 l 68 -271 l -197 -271 l 253 903 l 311 1047 q 287 1067 298 1055 q 237 1187 237 1116 q 287 1307 237 1257 q 407 1356 336 1356 q 527 1307 477 1356 q 576 1187 576 1257 q 527 1067 576 1116 q 497 1043 513 1053 z "},"Æ":{"ha":1289,"x_min":-197,"x_max":1221,"o":"m 514 949 l 1221 949 l 1221 678 l 814 678 l 814 271 l 1221 271 l 1221 0 l 291 0 l 394 271 l 519 271 l 407 610 l 68 -271 l -197 -271 l 253 903 l 407 1289 l 514 949 m 882 610 l 1221 610 l 1221 339 l 882 339 l 882 610 z "},"Ç":{"ha":814,"x_min":0,"x_max":746,"o":"m 441 1 q 139 139 266 12 q 0 475 0 278 q 139 810 0 671 q 475 949 278 949 l 746 949 l 746 678 l 475 678 q 331 618 391 678 q 271 475 271 559 q 331 331 271 391 q 475 271 391 271 l 746 271 l 746 0 l 509 0 l 509 -24 q 644 -126 644 -24 q 509 -228 644 -228 l 407 -228 l 407 -160 l 475 -160 q 559 -143 543 -160 q 568 -126 568 -134 q 555 -105 568 -117 q 441 -92 543 -92 l 441 1 z "},"È":{"ha":814,"x_min":-68,"x_max":746,"o":"m 407 610 l 746 610 l 746 339 l 407 339 l 407 610 m 746 949 l 746 678 l 340 678 l 340 271 l 746 271 l 746 0 l 68 0 l 68 814 l -68 949 l 746 949 m 305 1017 l 237 1221 l 441 1221 l 509 1017 l 305 1017 z "},"É":{"ha":814,"x_min":-68,"x_max":746,"o":"m 407 610 l 746 610 l 746 339 l 407 339 l 407 610 m 746 949 l 746 678 l 340 678 l 340 271 l 746 271 l 746 0 l 68 0 l 68 814 l -68 949 l 746 949 m 509 1017 l 305 1017 l 373 1221 l 576 1221 l 509 1017 z "},"Ê":{"ha":814,"x_min":-68,"x_max":746,"o":"m 407 610 l 746 610 l 746 339 l 407 339 l 407 610 m 746 949 l 746 678 l 340 678 l 340 271 l 746 271 l 746 0 l 68 0 l 68 814 l -68 949 l 746 949 m 407 1289 l 678 1017 l 475 1017 l 407 1085 l 339 1017 l 136 1017 l 407 1289 z "},"Ë":{"ha":814,"x_min":-68,"x_max":746,"o":"m 407 610 l 746 610 l 746 339 l 407 339 l 407 610 m 746 949 l 746 678 l 340 678 l 340 271 l 746 271 l 746 0 l 68 0 l 68 814 l -68 949 l 746 949 m 274 1017 q 202 1047 232 1017 q 172 1119 172 1077 q 202 1191 172 1161 q 274 1221 232 1221 q 346 1191 316 1221 q 376 1119 376 1161 q 346 1047 376 1077 q 274 1017 316 1017 m 545 1017 q 473 1047 503 1017 q 444 1119 444 1077 q 473 1191 444 1161 q 545 1221 503 1221 q 617 1191 587 1221 q 647 1119 647 1161 q 617 1047 647 1077 q 545 1017 587 1017 z "},"Ì":{"ha":407,"x_min":68,"x_max":340,"o":"m 340 949 l 340 0 l 68 0 l 68 949 l 340 949 m 136 1017 l 68 1221 l 271 1221 l 339 1017 l 136 1017 z "},"Í":{"ha":407,"x_min":68,"x_max":340,"o":"m 340 949 l 340 0 l 68 0 l 68 949 l 340 949 m 271 1017 l 68 1017 l 136 1221 l 339 1221 l 271 1017 z "},"Î":{"ha":407,"x_min":-68,"x_max":475,"o":"m 340 949 l 340 0 l 68 0 l 68 949 l 340 949 m 203 1289 l 475 1017 l 271 1017 l 203 1085 l 136 1017 l -68 1017 l 203 1289 z "},"Ï":{"ha":407,"x_min":-35,"x_max":440,"o":"m 340 949 l 340 0 l 68 0 l 68 949 l 340 949 m 67 1017 q -5 1047 25 1017 q -35 1119 -35 1077 q -5 1191 -35 1161 q 67 1221 25 1221 q 139 1191 109 1221 q 169 1119 169 1161 q 139 1047 169 1077 q 67 1017 109 1017 m 338 1017 q 267 1047 296 1017 q 237 1119 237 1077 q 267 1191 237 1161 q 338 1221 296 1221 q 410 1191 380 1221 q 440 1119 440 1161 q 410 1047 440 1077 q 338 1017 380 1017 z "},"Ð":{"ha":882,"x_min":-68,"x_max":882,"o":"m 68 543 l 68 882 l 1 949 l 408 949 q 743 810 604 949 q 882 475 882 671 q 743 139 882 278 q 408 0 604 0 l 68 0 l 68 407 l -68 407 l -68 543 l 68 543 m 340 543 l 475 543 l 475 407 l 340 407 l 340 271 l 408 271 q 551 331 492 271 q 611 475 611 391 q 551 618 611 559 q 408 678 492 678 l 340 678 l 340 543 z "},"Ñ":{"ha":1017,"x_min":68,"x_max":949,"o":"m 949 949 l 949 -136 l 339 407 l 339 0 l 68 0 l 68 1085 l 678 509 l 678 814 l 543 949 l 949 949 m 235 1036 l 235 1256 q 384 1283 316 1283 q 506 1256 452 1283 q 585 1238 543 1238 q 777 1311 669 1238 l 777 1090 q 585 1017 669 1017 q 506 1036 543 1017 q 384 1063 452 1063 q 235 1036 316 1063 z "},"Ò":{"ha":949,"x_min":0,"x_max":949,"o":"m 475 0 q 139 139 278 0 q 0 475 0 278 q 139 810 0 671 q 475 949 278 949 q 810 810 671 949 q 949 475 949 671 q 810 139 949 278 q 475 0 671 0 m 475 271 q 618 331 559 271 q 678 475 678 391 q 618 618 678 559 q 475 678 559 678 q 331 618 391 678 q 271 475 271 559 q 331 331 271 391 q 475 271 391 271 m 407 1017 l 339 1221 l 543 1221 l 610 1017 l 407 1017 z "},"Ó":{"ha":949,"x_min":0,"x_max":949,"o":"m 475 0 q 139 139 278 0 q 0 475 0 278 q 139 810 0 671 q 475 949 278 949 q 810 810 671 949 q 949 475 949 671 q 810 139 949 278 q 475 0 671 0 m 475 271 q 618 331 559 271 q 678 475 678 391 q 618 618 678 559 q 475 678 559 678 q 331 618 391 678 q 271 475 271 559 q 331 331 271 391 q 475 271 391 271 m 543 1017 l 339 1017 l 407 1221 l 610 1221 l 543 1017 z "},"Ô":{"ha":949,"x_min":0,"x_max":949,"o":"m 475 0 q 139 139 278 0 q 0 475 0 278 q 139 810 0 671 q 475 949 278 949 q 810 810 671 949 q 949 475 949 671 q 810 139 949 278 q 475 0 671 0 m 475 271 q 618 331 559 271 q 678 475 678 391 q 618 618 678 559 q 475 678 559 678 q 331 618 391 678 q 271 475 271 559 q 331 331 271 391 q 475 271 391 271 m 475 1289 l 746 1017 l 543 1017 l 475 1085 l 407 1017 l 203 1017 l 475 1289 z "},"Õ":{"ha":949,"x_min":0,"x_max":949,"o":"m 475 0 q 139 139 278 0 q 0 475 0 278 q 139 810 0 671 q 475 949 278 949 q 810 810 671 949 q 949 475 949 671 q 810 139 949 278 q 475 0 671 0 m 475 271 q 618 331 559 271 q 678 475 678 391 q 618 618 678 559 q 475 678 559 678 q 331 618 391 678 q 271 475 271 559 q 331 331 271 391 q 475 271 391 271 m 203 1013 l 203 1234 q 353 1261 285 1261 q 475 1234 420 1261 q 553 1215 511 1215 q 746 1289 637 1215 l 746 1068 q 553 995 637 995 q 475 1013 511 995 q 353 1040 420 1040 q 203 1013 285 1040 z "},"Ö":{"ha":949,"x_min":0,"x_max":949,"o":"m 618 331 q 648 361 618 331 q 678 475 678 391 q 618 618 678 559 q 475 678 559 678 q 331 618 391 678 q 271 475 271 559 q 331 331 271 391 q 475 271 391 271 q 618 331 559 271 m 475 0 q 139 139 278 0 q 0 475 0 278 q 139 810 0 671 q 475 949 278 949 q 810 810 671 949 q 949 475 949 671 q 810 139 949 278 q 475 0 671 0 m 340 1017 q 269 1047 298 1017 q 239 1119 239 1077 q 269 1191 239 1161 q 340 1221 298 1221 q 412 1191 382 1221 q 442 1119 442 1161 q 412 1047 442 1077 q 340 1017 382 1017 m 612 1017 q 540 1047 570 1017 q 510 1119 510 1077 q 540 1191 510 1161 q 612 1221 570 1221 q 684 1191 654 1221 q 713 1119 713 1161 q 684 1047 713 1077 q 612 1017 654 1017 z "},"×":{"ha":826,"x_min":34,"x_max":792,"o":"m 405 245 l 341 136 l 34 136 l 257 475 l 35 814 l 341 814 l 407 703 l 482 813 l 792 814 l 565 473 l 792 136 l 477 136 l 405 245 z "},"Ø":{"ha":951,"x_min":-3,"x_max":946,"o":"m 435 675 q 328 618 374 665 q 268 475 268 559 q 288 385 268 425 l 435 675 m 514 275 q 615 331 571 287 q 675 475 675 391 q 656 561 675 522 l 514 275 m 789 827 q 807 810 798 819 q 946 475 946 671 q 807 139 946 278 q 471 0 668 0 q 380 8 425 0 l 309 -136 l 26 -136 l 155 121 q 136 139 145 130 q -3 475 -3 278 q 136 810 -3 671 q 471 949 275 949 q 569 940 522 949 l 642 1085 l 918 1085 l 789 827 z "},"Ù":{"ha":949,"x_min":-68,"x_max":882,"o":"m 339 949 l 339 475 q 475 271 339 271 q 610 475 610 271 l 610 814 l 475 949 l 882 949 l 882 475 q 475 0 882 0 q 68 475 68 0 l 68 814 l -68 949 l 339 949 m 339 1017 l 271 1221 l 475 1221 l 543 1017 l 339 1017 z "},"Ú":{"ha":949,"x_min":-68,"x_max":882,"o":"m 339 949 l 339 475 q 475 271 339 271 q 610 475 610 271 l 610 814 l 475 949 l 882 949 l 882 475 q 475 0 882 0 q 68 475 68 0 l 68 814 l -68 949 l 339 949 m 543 1017 l 339 1017 l 407 1221 l 610 1221 l 543 1017 z "},"Û":{"ha":949,"x_min":-68,"x_max":882,"o":"m 339 949 l 339 475 q 475 271 339 271 q 610 475 610 271 l 610 814 l 475 949 l 882 949 l 882 475 q 475 0 882 0 q 68 475 68 0 l 68 814 l -68 949 l 339 949 m 475 1289 l 746 1017 l 543 1017 l 475 1085 l 407 1017 l 203 1017 l 475 1289 z "},"Ü":{"ha":949,"x_min":-68,"x_max":882,"o":"m 339 949 l 339 475 q 475 271 339 271 q 610 475 610 271 l 610 814 l 475 949 l 882 949 l 882 475 q 475 0 882 0 q 68 475 68 0 l 68 814 l -68 949 l 339 949 m 339 1017 q 267 1047 297 1017 q 237 1119 237 1077 q 267 1191 237 1161 q 339 1221 297 1221 q 411 1191 381 1221 q 441 1119 441 1161 q 411 1047 441 1077 q 339 1017 381 1017 m 610 1017 q 538 1047 568 1017 q 509 1119 509 1077 q 538 1191 509 1161 q 610 1221 568 1221 q 682 1191 652 1221 q 712 1119 712 1161 q 682 1047 712 1077 q 610 1017 652 1017 z "},"Ý":{"ha":832,"x_min":-68,"x_max":882,"o":"m 269 441 l -68 949 l 239 949 l 405 703 l 574 949 l 882 949 l 541 441 l 541 -271 l 269 -271 l 269 441 m 499 1017 l 296 1017 l 363 1221 l 567 1221 l 499 1017 z "},"Þ":{"ha":883,"x_min":73,"x_max":887,"o":"m 345 916 l 548 916 q 887 543 887 916 q 548 170 887 170 l 345 170 l 345 0 l 73 0 l 73 1051 l 345 1051 l 345 916 m 345 441 l 548 441 q 616 543 616 441 q 548 644 616 644 l 345 644 l 345 441 z "},"ß":{"ha":881,"x_min":73,"x_max":887,"o":"m 480 610 q 548 661 548 610 q 480 712 548 712 l 345 712 l 345 610 l 480 610 m 345 0 l 73 0 l 73 949 l 480 949 q 768 814 684 949 q 807 690 807 752 q 751 543 807 616 q 887 339 887 475 q 548 0 887 0 l 412 0 l 412 271 l 548 271 q 616 339 616 271 q 548 407 616 407 l 345 407 l 345 0 z "},"à":{"ha":780,"x_min":-197,"x_max":882,"o":"m 452 1165 l 882 0 l 291 0 l 394 271 l 519 271 l 407 610 l 68 -271 l -197 -271 l 253 903 l 357 1165 l 314 1165 l 246 1369 l 450 1369 l 517 1165 l 452 1165 z "},"á":{"ha":780,"x_min":-197,"x_max":882,"o":"m 457 1153 l 882 0 l 291 0 l 394 271 l 519 271 l 407 610 l 68 -271 l -197 -271 l 253 903 l 353 1153 l 293 1153 l 361 1356 l 564 1356 l 496 1153 l 457 1153 z "},"â":{"ha":780,"x_min":-197,"x_max":882,"o":"m 482 1085 l 882 0 l 291 0 l 394 271 l 519 271 l 407 610 l 68 -271 l -197 -271 l 253 903 l 326 1085 l 136 1085 l 407 1356 l 678 1085 l 482 1085 z "},"ã":{"ha":780,"x_min":-197,"x_max":882,"o":"m 465 1132 l 882 0 l 291 0 l 394 271 l 519 271 l 407 610 l 68 -271 l -197 -271 l 253 903 l 358 1167 q 285 1176 324 1176 q 136 1149 217 1176 l 136 1369 q 285 1396 217 1396 q 407 1369 353 1396 q 486 1351 444 1351 q 678 1424 570 1351 l 678 1204 q 486 1131 570 1131 q 465 1132 475 1131 z "},"ä":{"ha":780,"x_min":-197,"x_max":882,"o":"m 407 1289 l 882 0 l 291 0 l 394 271 l 519 271 l 407 610 l 68 -271 l -197 -271 l 253 903 l 407 1289 m 237 1153 q 165 1183 195 1153 q 136 1255 136 1213 q 165 1326 136 1297 q 237 1356 195 1356 q 309 1326 279 1356 q 339 1255 339 1297 q 309 1183 339 1213 q 237 1153 279 1153 m 576 1153 q 505 1183 534 1153 q 475 1255 475 1213 q 505 1326 475 1297 q 576 1356 534 1356 q 648 1326 618 1356 q 678 1255 678 1297 q 648 1183 678 1213 q 576 1153 618 1153 z "},"å":{"ha":780,"x_min":-197,"x_max":882,"o":"m 407 1121 q 455 1141 435 1121 q 475 1189 475 1161 q 455 1237 475 1217 q 407 1257 435 1257 q 359 1237 379 1257 q 339 1189 339 1217 q 359 1141 339 1161 q 407 1121 379 1121 m 497 1043 l 882 0 l 291 0 l 394 271 l 519 271 l 407 610 l 68 -271 l -197 -271 l 253 903 l 311 1047 q 287 1067 298 1055 q 237 1187 237 1116 q 287 1307 237 1257 q 407 1356 336 1356 q 527 1307 477 1356 q 576 1187 576 1257 q 527 1067 576 1116 q 497 1043 513 1053 z "},"æ":{"ha":1289,"x_min":-197,"x_max":1221,"o":"m 514 949 l 1221 949 l 1221 678 l 814 678 l 814 271 l 1221 271 l 1221 0 l 291 0 l 394 271 l 519 271 l 407 610 l 68 -271 l -197 -271 l 253 903 l 407 1289 l 514 949 m 882 610 l 1221 610 l 1221 339 l 882 339 l 882 610 z "},"ç":{"ha":814,"x_min":0,"x_max":746,"o":"m 441 1 q 139 139 266 12 q 0 475 0 278 q 139 810 0 671 q 475 949 278 949 l 746 949 l 746 678 l 475 678 q 331 618 391 678 q 271 475 271 559 q 331 331 271 391 q 475 271 391 271 l 746 271 l 746 0 l 509 0 l 509 -24 q 644 -126 644 -24 q 509 -228 644 -228 l 407 -228 l 407 -160 l 475 -160 q 559 -143 543 -160 q 568 -126 568 -134 q 555 -105 568 -117 q 441 -92 543 -92 l 441 1 z "},"è":{"ha":814,"x_min":-68,"x_max":746,"o":"m 407 610 l 746 610 l 746 339 l 407 339 l 407 610 m 746 949 l 746 678 l 340 678 l 340 271 l 746 271 l 746 0 l 68 0 l 68 814 l -68 949 l 746 949 m 305 1017 l 237 1221 l 441 1221 l 509 1017 l 305 1017 z "},"é":{"ha":814,"x_min":-68,"x_max":746,"o":"m 407 610 l 746 610 l 746 339 l 407 339 l 407 610 m 746 949 l 746 678 l 340 678 l 340 271 l 746 271 l 746 0 l 68 0 l 68 814 l -68 949 l 746 949 m 509 1017 l 305 1017 l 373 1221 l 576 1221 l 509 1017 z "},"ê":{"ha":814,"x_min":-68,"x_max":746,"o":"m 407 610 l 746 610 l 746 339 l 407 339 l 407 610 m 746 949 l 746 678 l 340 678 l 340 271 l 746 271 l 746 0 l 68 0 l 68 814 l -68 949 l 746 949 m 407 1289 l 678 1017 l 475 1017 l 407 1085 l 339 1017 l 136 1017 l 407 1289 z "},"ë":{"ha":814,"x_min":-68,"x_max":746,"o":"m 407 610 l 746 610 l 746 339 l 407 339 l 407 610 m 746 949 l 746 678 l 340 678 l 340 271 l 746 271 l 746 0 l 68 0 l 68 814 l -68 949 l 746 949 m 274 1017 q 202 1047 232 1017 q 172 1119 172 1077 q 202 1191 172 1161 q 274 1221 232 1221 q 346 1191 316 1221 q 376 1119 376 1161 q 346 1047 376 1077 q 274 1017 316 1017 m 545 1017 q 473 1047 503 1017 q 444 1119 444 1077 q 473 1191 444 1161 q 545 1221 503 1221 q 617 1191 587 1221 q 647 1119 647 1161 q 617 1047 647 1077 q 545 1017 587 1017 z "},"ì":{"ha":407,"x_min":68,"x_max":340,"o":"m 340 949 l 340 0 l 68 0 l 68 949 l 340 949 m 136 1017 l 68 1221 l 271 1221 l 339 1017 l 136 1017 z "},"í":{"ha":407,"x_min":68,"x_max":340,"o":"m 340 949 l 340 0 l 68 0 l 68 949 l 340 949 m 271 1017 l 68 1017 l 136 1221 l 339 1221 l 271 1017 z "},"î":{"ha":407,"x_min":-68,"x_max":475,"o":"m 340 949 l 340 0 l 68 0 l 68 949 l 340 949 m 203 1289 l 475 1017 l 271 1017 l 203 1085 l 136 1017 l -68 1017 l 203 1289 z "},"ï":{"ha":407,"x_min":-35,"x_max":440,"o":"m 340 949 l 340 0 l 68 0 l 68 949 l 340 949 m 67 1017 q -5 1047 25 1017 q -35 1119 -35 1077 q -5 1191 -35 1161 q 67 1221 25 1221 q 139 1191 109 1221 q 169 1119 169 1161 q 139 1047 169 1077 q 67 1017 109 1017 m 338 1017 q 267 1047 296 1017 q 237 1119 237 1077 q 267 1191 237 1161 q 338 1221 296 1221 q 410 1191 380 1221 q 440 1119 440 1161 q 410 1047 440 1077 q 338 1017 380 1017 z "},"ð":{"ha":949,"x_min":0,"x_max":949,"o":"m 678 475 q 618 618 678 559 q 475 678 559 678 q 331 618 391 678 q 271 475 271 559 q 331 331 271 391 q 475 271 391 271 q 618 331 559 271 q 678 475 678 391 m 503 1144 l 834 787 l 833 786 q 949 475 949 654 q 810 139 949 278 q 475 0 671 0 q 139 139 278 0 q 0 475 0 278 q 139 810 0 671 q 337 930 227 898 l 296 976 l 197 897 l 79 1032 l 178 1111 l 115 1178 l 315 1343 l 379 1278 l 473 1352 l 604 1225 l 503 1144 z "},"ñ":{"ha":1017,"x_min":68,"x_max":949,"o":"m 949 949 l 949 -136 l 339 407 l 339 0 l 68 0 l 68 1085 l 678 509 l 678 814 l 543 949 l 949 949 m 235 1036 l 235 1256 q 384 1283 316 1283 q 506 1256 452 1283 q 585 1238 543 1238 q 777 1311 669 1238 l 777 1090 q 585 1017 669 1017 q 506 1036 543 1017 q 384 1063 452 1063 q 235 1036 316 1063 z "},"ò":{"ha":949,"x_min":0,"x_max":949,"o":"m 475 0 q 139 139 278 0 q 0 475 0 278 q 139 810 0 671 q 475 949 278 949 q 810 810 671 949 q 949 475 949 671 q 810 139 949 278 q 475 0 671 0 m 475 271 q 618 331 559 271 q 678 475 678 391 q 618 618 678 559 q 475 678 559 678 q 331 618 391 678 q 271 475 271 559 q 331 331 271 391 q 475 271 391 271 m 407 1017 l 339 1221 l 543 1221 l 610 1017 l 407 1017 z "},"ó":{"ha":949,"x_min":0,"x_max":949,"o":"m 475 0 q 139 139 278 0 q 0 475 0 278 q 139 810 0 671 q 475 949 278 949 q 810 810 671 949 q 949 475 949 671 q 810 139 949 278 q 475 0 671 0 m 475 271 q 618 331 559 271 q 678 475 678 391 q 618 618 678 559 q 475 678 559 678 q 331 618 391 678 q 271 475 271 559 q 331 331 271 391 q 475 271 391 271 m 543 1017 l 339 1017 l 407 1221 l 610 1221 l 543 1017 z "},"ô":{"ha":949,"x_min":0,"x_max":949,"o":"m 475 0 q 139 139 278 0 q 0 475 0 278 q 139 810 0 671 q 475 949 278 949 q 810 810 671 949 q 949 475 949 671 q 810 139 949 278 q 475 0 671 0 m 475 271 q 618 331 559 271 q 678 475 678 391 q 618 618 678 559 q 475 678 559 678 q 331 618 391 678 q 271 475 271 559 q 331 331 271 391 q 475 271 391 271 m 475 1289 l 746 1017 l 543 1017 l 475 1085 l 407 1017 l 203 1017 l 475 1289 z "},"õ":{"ha":949,"x_min":0,"x_max":949,"o":"m 475 0 q 139 139 278 0 q 0 475 0 278 q 139 810 0 671 q 475 949 278 949 q 810 810 671 949 q 949 475 949 671 q 810 139 949 278 q 475 0 671 0 m 475 271 q 618 331 559 271 q 678 475 678 391 q 618 618 678 559 q 475 678 559 678 q 331 618 391 678 q 271 475 271 559 q 331 331 271 391 q 475 271 391 271 m 203 1013 l 203 1234 q 353 1261 285 1261 q 475 1234 420 1261 q 553 1215 511 1215 q 746 1289 637 1215 l 746 1068 q 553 995 637 995 q 475 1013 511 995 q 353 1040 420 1040 q 203 1013 285 1040 z "},"ö":{"ha":949,"x_min":0,"x_max":949,"o":"m 618 331 q 648 361 618 331 q 678 475 678 391 q 618 618 678 559 q 475 678 559 678 q 331 618 391 678 q 271 475 271 559 q 331 331 271 391 q 475 271 391 271 q 618 331 559 271 m 475 0 q 139 139 278 0 q 0 475 0 278 q 139 810 0 671 q 475 949 278 949 q 810 810 671 949 q 949 475 949 671 q 810 139 949 278 q 475 0 671 0 m 340 1017 q 269 1047 298 1017 q 239 1119 239 1077 q 269 1191 239 1161 q 340 1221 298 1221 q 412 1191 382 1221 q 442 1119 442 1161 q 412 1047 442 1077 q 340 1017 382 1017 m 612 1017 q 540 1047 570 1017 q 510 1119 510 1077 q 540 1191 510 1161 q 612 1221 570 1221 q 684 1191 654 1221 q 713 1119 713 1161 q 684 1047 713 1077 q 612 1017 654 1017 z "},"÷":{"ha":814,"x_min":68,"x_max":746,"o":"m 746 610 l 746 339 l 68 339 l 68 610 l 746 610 m 543 678 l 271 678 l 271 949 l 543 949 l 543 678 m 543 0 l 271 0 l 271 271 l 543 271 l 543 0 z "},"ø":{"ha":951,"x_min":-3,"x_max":946,"o":"m 435 675 q 328 618 374 665 q 268 475 268 559 q 288 385 268 425 l 435 675 m 514 275 q 615 331 571 287 q 675 475 675 391 q 656 561 675 522 l 514 275 m 789 827 q 807 810 798 819 q 946 475 946 671 q 807 139 946 278 q 471 0 668 0 q 380 8 425 0 l 309 -136 l 26 -136 l 155 121 q 136 139 145 130 q -3 475 -3 278 q 136 810 -3 671 q 471 949 275 949 q 569 940 522 949 l 642 1085 l 918 1085 l 789 827 z "},"ù":{"ha":949,"x_min":-68,"x_max":882,"o":"m 339 949 l 339 475 q 475 271 339 271 q 610 475 610 271 l 610 814 l 475 949 l 882 949 l 882 475 q 475 0 882 0 q 68 475 68 0 l 68 814 l -68 949 l 339 949 m 339 1017 l 271 1221 l 475 1221 l 543 1017 l 339 1017 z "},"ú":{"ha":949,"x_min":-68,"x_max":882,"o":"m 339 949 l 339 475 q 475 271 339 271 q 610 475 610 271 l 610 814 l 475 949 l 882 949 l 882 475 q 475 0 882 0 q 68 475 68 0 l 68 814 l -68 949 l 339 949 m 543 1017 l 339 1017 l 407 1221 l 610 1221 l 543 1017 z "},"û":{"ha":949,"x_min":-68,"x_max":882,"o":"m 339 949 l 339 475 q 475 271 339 271 q 610 475 610 271 l 610 814 l 475 949 l 882 949 l 882 475 q 475 0 882 0 q 68 475 68 0 l 68 814 l -68 949 l 339 949 m 475 1289 l 746 1017 l 543 1017 l 475 1085 l 407 1017 l 203 1017 l 475 1289 z "},"ü":{"ha":949,"x_min":-68,"x_max":882,"o":"m 339 949 l 339 475 q 475 271 339 271 q 610 475 610 271 l 610 814 l 475 949 l 882 949 l 882 475 q 475 0 882 0 q 68 475 68 0 l 68 814 l -68 949 l 339 949 m 339 1017 q 267 1047 297 1017 q 237 1119 237 1077 q 267 1191 237 1161 q 339 1221 297 1221 q 411 1191 381 1221 q 441 1119 441 1161 q 411 1047 441 1077 q 339 1017 381 1017 m 610 1017 q 538 1047 568 1017 q 509 1119 509 1077 q 538 1191 509 1161 q 610 1221 568 1221 q 682 1191 652 1221 q 712 1119 712 1161 q 682 1047 712 1077 q 610 1017 652 1017 z "},"ý":{"ha":832,"x_min":-68,"x_max":882,"o":"m 269 441 l -68 949 l 239 949 l 405 703 l 574 949 l 882 949 l 541 441 l 541 -271 l 269 -271 l 269 441 m 499 1017 l 296 1017 l 363 1221 l 567 1221 l 499 1017 z "},"þ":{"ha":872,"x_min":73,"x_max":887,"o":"m 345 916 l 548 916 q 887 543 887 916 q 548 170 887 170 l 345 170 l 345 0 l 73 0 l 73 1051 l 345 1051 l 345 916 m 345 441 l 548 441 q 616 543 616 441 q 548 644 616 644 l 345 644 l 345 441 z "},"ÿ":{"ha":832,"x_min":-68,"x_max":882,"o":"m 269 441 l -68 949 l 239 949 l 405 703 l 574 949 l 882 949 l 541 441 l 541 -271 l 269 -271 l 269 441 m 271 1017 q 199 1047 229 1017 q 170 1119 170 1077 q 199 1191 170 1161 q 271 1221 229 1221 q 343 1191 313 1221 q 373 1119 373 1161 q 343 1047 373 1077 q 271 1017 313 1017 m 543 1017 q 471 1047 500 1017 q 441 1119 441 1077 q 471 1191 441 1161 q 543 1221 500 1221 q 614 1191 585 1221 q 644 1119 644 1161 q 614 1047 644 1077 q 543 1017 585 1017 z "},"Œ":{"ha":1424,"x_min":0,"x_max":1356,"o":"m 618 331 q 648 361 618 331 q 678 475 678 391 q 618 618 678 559 q 475 678 559 678 q 331 618 391 678 q 271 475 271 559 q 331 331 271 391 q 475 271 391 271 q 618 331 559 271 m 1017 610 l 1356 610 l 1356 339 l 1017 339 l 1017 610 m 678 44 q 475 0 586 0 q 139 139 278 0 q 0 475 0 278 q 139 810 0 671 q 475 949 278 949 q 678 905 586 949 l 678 949 l 1356 949 l 1356 678 l 950 678 l 950 271 l 1356 271 l 1356 0 l 678 0 l 678 44 z "},"œ":{"ha":1424,"x_min":0,"x_max":1356,"o":"m 618 331 q 648 361 618 331 q 678 475 678 391 q 618 618 678 559 q 475 678 559 678 q 331 618 391 678 q 271 475 271 559 q 331 331 271 391 q 475 271 391 271 q 618 331 559 271 m 1017 610 l 1356 610 l 1356 339 l 1017 339 l 1017 610 m 678 44 q 475 0 586 0 q 139 139 278 0 q 0 475 0 278 q 139 810 0 671 q 475 949 278 949 q 678 905 586 949 l 678 949 l 1356 949 l 1356 678 l 950 678 l 950 271 l 1356 271 l 1356 0 l 678 0 l 678 44 z "},"ɶ":{"ha":1424,"x_min":0,"x_max":1356,"o":"m 618 331 q 648 361 618 331 q 678 475 678 391 q 618 618 678 559 q 475 678 559 678 q 331 618 391 678 q 271 475 271 559 q 331 331 271 391 q 475 271 391 271 q 618 331 559 271 m 1017 610 l 1356 610 l 1356 339 l 1017 339 l 1017 610 m 678 44 q 475 0 586 0 q 139 139 278 0 q 0 475 0 278 q 139 810 0 671 q 475 949 278 949 q 678 905 586 949 l 678 949 l 1356 949 l 1356 678 l 950 678 l 950 271 l 1356 271 l 1356 0 l 678 0 l 678 44 z "},"ˆ":{"ha":746,"x_min":34,"x_max":712,"o":"m 576 1356 l 712 1017 l 441 1017 l 373 1187 l 305 1017 l 34 1017 l 170 1356 l 576 1356 z "},"ˇ":{"ha":746,"x_min":34,"x_max":712,"o":"m 373 1187 l 441 1356 l 712 1356 l 576 1017 l 170 1017 l 34 1356 l 305 1356 l 373 1187 z "},"ˉ":{"ha":610,"x_min":34,"x_max":576,"o":"m 576 1289 l 576 1017 l 34 1017 l 34 1289 l 576 1289 z "},"˙":{"ha":339,"x_min":34,"x_max":305,"o":"m 305 1017 l 34 1017 l 34 1289 l 305 1289 l 305 1017 z "},"˜":{"ha":746,"x_min":68,"x_max":610,"o":"m 68 1013 l 68 1234 q 217 1261 149 1261 q 339 1234 285 1261 q 418 1215 376 1215 q 610 1289 502 1215 l 610 1068 q 418 995 502 995 q 339 1013 376 995 q 217 1040 285 1040 q 68 1013 149 1040 z "},"˝":{"ha":845,"x_min":34,"x_max":811,"o":"m 305 610 l 34 610 l 170 949 l 441 949 l 305 610 m 675 610 l 404 610 l 540 949 l 811 949 l 675 610 z "},"̀":{"ha":475,"x_min":136,"x_max":407,"o":"m 203 1017 l 136 1221 l 339 1221 l 407 1017 l 203 1017 z "},"́":{"ha":475,"x_min":136,"x_max":407,"o":"m 339 1017 l 136 1017 l 203 1221 l 407 1221 l 339 1017 z "},"̂":{"ha":610,"x_min":0,"x_max":543,"o":"m 271 1289 l 543 1017 l 339 1017 l 271 1085 l 203 1017 l 0 1017 l 271 1289 z "},"̃":{"ha":746,"x_min":68,"x_max":610,"o":"m 68 1013 l 68 1234 q 217 1261 149 1261 q 339 1234 285 1261 q 418 1215 376 1215 q 610 1289 502 1215 l 610 1068 q 418 995 502 995 q 339 1013 376 995 q 217 1040 285 1040 q 68 1013 149 1040 z "},"̄":{"ha":610,"x_min":34,"x_max":576,"o":"m 576 1289 l 576 1017 l 34 1017 l 34 1289 l 576 1289 z "},"̅":{"ha":610,"x_min":34,"x_max":576,"o":"m 576 1289 l 576 1017 l 34 1017 l 34 1289 l 576 1289 z "},"̆":{"ha":610,"x_min":34,"x_max":576,"o":"m 543 1289 l 576 1017 q 305 983 441 983 q 34 1017 170 983 l 68 1289 q 305 1255 186 1255 q 543 1289 424 1255 z "},"̇":{"ha":339,"x_min":34,"x_max":305,"o":"m 305 1017 l 34 1017 l 34 1289 l 305 1289 l 305 1017 z "},"̈":{"ha":678,"x_min":34,"x_max":644,"o":"m 305 1017 l 34 1017 l 34 1289 l 305 1289 l 305 1017 m 644 1017 l 373 1017 l 373 1289 l 644 1289 l 644 1017 z "},"̉":{"ha":358,"x_min":34,"x_max":324,"o":"m 237 1221 q 170 1289 237 1289 q 102 1187 102 1289 l 34 1187 q 186 1356 34 1356 q 324 1246 324 1356 q 315 1160 324 1234 q 203 1017 305 1085 l 136 1017 q 237 1221 237 1153 z "},"̊":{"ha":373,"x_min":34,"x_max":339,"o":"m 186 1017 q 79 1060 123 1017 q 34 1162 34 1103 q 79 1265 34 1223 q 186 1308 123 1308 q 294 1265 250 1308 q 339 1162 339 1223 q 294 1060 339 1103 q 186 1017 250 1017 m 186 1085 q 247 1110 222 1085 q 271 1170 271 1135 q 247 1230 271 1205 q 186 1255 222 1255 q 126 1230 151 1255 q 102 1170 102 1205 q 126 1110 102 1135 q 186 1085 151 1085 z "},"̋":{"ha":845,"x_min":34,"x_max":811,"o":"m 305 1017 l 34 1017 l 170 1356 l 441 1356 l 305 1017 m 675 1017 l 404 1017 l 540 1356 l 811 1356 l 675 1017 z "},"̌":{"ha":746,"x_min":34,"x_max":712,"o":"m 373 1187 l 441 1356 l 712 1356 l 576 1017 l 170 1017 l 34 1356 l 305 1356 l 373 1187 z "},"̧":{"ha":305,"x_min":34,"x_max":271,"o":"m 68 -102 l 68 34 l 136 34 l 136 -34 q 271 -136 271 -34 q 136 -237 271 -237 l 34 -237 l 34 -170 l 102 -170 q 186 -153 170 -170 q 195 -136 195 -144 q 182 -114 195 -127 q 68 -102 170 -102 z "},"؉":{"ha":1289,"x_min":34,"x_max":1255,"o":"m 916 949 l 340 0 l 34 0 l 612 949 l 916 949 m 305 610 l 34 610 l 34 882 l 305 882 l 305 610 m 916 68 l 644 68 l 644 339 l 916 339 l 916 68 m 1255 68 l 983 68 l 983 339 l 1255 339 l 1255 68 z "},"–":{"ha":814,"x_min":68,"x_max":746,"o":"m 746 610 l 746 339 l 68 339 l 68 610 l 746 610 z "},"—":{"ha":1424,"x_min":68,"x_max":1356,"o":"m 1356 610 l 1356 339 l 68 339 l 68 610 l 1356 610 z "},"‘":{"ha":339,"x_min":34,"x_max":305,"o":"m 305 949 l 271 543 l 68 543 l 34 949 l 305 949 z "},"’":{"ha":339,"x_min":34,"x_max":305,"o":"m 305 949 l 271 543 l 68 543 l 34 949 l 305 949 z "},"‚":{"ha":339,"x_min":34,"x_max":305,"o":"m 305 136 l 305 -271 l 34 -271 l 34 136 l 305 136 z "},"“":{"ha":678,"x_min":34,"x_max":644,"o":"m 305 949 l 271 543 l 68 543 l 34 949 l 305 949 m 644 949 l 610 543 l 407 543 l 373 949 l 644 949 z "},"”":{"ha":678,"x_min":34,"x_max":644,"o":"m 305 949 l 271 543 l 68 543 l 34 949 l 305 949 m 644 949 l 610 543 l 407 543 l 373 949 l 644 949 z "},"„":{"ha":678,"x_min":34,"x_max":644,"o":"m 305 136 l 305 -271 l 34 -271 l 34 136 l 305 136 m 644 136 l 644 -271 l 373 -271 l 373 136 l 644 136 z "},"•":{"ha":339,"x_min":34,"x_max":305,"o":"m 170 339 q 74 379 113 339 q 34 475 34 418 q 74 571 34 531 q 170 610 113 610 q 266 571 226 610 q 305 475 305 531 q 266 379 305 418 q 170 339 226 339 z "},"…":{"ha":1153,"x_min":34,"x_max":1119,"o":"m 305 0 l 34 0 l 34 271 l 305 271 l 305 0 m 712 0 l 441 0 l 441 271 l 712 271 l 712 0 m 1119 0 l 848 0 l 848 271 l 1119 271 l 1119 0 z "},"‹":{"ha":882,"x_min":68,"x_max":814,"o":"m 68 610 l 814 949 l 814 678 l 339 475 l 814 271 l 814 0 l 68 339 l 68 610 z "},"›":{"ha":882,"x_min":68,"x_max":814,"o":"m 814 339 l 68 0 l 68 271 l 543 475 l 68 678 l 68 949 l 814 610 l 814 339 z "},"€":{"ha":968,"x_min":-68,"x_max":968,"o":"m 77 575 q 207 810 104 708 q 475 945 321 925 q 543 951 509 951 q 610 945 576 951 q 878 810 764 925 q 968 689 935 754 l 726 564 q 686 618 711 593 q 543 678 627 678 q 399 618 458 678 q 365 575 378 598 l 610 575 l 610 507 l 341 507 q 339 475 339 492 q 342 439 339 456 l 610 439 l 610 372 l 367 372 q 399 331 380 350 q 543 271 458 271 q 686 331 627 271 q 715 367 703 348 l 945 221 q 878 139 917 178 q 610 4 764 24 q 543 0 576 0 q 475 4 509 0 q 207 139 321 24 q 78 372 106 240 l -68 372 l -68 439 l 69 439 q 68 475 68 457 q 68 507 68 491 l -68 507 l -68 575 l 77 575 z "},"™":{"ha":796,"x_min":34,"x_max":762,"o":"m 239 853 l 239 610 l 142 610 l 142 853 l 34 853 l 34 950 l 349 950 l 349 853 l 239 853 m 762 950 l 762 610 l 665 610 l 665 772 l 616 610 l 519 610 l 471 772 l 471 610 l 374 610 l 374 950 l 495 950 l 568 756 l 641 950 l 762 950 z "},"−":{"ha":746,"x_min":34,"x_max":712,"o":"m 712 610 l 712 339 l 34 339 l 34 610 l 712 610 z "}},"familyName":"Maximum Voltage","ascender":1424,"descender":-271,"underlinePosition":-147,"underlineThickness":102,"boundingBox":{"yMin":-271,"xMin":-197,"yMax":1424,"xMax":1492},"resolution":1000,"original_font_information":{"format":0,"copyright":"Typeface © Darrell Flood. 2024. All Rights Reserved","fontFamily":"Maximum Voltage","fontSubfamily":"Regular","uniqueID":"Maximum Voltage:Version 1.00","fullName":"Maximum Voltage","version":"Version 1.00;June 23, 2024;FontCreator 12.0.0.2567 64-bit","postScriptName":"MaximumVoltage","description":"This font was created using FontCreator 12 from High-Logic.com"},"cssFontWeight":"normal","cssFontStyle":"normal"} \ No newline at end of file diff --git a/air-quality-ui/public/gebco_08_rev_elev_2k_HQ.jpg b/air-quality-ui/public/gebco_08_rev_elev_2k_HQ.jpg deleted file mode 100644 index 5d491bb1dd019a838dfc4061c0049226c61a29e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 290299 zcmeFZ2Ut_t)-W6$8zL&b7wJ6|se+735imr$)C@vsA(YT-W>7(?10f(aO7BSTFo1$| zA@q)b7@B~glkgp!a%b-QzW2NT^WEovzUTjECpl-GUDn=v?Y-7sYwdkR+N%Zl#&F2zI%1% zS8OLIAkeF`zrxpnVz0jY6~1(e2M8zglq&Wf957DVSaJCvot)hjeU!PsAy)+8(`Ya^*S9Pl2xaa^kcV9NTu^W>8F3kL z32vY?%EnevPgVW5vcQuv_iv5#_VyO{mKJwG*?}b$6coS`QeY`5F(8MSyRWl{m5-RS zJJ0VJRN?N{CSAIab7@OvSk zSO0zX-wF1oj1b7b&Wc2yQsG-$+&$F1fTsPck#INgb%lfV;O;J-C~LTy7u?x{hnwq< zRw~|eadJUHTx{UV+>(Ee*SvS{AXOf77q@skxZ&`t1v$689`rlcicB zgPa_=zV%np%KCI{l(}6|E;gRla2xL5;@w?rJ-n?@@H=)uCzZMH*xEWcJ9zkV0R!q_ z=L|=2Ns3EKhy%U+6^*w&96<6vw;l}C3qG9yzcvB<&#n8G_NU46dv;(3o`Qc&<=b3; zhrcQCHwFHtz~2=3n*x7R;QxOV_=hqKcLp?IZ$Q;OSqF(e{9Tjek`|W$$=}t4oa6hZ zU0)w!j~I^zm7OE}Nbz!Q|8CI9$L|^dg$(vk52~*DKn<`I0A0P%$r|Z?7SPUJQ64A_ zy*nn4OiZ~h_Jb~bQ`G@PR@UyWcOE``aEjB}#Tot$_dhNGj@^-O1_1~!c8cpCN&gmf z-WsSF$oUKKld=JnX5dZ)eowtUT!HvAJ^)Pj81W5`IE4`gdiQ|%S0K>YD;{v4)3Ts@ zF0Q^P2RnNYu2a37>&~eq!KLr(?g2--b7?wTyP#ZMP=K0g1LXa!j?-dPe^yCPBTfSq zNEPG)@&IvxG(c7$2f*&(0!e`+K)(|8*F68H*Haq*isK)&`$ybAuv>egyncNG$P5Bq z2bv-Q`X2NUXc!vw3iJ-Nc82kc>KV^7xo2k1GMv>r`}5fk-_d?&^4;t2*3K!Mdwy=> zy!iQN=VvY`T!_E0d(rq}{Uz>8VV8&$RumsD-?>~tDMb0|3dTWC}G7m-*|xR|0iwfGA7t;8$IKq+%+<(r%` z-^mbUKgiX}XDa-x7<3D%WT~usTTSKG_tJMn@ABW{R^?LTROiy*xi6q8rgc+W>464B zU*`v?%R{toj9!+0oxy-1!T9VW4iiPwM`k|ei53l(b3a_L5_@c9{i97GeBADmy}W~i zV=7_*dC^(L#mBYGZNpu}!_hO}Yt0Aj>)}@ya3)YI2#cQoNjx~q|!~WO-k->LER>S1c zlyRkr=_&LK&+Pko=LLqv=1&fv=?E>WF6*2dA2x%xWxlTLyxKE9xPI7m{EU3(E&|~iB_+ib>T5JK)Yqt~X&KlUY3W$#si~Q6FtM<+ zb8>RhGIH~BbMUfpaB`gd0;0Th37AM{&QOC+-h$Ww&ixMX7@UfN-@=)*-<<}kCqS`d&*eU9eFdC5Dpx>nq77wDvZin;rmN3XQyBK_k5Y1I5C z1Mj`y*e!j&o0nAGpQJNdV`L0G;>u1YK$lJ{Q2~*qey{28``;A!n*x7R;BN~2O@aUK zQ{dcs!U1fP&2%G)6mm8KXWu;cqsd*D3f>ctRTXS0AmBPC5CdO;44N21N=i+P<;l4f z>YU|FL2v&=8i8wLyt6jr_QN)5JQQ;4!6%^jA>Z_V^6<0l+P&~-vNL5P{fdIWz8WsDbz7vf0J>SZ|gg z*1{|_9=OjM%HHFk%ZT3LX8f%0R;`+1{Bi+&l%x#(-f%rF>h1AIKFgffYm-Jvk|&^E zGpD6kf>gX?v42BuOY@ExOKw2h9jB%pX;Y$PJ zI4g5|2^Ama2{K~MN;mB*>eSfCdOgklJSQM`)|(C;gn?d_7XsvE@Zvf$OLcVmXQFBJ z^%D@PIj)&%%|~57;?)*kh{2zT`F|mJE_1S#uNBc?N($+;zGZp)o%X1C_7!Xtd5hv;qml{1f~4*n+aQ~Hrh{{0zcmhsHV z;MT7f!uwxW)evX=8)pww{h)0}tE7hra%SYxzGm0ecg2y9wm8XzrPT`4R35_)T`_e_ znz1A@N(Xn(scfwr%F0MwTAWa%EKVCAKTkjYj>r2$ZW(3Zy8m{qMExeo?Ng|b$_wVn z!5uf~8fDkL8x2L-lI~>>$JL`Hh|1;=jcCwgH5kINS|kY7Wb5w!4kV0t{ic5kOZtns$^ z_Nx9h--+G}Wr=xy@fHjRlhZ635TaOuaRNzpq}4B1n>s^NX4f1;WjkqTTEw4Lainrl z^)sOwB4Z}h8}^SEuveCj(=pkQpC#>PVbPi*RO*y99Eqz z?SS8O`qrH#YSZ@G%|rP=Y_rP98W-cgC4iH`X?z#SC&5eL^NXr zs@qSuAph?S=U+2JK8lD|XWZNp)!2AHRvv0|uV_CGzAJXwELOkA`pXk^x9$mOwq{Q@ zD*FEX321?~zo}i#PrkK(WSKJnT`qTAZqnwnH%^PZjnP{mwq`d@BLpC(&KYL?IrpNm zmE4=<#v-z0(_*Fkfyz`xzhN?Wgr$6sUdIWj%;wNLi=I`aY2+LmO) z*t@lDcs5>*YpE>OZ%>T^v+Bt}HaVnOD`K`w-FuZtukGnx%t?CDi~cD1E|6hpYk^6A z_GA8t0RefGn;qqkro9W>_nabsXz8_s4arW~r(jM%Qf(SCsV@36b;}n4u4mRR*-}TecBq9?pis^i46~y%rtetFz^Q!4 zy!Hf?>qou5(y=e_AScRTSs@O5Mo)p#GZ-)$f@lR;G#Lq>84bOXaZ+8bI1iooi6dv>x5*sYm zw64>{7Tj@~eCL|b#233tzZI1a85DrM?&$hK)Jn9Av*NFB=tPYQ2h z;Zjh$sefLbf9BdVT+lM~wMFbl-BRD4S~c+xgp@Z+g3Z-ODJP)q^>P!FCqb6XvY#t9 z(GM!=n*;bGvW$u;k8cevEUYYce`V;9Y?8uN%eMrI=hrM*T+>&s=05>Vtz~;!fKNaS zd3=-9?K)$Gd4wh({Rv15y?4u=;Ep&Jae^FmrWz0}tVu?lCC6){b*WGYY1v700=jlDbVd92;t8lzBUKq zVRnKNs=st5f4JLB#-P#Ud2PWGKuZ}3Eb9rRQ2LZqU@71El<0;wT{;rvxsT6zhW@B4 zq!Iz%l^BA(8U%>msRcREH<2pPKZqZ}-F?&C?@YykF_R+>WJQ1BhkJ$VU#dp#+(F|R zdaUu4X6}%9r6V`;r%I1$V~(oycUx@b`O4B-@pc8nb{lplATYk6GH*!c1Z42W&K3i? zik5zS0@`{039IY!xoNBrh<~1{r9$=^ow4t7i{g-x#%w(ue-ioS&-ntk67G zVV~^dnilj9!1jgt1a#g`XE?Peum_M{IusEC;sZ|j?a_r>Ds|GXNne=J=WdRAy#Kc( z+sncO?F}8qgVD{dAJ4!kZodyn@;UW#{=XE?2+57xBv1&1GMJ2t)e;vInu8JfkgpfM zuJyvR9PDUerTv064L1iKA~?EbOR7v7xNs*RsEU1+Oy};L5p`NpdQw0 z4*Lm1CWxtp@EuQe%Ykf_6>A~;!q}Z+Y@Sz}HtA}vV?`&Qd7oyD%ghvMq9_wDxf&!Zn9HE90H76iyr!3Q3(?!tF zVdNZ|k_Xc`wY2p0r*BMquVz&GnW=o$S_2cM3pDb={8wKe7k0)US6IZjS3`}vb8s6* zeu1K_*rZM+|GSc~&bC}rzWNhTGG=#D^aPZBRnsgz#OuRa(E8@%9cskou+ed9R=bo| zpw8V|xtttCB@{RbaT|6CcL3i?el{2>wblF-P^#0FDRl)u$$gkDi@~O{!YIP#Z{+X%gIv*gwY0FAzBXI{eFcg#Gx3Q*sDJ(6}e&yR<)0BK`uW@^VJ4qyM zGmkAa>4oO!$|^t^(UP$2!4595DL^y>7~Ip^LrG|c_@zmr|urfn^tvwHn8(b(ez!_H!^ z$$e|*;T^z`4WhiGK#m`6T`a8532FAG)7{)0MAx1x))t;Uczptzq(@w(1@tbf?)eiHm0@h)1Ju+3!AihuL zVZvJsY|ZyDEeY@Y1TpQUG@FSLsxKXQ3>hk5=bGt1K9zmXK09<<+^mf;@IGBEz+f0L27t*Rju9F+p>dCFD*%B zzEhjSSG{t@llDo^C-?`5EXa&F{5G2zIbkEDO^=M$U^0e!{cMx z1Hop(y={qIwfL~x@5=@{#u-dy)+`kb9M~m2@2U+`j+MP;FerK4gm8W+V zUKLywUKL&uB&b92)@@fZ)ooWprsB?CupQro z{R!xS+pf~I1+C_M<(@`zpqB>DNP8`cHAirZWpOl3Ww)!%*oKjOMSlGys@Y3>Xr&}z znq~A2F@ujRp03~DIh>sVF@-px52D6kkU%VqRH|JUsT+=<*nf-iT{SKmn##EL`u2di z%}(AROnA?NO4;&jocRRV1RFnWUZr1xEw>~fVPi!T-6A1`)tlQv1EJ&`s>5ExFUNca z`sB)%ut6fIsN!wxHzuyh($e| zzx+~F(>p$jcOM@jc6qLi|6HFiHrPE^e1Ws{7MyH+OdTRYdJb$p%m40`qe%%UBrjn? zd_&MEeZ7w|ErH`EYB_x>u{)zLt0uJ9V~ZuBi7Into*fl%iM25Fz9g)k+i1ChtNAhD zfuWGy3|GvKHx(KG8jJdR_!5O7XODJDx|C^))<=$gV&cB_X}6YZb!@*(VP8acX{P4{ z#CzwRwv>rFxss{lHEt@@Q%ByA?}#q4PbFJY9ffQt`%vae0-sMyUnV(a=E%)Juz&68 zna0b2CGdRmR{n8V`{Tr63VRxogxZqr3qVl_aW}J#HJMnI{}Sm!Tq7lR%GWd~1@+|q z6~lk(Ny{g&>_JsEF*__+A5rSKi#A1f4xGidV6$RCjqXlOX%trDsZ8}I&>egtqZ}wK% zD@dke?}QIM@%#5zPe3W2=byo}<7hXQo_c5$>`;jMNk7`agaQ7`YR}cr&U*NdupMZ; zHSFVLj>4ToU0sq{l3L;M9rL-Z+^4*xY}f80N0vCpssir%TBU^}HZM=s;-uaQo1?ro zrJz=2v)qSo4kPu$1D7s7!I_MBh9`CdOh`cQDX4tHj)%&x?`iS758LBzr+p%Q+$Vq1 zA2B4+b*RX6oPhM>Cv)sp5WAYpKT<$);wFx0SD*^BqNMIdwO*@9@M5N&%mnm6_VswZ zutLx}`>@~kX2P0>aZXD8;tb2V8P~6SiuoVhLY9tG>4{yFOLBX578bW(7K_~f91_;N zog{WnIb7^qV7SKJgeUh2l5>NKFyKC0nrR=@UYeDpp6vkmF%e*vULF%qUAS=zTvs@~ zt0dSEb{-3SRr5QE9XXq_7thL4zbW|1_$=Gy8hSV3kGkoRbg@F*v9@})sF=9yh^(9N zThvcKMfrPmhs5;4C4#7*5;u3%83+hO>GFz4o>GfdiaV-^_LoTY?VQ7rB&3E`SK{317LSE&KJH9cp(7R4IhUfXvlSb~bSEv`5tCxz z9qDI>LXfT%0ob?=v}*<9hu zeAosvV&HLHIn;&$PQkY^a%B*iS?ff|xfhsM$;P(<_hc|U9Np|3#IN={2Bal@E-Pbx zI%q3L95du_K5UGYXV>#Obk)(@ZKqTk+MP6S8V6H;4)0&W148$?0o~&*8dkz4ShAuOjB- zi$80GW*l@70%n_a{H?4?*Aj_ool-a=# zs`e@^m}C~fQZCcG+Zb9Cz*HalnKQTw#Pu@;s(Ny%U%@y*3VxmX}?1Qdh5S1KR z+L{&~w1&1_LK)=k9d4$7M^EKHt~dH93h6;e*FJ_K*$LS9q zRvfg3_AEuOB`cAfV^@q;J(KL4l>jsTb?;T&kc`9O!?K4RG^kc|w`79GC_bgV#;yr@ z0xDN1`LJ?e@+{eZ4HbXoMoyDZbN4JxjNk4tpl3fX(gQqf9V)z_QcBN^Teqo~1W`<@cm-qAKqo%u^By#DDc}d9{pURI7n8jFNf zS3@|~W=#OkdZFcw{PmB9Z$oK{`OLLy;!fqt+rImmF`7IIs$II$aVBx;*7D3c7igbI zraHB{+Dbjy10s_nB9@JeZBVc*=%Eg4g^Xsy;$pex<=J=(M`gizLoL|BWoWJ)A&#ed zo;s*5(XgzJVa*!c(k6=|3S#+?9SWWQG;hHaI4oQc5CcJwM$I=6Xj&ZKV*{jC& znrT>L2hk@_@YNURGjN7kgS~={1Hmw@)<>lGc$lG-ZshpnM+cP5VdG6qBz9hVdRZX( zz?h<5u+kYSsq4aNJxZ{+vkdU#K&mxmW^YA}E0hop?QI_h>-9fhIsqxA z8C7ctwS07G2ApA2@-v~-pIp4hS_p-Zt&Tbo!X$?^bIDj{mJ&(FO66o4q=WJ>to<(#(!_^77+Mz58+X>6J1He4dzz1h!NeGc^}#Bp>N*<>mG`p6$t7 zH}cYxn%~CRPJ9$f*-Wmi?V?g^&fh^xAgk4s{YOVztbKwLdDQP1Aa|(KOzh=Z;_Tc=;|t2W9!Sr8{@XKFM+T z%3e=ay})HZ0p%UMYWXDnwx#L8F#DUhxl)o$u}bao%3=Akti_%uznjT0UD|MN!UJRqt=6S3B+IJQ>D&JagPS>RB(@T$}PC;%3yE z_q`^_xrcyJp-C)wd=LQ}j}O(Xf)a|zYbyn>Ck~K2`Atucdx5dvAu@S8Yp7Y!hOT10OSQAH2~n4!I04~fZ?|iyMul#2-4q`$Tr-Wt?j| zP>!0%89!}*jks!53T(q_Qs?F@EP@%tc`gDLf zjSl2M>BtEi+XZVCyEJXB-84gkX}?<2Vfc)(s(HMb$juU{zHBqH+hl47kzIKmq1Lh9 zf0QaUx)IfF$yvWZ>Z5{mGliqHkIOn+zf|rftHEuS4l~F7%vlfj$UWo34{C|)whSXf zO)oXUXxiQ)Fl6Xp${nBAeEJJR`zkCP2Ng zLVmj*qGDq7Jt##A1g3iV7IU;XC^ITP*s)>MWnko;ZB$!xyF=AeGAwYa$&90cZ@R&s z`c{@5eW8CtvV%juibYvB|74($fW9+j9TYS3nPdlHdZ(ou{K|w)SK=&Di0dEXNZ)<4o_2dlPFrE>>z7zo za=38VVD}4VADQ9n$?nW}OY##Kw_#sbR2E?v-!0OIUW=L5 z&;`>m1fF7y_1WJ>|=a*#3}3Z-*T`Mssl^pCFyiAZ_2xUus|1 z0hlXi)F>C#j3^WdeWJwF+3D~rS%j1tO3QC$@kdPn@&pw;G4KUX9zG) z@p<#hr*4Wl-Cr_((l{G+p3g+n$WFLt$qevIsO#nMqcY~YJiyk>4hu`n-B3DfxP;{u zK2wXBXZeyExZFyOE_tW2Yh4Q9IHd;i^7-A&uS~Ki!Ew*dUL{$Cr{|q{V_fYMPk}?e z=$bftw;m^lqnkF+bN@V#DDUcp_n0)TdKHz1z+NW%`4w=LGcS}vVR*VyQrN`2fx9U5%hab-VwZf>=VR%}hN}1HvJzVGX2n7-mCa8l!M52& zH9C4|A!fW_x45CL$oo1)k8;NTGP_$}0EPPB3}=MJc2#qw0u=%-nvVt-{l|Qiab=uW zUe51ZW!?+7cn`GY+}w}ARfn?_cxBjR8*$knVYNji9!Zjd(0laybQ+t-t{G<6|9r-$ z6$N`>rYhg5jd%nnQPO!U@gj2ubUtrH)a;2-vGIwDumaw5`&UUi>&@;%cn_p9cB9<* z94P{hCpz}rdKJ5X?dG0Ie(lyH_9SrTfe}uPDGQr0UaY0&kg~**o;})pK~}xmmUkG< z>Q9PT9~^$Uj%ri1C%lgtfnFiKY~BH06&>wK`CB)4KkJ`>Xmx;1Yj~Wc zH-UF|R87;rOF$=;NT_5U&}!Yt96d@k037f`rK@YvWeJpfb{Z$3Cvj{%Lo!lm;@Irr zr2*BXXABk!M@_&+r1wC|Qf=2QoY$-XM41zCj#H~lZRF(SW+lE0TDCCN%IL{CX2%NO zn7BV9r_Z?pW;e8CuJC-=;Q?LdYR+RYeSZ{hTDf83m{9APXSuYHYxyar(LYK33+DcW z11lAe^!@h@HVzCHQlINYV{BgNil&>WA_ZJpST78Ivxu((OjL8qM25edn#WP+*)Ge| zdB$PYEZ`RC^L)lF8rsrWX6g6@ej^8?tNu5~*OKKc>HHwK=wj_Ilnh{z?ee640eu6c zLznJTW4KwzS4{VcZhG^86Gpqc|Byqpl4c5zfm<9UK}$#3Arc`1S6TMqmUR;7`7Vgc zRiT$qqqT&Qn*F&9EY;S9uXB|nx`Lv{bmXf)0CVau;e3XW2C*tKcf>-U1SxS!F7k|5 z(sBzsfW$|ZnfT9xj~mJp4BboTm-i(AoAXpI|E2gJ4`6~x#9AzLZl>r$`a3LJ;JZ53 z0@5ROSwlf@=|3|44rtwPU{sFDv=;cp?UuBLk&0iNU*^qU<_=^QU*|5SKe z^Z(KPtWO8Zy1T`8NmbKB1dr#~4 z_%w@Iw0A`pn0@$VvKCZOyxbK4PogOaU<>nS-#YVlrw(yVY>dA@B{7 z%$7c79sP9Emc(1D58ZgKR}2PTlQGdCkW2LZo8D@TcUpA|RvPzJ48g91I!(o4+AQDJ zuOnE)jq~d&pLdda?S{ltym~ia{M1cukDfRLG{jIAKCM=NwsP7a-J)(t3H4+)Er`wKF@4oX}%=!=plJ zfgyJEzMtRZo*sHnylyEbls*e=qpCQQk7~E3-|jpCrJ2S{i!L{5X_O!gM#S8ralEsm zJ5id$)(~Ixu5cZ>*$ZxKTsAkM@_a{^BuTb}Fn&a8YwD=94CfrHCmp6>4isT1n;pV2RmEBLhf#GqwXodJB}R>XNjut8gc4m$dcFR($6dtK1nq%r#6Tf0f|=)j z*_Le#{9||eDZdIa{4yc?^GEeTw)+5w-UImabj_=w`?ltVni!j0Z4PcqXfcMi7#p`- z&D1k2u@+JTUsNuAG%p>h3;!8vjjnA&9ww4h?pbaqrCF9K#?9`h_;f8CW%N|NXfjXU zpLpZCa#O!N!g{R~6BfuXh16U>SX>_QAc@CU$_aJKMR<|-6&Q8OkX^Edmzp}ql7$Y0 zmRVN-zqyn|9Tvus$xDj4ui37p&1|{KJGKDM6P25$`>%WexImOn|KH)i3l-KvN`lo# ztQs1*364w0j0rl!U^2!=<4!)BB#XG3=ud)hixTifVt5lfwNw>tb|u~-=l+%DCrO76 zVP-ZM7=P6&k8lP9zO{w(>n$F-^d7O1N$bO8w0oL++)>%9Ki5ecBHKM4Z#XvMr9_W7 zcUI4(jMd~^)LCe|w%E+uqSZc1b=fBO$xU|op+FQZC|_s1uGyNrT1&F*CMNTg~a$7%vq#UFRNrJ1hq@&BT};@P8Y|2gtJ}^ zc4rFzCo23S-+u#rSE>*+Z{5|2Ty>_?6PZrBo0DdZn;O2WiJmVZk2MIF!SLomUjSFE zAF)(h)`^s8Hj@U}anIJajgJ{aO_LAWDdLP1HG@7GwOBXcHc)+HQZ!CwPjSI)a2hMQ z6sfUrU$IJ=h;vKyEt>rzRDdHF89-j#uw=OX_Aq)ZvUjf~Q#y(e7!#o6EmhexE)6Ps z08 zNnom#b*5EsV(CYdRw1N*juTMp#M8L4kF(F%QsjurYEYM<*)DBT|Lt|<3Y7wi5?gB_ z1*NLVKe-gnlC#1q7MprzioEhUvqw8RSM3$!vmcs$3ENjrl`Wk|zo;SF58EBaOzY$< zt`+ESdm5rUhb?9W)Vz{g@%E396iMysr7?vjnI=AEgaow#8xw9<*_et@8n*j@^>z=i z-HLhTudnV4ukZ}2DmGp647d*LoZT4F9npKJj`}HL&Ps8#v=gb|tE*0vm4n+=a2d=~ zsz^R!i~n5SK77o!O&D1A7=qq1dzE4>0L!~A@8G56N342Rw2^08-#%8WbgWcDlt{~$ z7?vN;tfD4Y-$Rj&gTd7r!jmBx(Zc%6Yuo*_y15Z4uP;)iP3kaTjVYGPIA!Y#h& z09M0n_l}|X0ISprkIxNu@dLBB6VgkdY?aNO5_o&ZV5IoDN*2XY`jUDRNt|JJ4T&07 z`eaoKJ=o{3m^JuOiAmcm*9A~s619%9W;*HJF<*d#VW?Msp3HH{o3h_Y;1 z0Ic)%8RowI;?Z^_Lt4#V^d7h2C*2l^)bJUKZ_hBKUmC2akhbr_w!+k#NXcH z?OIyqt*wIQZbe<*NT@$;K-|Q(i3u20hDku3fy^My( zbhy`Tyjsf{EZju|O zP&o9?+m?2y-6Au>sdC>TWyFz1!f%+d|8c*5W_>u%1u|45Pd!oYv!SK2=lOUa#pec# z$#KN$9Ab_P8+lA}nDFH(pU93GW~p619Ni)CQ$f+Be0$Br+<`B0c^wnBe-}*93*WWx zcPfkLFrm6RfuQ<#mjF|0RIH}l5xXDqmXYnlG=DN?IGvt1OLz@B-Em=c2X$mc9Lo%uB$3IWUGjO&8(N_&+E0ojdbB6)Tg8U0@ zYZegedOqlM{A?PaGy&{GlTsQQkytA?4xTF>S0S*9?s8zZH`U)ZES80Rsl-$^J$~+* z4B@XiVm6^rgID50Aktxv;wEH`^y+~kSR{p;0Irm#i7F^B=zXjEqeEYqV7|V2VM4dd z%aTQ8S8Iq0il>gI%~`O)bZr?t8#_43d3=kPym~$(H^qpy<(jT7YAMz-zb7cY#E}2M zR~p+J=k8R1{P`~(vF|=#UFh4XzWqHAEx^O`xUu_vW%YHq<*(#7%tk`8W4vj`KTK&@I@wnkL@FWQeyaNGmSEwsThHs}!rtH0y@+!%OB5r$ebF&0?U&ez<%nzIpBqv<1n#~nPvx`%a#3*#+DE}hFBwH>&%^t4(# zYAPmCMby@$&r;nqaI6!=UG%y!3S3tNCwD*%#>u##WoUTz4>VvY8Po4I8 ztXY{^nZ}e=f{UAji_4I2&qyZ;*Pu@0O^BLVS zF+;>w)y+PyZ9+S-j1~>U4D|8y%R55WD&3N(71!EB$SByGFM7H3lV_xzUYf{Imyr=} zSa9Lmo+=?n*lX4+*n1SbvLm;+H0tPp!&8Y>S~Yxq64eO#xm5dw3>h9PqxfQ0v{Mbe z^a%JDv41C=fitUI+Xu6lweu$84W*u#JcV_evwL>2fpxAYs0@u@#_V;B{rFexG|6fiqDdNY@_noV&!!hPp!n&Zm(JBoZI(w-BL@SM1)esJ z!>g34BK4r<=oa;==6podf#8mzI#TiLcCB<;Hgga6fylv&oXO~T-QH#j|7|19Wf9W- zFg+4v@r9arKd-eirqd=(p+(5L>S5c4R)6ex$5Zx5;1D&;#yHWt`>3@44JoWTmuW&uWWAkX(9Lq6 z?7H8amoRy*FTjmQ2s#}Xx3B>hD>%Gp>>F0jG+dWqPJ+;Kz}dk^HAO_mJS zNyF?I@T3Dp;Xvjn|T^49=Ib8Z`~C?3q(8)nt8mG#xN9nbi|=rF)=NL z!Aj(H$7Kn~&>y=Ur@@mTh#~T0-RXq52@G_hbfU6qSn#k8!9AK(h(Wi(bA|;SvI^?N z%{8^Kt-uk`{t=kD$3~r}thW0ng+t)eXG=sdlA6VryJVWO6?pG zRCFf&=gURigKt-M!Lhqp5hZgk%!J5!Dq|uvzDv!qD+jw%0~$7&M=>4V@z4oA6zK&t zxbtmjzfEiO8wbo}_l?rNOTIif*R75B@4NSygBH)KU$_YR5qd7Ov3+1J^(l?}!dsIqnvXKr>rwgvS#KY| zn3S8IbJA`PTEe<*jN7EwIQ*dXUZc&{2-06RSKMjGbkk7uB9u*9LBl2PF0@Hr^v%9o z8+_@W?o?(|J49xh#gK12sq$>GP;tB76Z5%OptwtXjL;~pTBSW34V)`}_oiD)L7zV} zYXMt&oaH!p!+}-&;oAj_LSK&;`IB22qSMp64lW=E4*s#i8k1g?UJG7PVY{a1@+?>^ zwKR%hDkT=#(6nqBRVNz4SKB>DAPRf!OZ5LhF?hdD%vUXqavZBnaJop>)qzDG)BF{wNJ+Q~uFJ0dBr9BS!y^ zVWHOZ#`KS_nfl(_9!KwVR*;vU44IZy z8xN>*(l}Blca+Wl&;~Wg|1g@3AATJv(XHe8_2|=sR59RP9I|N<18y+v)B7&Nd;7k? zdxlBtGL=Ery165tUwzvC_^J>%lDd4D9X~i`f{nUsDzC#c!Je0phD7kWf@Ws zdj1NT)I0?#{FL}5!e7oTfQ`1)uVL6=oAk!YLoWe;A@XAh(%moK^Yp9X1c%9LGFmQMK}qowR&wlj3SzK3A4dC(y3Trd@YGMadP<{is8} zzr|p)(>I7BILJppX_w6g?tguf8GWPkI3{7EJxE*WhZ2tYGN}s`9q-rYLU%!Y+d3C+ zpJ8HRVtbvip+oS0#xKA9q~nd|6{^fEhJy$AfpC+EusZmBdT}lIyeZ-jW1QmKR>^t&Px&OUv|^ z-z={Dh@Ps>d0`Fad>kll>?T~cInEIoShI-Jh+^S0j#|oikX_0UrWi|7dkt~$>I)pT zzTYlnwLBNC)nIq2ef?*1aUF;35!hkeO(P$~lSlpg+#PA}TlTm>Akj=HKI(qBS?!vo zUX;8LE{Ai&pb}jmpjyck#fEb4bAFHuVj1lsr`@J{Tq|I&nQqqulego=Kx2ms8(6F# z&zDTw3>NT-%N7EHyURWF)=&@?L%M%CmUFT;5+7HtJgdJJ6Xg`pE4RmAq_mMVEl*0R zl{M8i4~pMktCv)CsgjId8g!elY_o54rZ=4;mbtadL##?lCo`MxuZ2Iu7x9H8O`U*< z%1P!N?0)&#S=~EE<7nQyeo(#lguKWqfy7#wQk8%v9V$4gZq)EPzE8m#L#G+(AXbi^RlpkBR&+WI*85h5)oPax z8@(>iu1C30Qq4<0>KT!iiHPLk-irCvE%l%djuA~%5FXc*inT=nAHA5AY-{+K!urrc zZCn1z^u16~(jz6WxnvR!yPYEJUJbwutg$x5 zu1QCgDJiMO=?IzH5{QMLj}~Gmwh>C$#KMPJ2;@iq;o>0xhwIEaa*J)lX1A)*pda#Gu}!8zU=sIFYb@w_!j_$*rl9q z1V;z_mPBdv+$hQ|Ag*kAne(F9c3gtsFTWMk0lnw?28t)C-VV4n7PYu=Zd-u|JO`iq zDV6}f^g``G^#^44hSpSbZs2V*rzoWx3A+MR2NVH6e%~b^7z%#O>cl&4KQbFuz35FdPsn`EQ7qwUyfx>B zog&M6Y}hT>P}*&Z;9@-lE<`M=Ep9vF$8SB+f?(1lqifmzTL;68B7%3bmfzHjXPQ}Y z!lz4kSvLR&;Ce*;ci;cu<@*YvcF}M}< z*el)!gQHd{nTRjimv0=FqYbJmH-SH{XpG(!fBoz*3p|F)6Xo63*^9=%pP5YwYNM#E zQ{9@6O-NbH%;N3I>BK;Hg{l==C>WNg#;CHtS;2_UBn3Ul5hK263eMj|m3mpbf5X~2 z^_@SHOfcwthFBAovfY}p_Zod+b#Bw;E;kn}M!~!5(G65DEusv}ypX^!4oCD8T0G@X zKt}5O{;qsBZmo-hjRy1WW|loOET64}_?z0pEvTkYO`1EOQ_2bNsyE)is1x9fyEY59 z@ba>~8#+45LyzkpQvieZG~cWLWw*2MRDH>gOqKX}j=2cF#f`rKe3XJ2_|$1~E{knF zg436s-XlA^pe~$l3wu6f>r1RS;ZP&Rq|A~hu6gRKjDfISrKa3k+5=NWo&B!^1{`Iq z*iNH*otJWp7jZy9POOF>*g7&e@(6X{!@~N803L{BTWv%RuQoFMFS_0Xs>y6^8`e4M zh*(CX3pxTJ^xi@}qXLEqNa$TkKuQEcmo^7M6aq*R5@}(mp(CM&IuwIR1f=&GLI>$B zzpb%tGMTluFKJU7Vg3z)`KsPFOOZwf6^wh z`&uc)Y+)$dziVWFTFETkHaqFg9dlk&Wga`zy?8ph&kF(@fMTm4OX8Iq4Qj9PZ%xV~ z)VaaNrv={2=jf=7pn$(FbvDA404oO?CDYUS1rNuSC~bsSHC#q!2Nikj0Gfesw9k>1 zer)l&4L-fCea*BLUcXAwdl9-vdbu!qAv)~&`CRQc`W<#Y&2!PJQE_l@lh%Z*oH3-H4A?@`p-Nc2$;MOPmTV2Yu9|(P3B$FyGa3LI5IrxF6dBLSXj(8va9S`%**q% zT*BEmVug`abjYrEu}35xB4!vypGzB>^(I!87>m78+oC-#qRbaU3MCUs01w86+5595 zAN+Yg#~^U|Cb>sx6q%;(+WfMDoK~i``;?K)o*kWGiFEZog4w)sip_Q&i|kUXs%8E` z-;JMV<_6Vy+!zgVkcWmjxB2`0CVT5+k)cyX#Mdl2ud#yAm~FgeRWor^lv`ww%aYye zbdT?gZ-3zP&vYr}B))I!w&@<{-_koffBoqh@Cxe$-TU8E)PJ8edrQ?gB#@C_uKMu! zL-m!3jj{h?fU^p;{}&GZ*C}Svq&2l~2?u^~3BHyxY@kL*_1UV0?p^DR+HK35th?Y( zmUl#ldm{#{)IG+gi(Y@b{G?bYgOGQRJZRq4%%o9GkMWF#L;dE?Nr9j;|#FAW`{nTt(ok_s5X-QJm}pE|yFnoBE9ZD1#y)?hU4lSRfz z0L2gXL6??l7ee3am8{{`t*z=7tmdI$_Wh0T8pq<7HRtBGng0>>ut-HQUW9!X8KoP^ zQneJ|@fqL&nWS}P|MIp~7MyT|tlkTA(eh%|*oryR9qVqEt!T*f;_NLf$KP9gkB4su~UcCVg3s7E%$*{<&4~HZ+t3GeUi~c z`H6aI_0(#GyDlq1-@`&G&nNCFAroDMpM4#WYIOU6eNOy{c=R<7B{rdm)>>gNr+X>8naZA{ocpUXCMT1k<|Hsoe(1TGaRhcZ(5oE#bxp{v(@B(W>Ioeu7HtnAVX)QkvLu@wm(h(G+rS(o?>!r2$rMDp)%611&ku7~+36 zTf0*PrtKax0T&ILQ}R4<=t{%ln1{m`?@qJqO$RBKu6a5K(nj@0H8KhJ5nf4(Z)xcU z#B=j_1!STGbmt9&4yV>V+f@s2K zdLp$OH0h0Ur)3M0*Czry8k_W>Q6O<$MIUL+`;)xwE@~G`fun1*H6NcOoei5euSg5B zo);VW`xPKYrK^iNfnz^ zN{UQYQF6?;ndBFwag09Wb)TGTq(gUh4hxd(9v0xPapOm+34iXpXTn2)yCd+asx#a> zR;n_<^wog6k#;$4E5X>%jwdoAvF2ceegN3{m#aTn&4FK`k1$#P8M$|Ax!r+5ccYj~ zP5ipOkeKwn7+Y`u16U+E1*t}M9IH{0p)Ai{#k}0>(-HADux_^$9N$20BxzKmhG*}f zu|BgT$$CU7cGq}=6APxoP!4x_c_Z06k8kPI0YQZgj#H08)QNEkX>FnB`8!B?KC0lH zm!OfQlccG`bC@bH=5ZJZ0kB~(;#^U5eJVe_KwkXI%jE<$PX67G$X_m33Ii!K= z#p?Dt_!FfpHKj6>>TyY5f~vMVtT!C)!m&g)nW@ykw!pL0KuQSAm(1I)VP)d-k1IFj zqgl6{?YBOu?HtK!c5&QIx&Mm-aEWbNHb~)o{Qq9ZD|4B*^1SX_Ygo14M;IjV3SVXw zmWcvSp6h{NhxwMT!-UL3_kLeLT#U6#kYJ^0i31ZOW(XT~!RKv;h$vT!H?}#aIe;Tw zE%DGN11b94&HsUZm(_rm+mEd!E?p_A+eX9A@B3vNu{1h*CR^#hUSc1uKE+1)zar!2 zd5}&E?8h>B4|iqfh!uC5p%SZcM8$w^o&4m-I?feE6<<{DA#b%C=8%{~PSTb^GszbsLz>>RxMoQRc@>m-zM8g+Avy zj<$MvqNA#mONldG7mOBL;h6#^XX;*P7l*F-C%djP0!nf3>(tl2b_I`u*yw_FJOx&k zQT`YK!6cfeY>z~IHZHzrP`1ATHRjcdkToyY6(?j@^-EjC52uMOF1I#%FB`j>9#SYU zju_j_;By8>qRTsR)UemYiY1Vf9oxvW^vo_P&MYI3HB0>#?pi>dlzM?DD5AfW5~OQ) z_uAj(5l&P7y7UiSB@_*_xF;HF;UO;$GEj45bpNbXqOEww_dl161M6@nxL{gPll#$g zLXtr4fR?mSzYW7RM-O(2L4~tC5wt9I`#slFPwxv8h|=2`olzU1>d7aGcPC*bUwAsv zp?W^0Yy8#~WtHLxi%pC2FQ8Vp1_-4hdfKe)+KB{sw*ElHS7hoyT%1&f3w(_J08 zY_x_Hb&fvt8s(w06>{2}5wZKNoIYM1KihfGBWqH5@O-Ild*80g=&b?nqyRg+9XkDF zd#hDE(q>{M!3q@zx-e~Dvi;t6R{~)6Cf6h)Bi{J@wgdV*j4%W~kSM6YeV`f^Fcotn ze$H>vFJ6IrWjZ~G321rHqFw=wVcDM)=zDZ)@#q#5I1($DzXpZ?Lis94FFtYJ(Ni~$^%f5IA^=K>9u$(ITzl-F*ez{yy0!b?q^*V{X zm$YRW{_?#C!yAY&;OcBTl0ES%AN-LhUiR8ZvZ^&hH!NrTdPm5D0i>RpVg7u>Ks|o= zwQOAVos(U?dOgOS?IV@!JJ0SJUCps;du*NhWMSiN$bYH}5RymdT^bX&oJ zckH;ATW>tWO-0r)|Sm#?_bshIypE=$N^4N!n_f-u_tme1}M4G%|5Yl@*O_#^k3-4yy z1t~SDVtRYDvBjF=basI<{)@+QWN!b-o76XfJUG+7CO1pxU%uriwXn=Yj^10^&GOl& z{4zMMG_@>(+nhf%iWOx1my#+1eg2cJ-Ohn#CFvQ&YvcK1HWr3uB#!CkR_*P2#Ky*A znCbm@yd#&NKKdER!-ZQkN*mcpm5r{NnBnk?w2VFzIr43xjr@UANEXGu@oWucscG4z zD?ngn=BM6qPz2~z!RJh@A3EI^8)^)IdPUorZpR0Oz_6OXFmp|puOMajuGVK4i4`ly zcB2hOr4@dxZlq{bQS_B&Fl;+}0POCo91v_|zdG|dXB>DT>m%p?2COg-r!uPD1D9u^@0mu|I_wcH1_%fdD{_twq z>Im>X_!%S1NV@PuSME1=HYu2kh|=D_YMKApQvP0r%8A^xRGwti&LE}Pb#yn;MG_=a z1J{?HYYxcB`=qZU6<2`utA9w+!Fb{M9%AFSb!6{IGE)P8lXA+f_;l=DS`fAvXIb?C zy)_^zcT9mN9>zUV?zwAaFc71EowCdI8WoL?l^FE;ZG?Ee7QO{N;y28-Y}!fYZ_3tGsEB(k>eD3jMi zT_))brF7n4`-|8F*>W#HvHONnQUUe)7}^L%s|G|FZmoq zVN5>%K^hnxHaa+jg zyFPJ%qbIv8vnW<%V3DCSdY+&U=>wrOl=eHMrQlJ(zyRIIV!v%ly`dRS;JjC(F#>wd zerIl}nxIx8I=kV|qJs&3gR#l16p1Q$Rl&SR-HglKPvT15Pd->0Pc_5SwDTgqB3xgG z@*VRzGX6Yu#I(}yIyk$FOKn@qPPsEsi?i5&JblS>+{W0lQ*H_UA)~=DiDsaPGq>b+ zkoWi(&R&+M(o^3Gz3|Arbaf3+ab0^?;6eq4yEg5@ye$J~=XsU%w4YtN#4fJ9SR<0r zsY^$^rK7FZ6sj?8E>;fNY}L=K@jdCMpRCdJ6H(R5m5vkT7`i5C+_h@*&f5st0`9*q zwU?Mg3{5^8G!4r3_BS+%x6@B^-^A+-(MQTU19A#Y$S#@g$NFe^N-ywwJrV{H>;{?3q6Qb3esSqO(nbLgUZ>7{@u61=7hT7fcX&s`E3$|EQg}7m%Q`s6=`6JEVf{K2^StfN!N|6KO;DgMDlE!jqnJQFJ^=-)vm`^drz|vsnz2kJ-gqcQf2t2=oU+Kwcidy?W);VSs3;%SVzroj=VAm z4}(Gb!vD<8GX{zLkt0H~nj;Wes3g@?x|;s&!UV~Xv5RFuM*42m78IIk$q^z6Bci$* zn8G}<^tT`vonkJO!)mIjU%2Z)6DmAI-{g*W^{X{Hcf*G5o-Yo`+mt&QmMuJDHA$*H zlGvdh$hEvjBsdngWumge!T=jz4>Vo#%jhV9!QN2GMjghZ#{4F=wyL)YX!@Ui-T$f= zd^d_`n~a@C>bm>JpOQA<^;&5+B(&0Qoh`y#sxoIHm%{6woFZlsnG`f{`s0@A8KW!- zliCo6%?F8hqtO$)N#~lu;1H&8f6}`fet`u77lh?wrIAv_540wKjisI_Y)jkM_am z-jn2>HnGua8uC7iH=x{sd{i&EouD_Wty*^6cXjyiH+Z(}gl=j-ZuPHAx6ZWL$ppZD zpZ0o88>@Pf1Yr5Zh?)%9r6*L)r7hg?5AAcV*k{(CZM#U?;08sXV5)GUj|1u1`;QuA z2Oln0m`0>nBDdpdx3)jq+yZ_>To}4&`d0xCMT6^(>4yqI5D@JVrImq@BVWI=eT|KE zykxKyu)1EUQ8;)^89p({22GMfLWLyQ)W)@F9X?gBJYHe^KV2+Z4g$SSxh+BtrL|MV zbhoT=U2S6v^$<0w%?Ron4#s@yJ|pSg#q~sZvkGqNgKl@D#H}KtJRUv`*udX%@(wPK zxAsA1Sc_4ORP@*F{NI9xZ~7hRc%yGA`t}Vb<8O@HIb$C<`nyQSuZq9Ql zKhMo}8@D#G`=iCiE&BvX$Vo6B=)!IHdU%MS5#J&jtFVy_(#oD-Tn2=Jg8I_Wgo7k zTv#Ap5$5Y~x5N~IT%0(3TI?}(=nPF6wHYL{vBC&6dmyKz$_6>|Sj zD2Ux_Hzyz&S+s|UI*+`#*p3rDFNnCyU2=H!tNlqE>f82mdtnpReRI(-=b{t8Zq#v1 zG`*}|dGkRRY+maE3g@zy*lem}0N?Gj+rDwgk@3K49meK_n3qguY~$YMwkC#;UfhGI z=@D1CM~M>Rz0fWTlR-=U`Ztx{!7iGIj#175E$kyc>jt5;&bgHc;oV*9ENEZs+*+cI zotn-l*EBu5>b9AwU-`SMTT>F|t;cbYq%mc(M>Y+*2;TLl^7A05Y_&m|6JXTta zYN@g#Itl`fnm|dVfcS-DWHY9^=u1yYK1=)T?62iDGw(e>{eiz7p;wt)NFD&Wmrr3& zV6uGjXVacW<`m%JqcxT_a<7~horEbZgxcmajwFi)2L|>n96J;%2?o9hKU}zzknAcd zrmEL3Gfbd*04&}zsbKHCLch+lN&6AP^DaW=d^u}+PqT=bx zfaduSB~$c#{h{vkp^ImS#On0zd+132w?INwPqB+OGy5912S0*ka;ku`1_N37*28v+ z0f%ka_P4)Zk2S8+uZ-BCZnH&MKD>4s*bxd3uef9Rn-Ly5bAr~I2Ka&Db`MhT9&4<` z&#jk;t(OaOWhpPNl&$=$`PNGoS&hhw<#kZh4%WkI7wYT1Tvx|z7T~9rnuL{EM=FH> zFwKFH72+LEwB3tVDr^hPDTz>>xF0oWIPl z!1hNn7Vfj)$soKYk^Hck$@~}9H&0V1Fd65!5NUn=Vo=uV- z>T@d@_I4R>U=`_IX!Ser)KbZTCNt4=MDGKwB)&+%$f@a5mtTP zp9j4teL=rw9*1$(%;IRQ22dpeOgO3II}M4)6jZG;Oa&v*&Gg*9n0`e&L95ZtTQ>Wst#sB1M0CnJ(A+RVInyrwALgM&+XB^4CSeJ44I@Pg2#pA@I20sW| zT|^e}@Vxsc;NI^S*SD@;nN#}LrA%bf#Xqenuff}v(#KE#NYQY(p&S=|(5zU}B-yPH zFY8vWzxuY1M1y6__)4OT*AR{_6{TX3G^@$YBSW-~+k}dSPy@T= zWA%|7UGGfNCKpG2Z$lZ?Fm#$L8cQWPNlK^N(ZvNu#`2V5VR?WB!{&I|7(!$B2MYb# z;E?49vYIik!;(aiy?}vQAC3;32r&s@Jq}?NA`p%E0>xO&xep-xn>(|AzuH@p2Pe`g{ zmHl|QR243}*oos}`oduOPMtP*2@;n))mRxzac!3RnJ0MP>EK$5*vVM8rh#Il02k5Kt_hzvnJz$Qclj$+T{fwVC}&EM}K6V&x7D#b>&U> zRgZI$W|Jf)BfYpe%>V7T;h`ffO65C*1m+msWl3DDMHR}M#0_`5CTV15EJ)~p6g@+F zPwLJNpEgeA=1D$c$~cRG^8qsGh@^MH=cO%DPlq2U<5SFc@fBHbx({>Tn;pr%{*J|8%F zR9PkP(`C@Fcg9|R{A%}kRQSqIme*<;e7>Q(JJrqB$dANz&*QC7)>8>)%bAR<^oXY; zJf+^yZIXHs(PH9|Du@2-lIlg_K(3vE1sS51k~$I6Yjq%$GaF0k(c8KOf(4*^Wla|{2_B7M0w$p44guYd(swvbbPLoMb-hzA6S?_({nG~|c zQXkc>dJ*BnjoM$7`StKJ9xNpzEI;?oZ5eR$IWmynZeZHHR5*LL^~yn=zFa25H4GLE zdL2-galkXpJ8O#mX4>I6{5IXUoz>*(?{TlufsyB$B0&KKhcdJ7rY5AZCNzuVtw@{v2T!)|eNu>A`iPRn$b)bX!Szzq7< zec_@bmyg=}0w-Mmy42M;DR-Qh_G9N?w`?$@1n+^(4_f0wOn40EA9=G)or_DA)}YxB zB-v9_vSCh1v3;ZRg5qXe-$h|$w|1?+%a7f%-3gqUziW1D$;cLirQnB?vGp;U|oKH ze9P0q#SKil4>6qkzzYn=_IdNs%+)6`ukDVgiZ&m5WvqI`4;B4=lOl9Utz^X^1H_M5 z{L=nN)@x`MTsFx4b(%F$j4B@w%F;Si+S%H6+szJmZmaH9C+^4DYQ4Jh`fWieFxk7} z?%hU`k-6F_(PyO{U+5RZ-vq9W8enFFDm^XTlpFMkAWA$-2FJ;_j19KrN!49dEb7C z*W2>2Ol1t`3$lWY&62oflo;rn1x%oSreNSoC7vG*7 zA9iFLVuvIfz2j-O{1)amwlg(yTfw$~w{2>*z~n&$SJU(!+GF+H?r~#&4lvDk$OzIX zm2TpYd5=+Z!skT+_Xc(%TrgXJq~u8s9C=>lsl0;-X<^>*ev* zzZVULxSg0|+RKk%@|dYifThA}-tW8P>PRXr{WnPNn1$KKxsCqQ+CB-t?mFZARibH( z^~NewxDj2EA2^hh-rsMdE~&Sz_g$|_@55ZSiIA30%6fQg6eVPO*T-&eaivmf#N;$o zGpV@fMS=-jr)uxb`oiFAA01#q$=XbGs9$EJan@Q?e9iVZ*zLbAG3=95*X-fbF8eOs zP5NjUF}3&0e)ICb)+hT$PPU%c@=yx5s%po#U;_C}N?X(akH7*bE;GeMe)PC5I;yP@ z)Sq8s#4d|}2qffvA0_zsBXPH0YuwN9)JCOy>FDc>tq)Ff@ov`#L0-$B;f6ftdBuvz z(q(m@MYHp;>mK zICW0bgY=1zWUq+dwp8EC6qWY4|g7*CYJ7eMw@LX>Rv8E9;l+Kxe3D>b20w-lZ@UX9SAVd5Kw zTE4-|&_`l}#y5YzEKa9HnS5Nz4$1vJQ$E@(^0AfFc^V%*=?0PQS>3l>GYc)6_kHJn zOU@<*O7lIeg&(ySBqZM*%|P`bh}M$Vn|IoaUp1Uqb4<|RHtF)geb-ms;bnRf{1GklMdaxEml>v8W zR~DPgA02mpw?iQsge@IWyz~8D!Ax!m#^e7 zg(iov<{yX4i+cwaMvi8?h#$nLc^O4UE_iGKXD`Dxizv=Y5 zCSMgeOa;}F`B5Ecx9KRYS>MS_j&05eb_`psaIi8Z&*h4 zx3V_3@L~Uv{g$Ugl9&gf_EgU|vGq>9(CO*&V&Qidw(vA)sC`m_MZF0mfheJM;(lvF z(klw8r%=j%Agq$U_0KC6e6@1O{Gb*kjGBk+Vn>e#J@xEUZ+?R!#zIZk?inw@kMYYm zAD;k|1C5p`HBK_|(HB^b<{t;htjv_GWSnBKVJ~a;O>jy*${VvltwvkPbI3I#>8qHY z(s;7Nk8%Ft=P;=+g)M2##Tk?DJJ@Fc*sNkdHy1{7g?Raz)z)VZHhbw}un5b;Ov3`d z@+3SHc<0oeCRA@<`bjzI_y;rVVJcX>`7xv}#I4>$d}xtjpJoOB!kT+HA4n^7K?mID zZj7;oxvV`D>?NFMQvZ@6&6 z3`K_BvWO_H`D2GAGkNpDYA|}@Tk26huBbtHkH=@Kta}{yhGqj+eHbPBaoE75lPFJ5 zeHYX}G^GZ8VNLVHsU1Gs_gw3X@Brz`{B_C3)qZ5D0Kk(tJAgX+k&O@@@y`C9n?FE4 z0ZeXulO6eD-)7v%ts~%svzdM>Y5NCm7zc*E^~NDCU;4K&76{H-o5OL{olmg}6(IL_RGPU<=yWtNoG|@?G=^r@MC+n@YXnx15Ks#4b z)YuY{z|}$R+j_Z!=f35IHT36heQf=R<+{moUwHK8mt3R%n#9&cB^8zpr<#OKOV0xE zxkOkf0~eTTi>7CCTljChA}y0bbmd(wSp_!FUXTKs_Uqp>)_?;4*32K}@41OYq=igB z6#Y&TO($y`#TFZZjBh=7ms~RL@aQyq>R^A`=w2yLhoUi3ajf*hv3NjCA8zOuOE$h= zx+*B2)gPNGR(K>1kv%m2Il;$hc)XBhTl-vCxeLbXhlK|;8kC}w%lS0vI)`#tJb7*y z8lQc)4@}kCZad5eSv;$GwFb5Y3@4Gct=C(t zd({0+L?kDE_E4d*NB!;oysNf<@{wFD<($Q^XtB^W=CD5}XEud_6N)ZdG|!(QUG|0&Ek_6$6%v~SGDXoZqZwPh{C zD{FhUGkS0S^Y7F8{}`9wlw=VnuQQl}L;I6Q zrIqfPll!8QSs_ee(EO-cSaY*tZmAPAa~M1V_mfdbcp0COfqh%_hvVMs=m`VdKQs>knyqYboy*$|5*bo> z4SyyN6j$Xo8+5E|U)#F64XJBs2p6cvJMu<>xW)w*OuA|Jun)N9w|6bWC?)BCS}5auZMAJ=X zDw_8nH#1SKU9LVppTWd1&0F7UO#9@#H*?E(Y*(0wTo1dFn8R`D;vn!cGi|!KT&nwB zcEF4gz^Pf~h`Ccx8u#r*o4o?gFn2kUXu3h2Cyrk+@{OT9vL zmEp-e+KgcnS-1>jAn>=aIg@qL1tb*~d^O(kT89jrqA;fO$L(NCTT~rMeet|G&4?yR zGWc3CM%{(m38H63tMDKd6f#dtt>93xg7W1wbaOG))h*j+n%BAtBHf_E>{@D7jQ6w7 zf@kg&_h|ZYzN)D_O;6sOO8!k;x*WCMMa-6*^Bb4q!0|=A(}t)I<<2M`f*1~R*rz!n z4Jm98KIrloj@8|AB7X;eqsI_}X+u45-8NwP6Tcb|4{-(i({x3uJCvfk!d@!xnpa|< z{Qb;3T-%|!mEY< zk~^>2UemVfUOpJe?ozT&NEXo4NxI`4XTFo@SF)nEw?B^8zUMZJ!pyDLHIqXPY_$uH z^xqDvTjpkv{g!`D6f-D>1uK_YdVMqZgb04Nw3z-lySmY>DVU{QuC#!ezm}ct^1VK1 zwX*7s#S<^P`Ao~m`_-}#c{3Xl!I-VgfPUj!hJ4K&*}0xiqqlPLPh z2%NoL_P}SDxNOuSr4@manDkEaAB${vA0x)Kp^c3t*|8QcCZ&{1-8j07P<;oNWmRYNkLcBy?4~fB-A515%42_XIjhFduQ^2r- zzHCv`x?kqMkhHl?`amveI&@UiHdFJgtJ_44fFbRsgN7~&lDf@<$#P4O6Q!V8O?9u( zsG+|uZSWkM{&k6ijYdOLz90A{hL(@Cer>UdC)~6qL1wSQ%DM+#G6&8To_F-PSV$3A zn8tVZgx6!p_zmjsbn`MHn8juZmVr3ttVH*~K&rA8>j5z^;U^4@G=fzGm&0BubzU=Z#S zA~XDOrY^6M8XBTQ;$;yAfR}z}c{p~Tnte7VxL~KtYqu>-Fb@2$nmzINCOdcG=GrVx zI9)60y~iJ;+{3`ll&fscb@P17?DEv8Munlr)CZKJ$f=Z;&2wHR4-$P!7)xuG@ESmhlVI5ZjqBMrQSp=;xg1 zidF5Yi!Ot1k=E2RP6iVlx63A#H`cGxK-0@u8X1RF6;} za!jHsSf2tj5~jA4$IKHOAc|}jNh=ZYyA=w_rRb=?=tTqkqnX; z5WfEMoq1WTK=m_SLi<3|&lFcINK&nPti)uSM%aBt5NytU@X#$@^DbbsJu$Hw@4FmL z!i3O76+IYxN6Nvv-S;h?XCwvdi(`Yq-Pc|l{*S%?W!DzU#6Pc)4TDsWC~F)529gn) z(Q1iXl1g5UBDL_7#C1s&rM{f+2gXM7od>VsVuicewB@AREtV#^N~c)LSbA4$+h&Yk zZ*renkEMEvq5BYOd0x2ql}BAoi@+Nzs#RB;|67}RK{s!tw~3>H@oK`}UzeuU0tJm? z#lLtI2o6lmY;EiX+N9alH7oCu^yOHfLfX!(5QFDwz2iez38)UqAX?dZ$HVb;+1qEE zm2yNbU6w=-cPMP~T}!a)KpYLJX)}$YDDOAuiTB#VHdtIQKey>;`gyPN7Y6QbCEAwOMeQfcfid0U*}K1*8Bt}hzdoOH}da#)p# zdI!BI4-{`$a}p(?yw3Y%O^)kGzkL}_klX9E+zpwAR8B{{ZX~EJH&N)*fmoV~A>}OX z_rGzJs63`gw>eDMU~Q(U4bN6@2oG;i1mP^k*UyaM7KqPr8)(V9`J- zyEIoP+3$bJaxT~5%lE*9?_N` z0sfN$3dOLn+zNnenwg^JDp2hQ+yBq6F8wMg8lH>#w~;U3PtU z{h15O*GTSF_Tak@&#}#^92?F|R7yzUd4dkslBMJPJ)0z{_0fmDfrfLHPu8ir?a(et z@w%=H-cDQ@H1Np;?Dl@p(oQ$h;GEbU*B_FyHZLN}P5`AxjeKOR6sFF0^=x<51UTxB zAN}#0+OPMb!|r|U6uz9xf1SwuMeq8RTm+l(mDF(LFByIQuK<8$?ahqgSmo>ad$U0O zJSoIb>%Bh_z8(f;d-G{FnFVX`7segxHG}24+F#CJ^@dr@o=qn@)j>}IRJ+=-@><&c zg^SkJj8)lLK2U2^f4q$aShZeOvONsO*XMG$)sHLi=AM}F?PcjHT7v2{99dod8Zf!^ zX_mm}Sv^n85PIWD?H2%`d-v&DY!%gjW7}z^(SJ>fFab$nOohYzSU9tKA z(&Aw|MN2DX*#$DqnY6s?nFFLI^o^CFyT$J|(T{~}tH(;H;e`n>uxqK+UbGH^pPA}4 zDdN9nDf^XTnR@u(#C^4i^EmffLL(Bn7Z%F@mBHs@F61`UN7p`9V>I+DES5|U~^HarRkjoM07 zq;#&Yr5>8=bziRttHmOyJZnNTBG}N#=jXhmI!1QOy++iUeYMT7Jm6MS7Jp<`fLkge zp%UbW3DE#>3FzppWtuLr)IrA@HN&>v^Adr!nNfwqlP9Vpk^*+h@%Iw;xG-&RzeWHH zjs3GKwa43+JR4;TRJD{-(v4@)ah8M;i}WmU(dLR}K?_?#l~zi(x3;mP{_rd00s+$T zqeH)%u$~T9W_zrSJF%fOj~b3FbBh7z@sX7UuQs9k%Qpet(hrndI6@Hdr$+3J@Xv6# zyVU+*LZ_8tDni!|wn1&qRWP8<^Hj9-afB#mKDvUj^ z{Apk>EC<{*wV+P&Q*)@S8Q|v*Z)1tR63s9nj><0AHs>ulyYAH}G3v<1X$V#`-$uD% zPvk-~&qsHxHO=B|+uBrS5PEUFUY}38ACuAN%}awwoy&#puuO0B@sTAH?q&g0Lsgbl z^f6$Sdy32f(PDC*l~Xm)Xh@UZ!D_j=q#(*}{@yB;V<`;RYV>t8zLL7fR@XkaT7Hq&J3aTSe;fL*6sEWHrI+ndRW$VV<=XI9f zCLz+p@<(?~RDtc&dASOHrw$R6ChJv*Gp##y`qQv;t=Tr=i-;mZ>Z+t^HDs^Wt_o#Rpu7Nw+>xO7w+rpw2(U1{%`U98Q$XEZIb77Ga)* z;DMf^64GzwB$oYkfy~!};R4>;xYW6U7EO0kk6mo!mq+&>-VMJm`^{2n??}`yD+P)J zEY@w$_>VEtO|~Wu6@BoFDzx%laD-t*Pf=_!OqUgKf2xs8PsbEuwMgy#S_7y9ff)_h z%Qyb#2AYrf`kUaGy3uM4r(2qT)R9*z&zf&JF4}@;eID>Fk6&Gn+GWo6-k=$a?nz|N zKC-mI3P7X$bJL3>=J2;0YXT`iVoke<{uP5~~r?r3{&oX?!#ZvhmY39)VBo6bwLZEbMb@>2(B$X{P)55gN15?6 za}OG)s)2F4p9Ay}WYGeF!>CiVbQ7M{?d2okTGd+(NywV9&Q%dQnfn$8G)X1pf-~fG z=%KDEMf?6kdsMeHHcO>Lqu?5jl+H+(7<4RR8A5M+Jak8%@z^uxMnH~3iHaRGjtXhN zc1#Jz!9vc%&Xf$UvS@&$2sU)yX4ia~HDJH(peXLyrzSs+dce`1NrIW#gul#m1w`|K zxnPff{LX(Od__rx8Fx3@f6GBySXbmb6heVX9RdLYkAzy0{;8l}SK&@Z;IwhWVR!FI zalxlJjwA^A0EoN`!!Ie~4epJl!M!BoHuOR|7yk`Ou2e8ssW=apD)R@SGNpPSOOwbc zgsB8cTN{uakf+-j)f-B=mTC`+%0(O z7-v>Bjt>d73Rm9fmDX#q2B?wcBPV_RtX(o_@N??l@W&uzBhaJPH0A*u#d2YvI(icY z&FQb5^slBOXGbrNIS=ly*Nzhs2*H7~I@RjZYv+$&I4*P;FEvLs46bd}K}NxCrzTsk z@XihGtAherry*y8`+shfROdGK%>Tox`-T`0O9G6R?<1FpV73d`%bzl%Y|nAN%%6FvVNih5T>!Okek&bUT;Y z7a{%l@-yINuC&o6muRAaY~%By z7uUG;=HmdZA3+H6KX9Rw`t6_<3b6=8bgy5Mw$UlWd!CO9)(lP38T()_F*JY#w6L7c zCAP*5OnvUmswo6R9zLIR7^n1T+=o;AwoJew9H*^I{#HkN(DJroO&wBf6K?Ii!c1_kMvRSXm|b34_vxz90C}cbqqJ`R2@$ z<(hqp#qRDuftO{#uA&AsURT6*sSk^o506q|;HSISfmbxI7yzV>dAkE1KqYwF%VpWe z1^EM}j>O^T)oAM`EDX4R=KK7S%2AMU9mD`9?q;l0C0|0`{@mKJ0`W|`7s;pWs6MNf z+&*gmIWt`JOw`>Kv3Dg8u&hNRugvR>(SNW2a%7s}sec4s6IDiJ)4#JC(eE*7w}=jL z_<>B_FL>ahgg*bad|zS8l*&rofuhW8kLV~f(s@W^567~2J0Y_|Bfc!wcz>Qr+^%w$ zl?6;f!}4aAt1L}XK71En`v$7<;||~QTZ}l-jtH~NhuY!HSZ)7{*!)2&Fe6quKm0c{ZC2LFtlXVa+>vtMofb79B{el%Pr2oS3+{?K zlV+u;1&FCACl&W4P*Ge*O$jVG?i;R1q$#=YdLCxxJKyKIe%J5*1GxO-=GM#mbH6|D z<@HME^=-$eDxdv&bo(_j`27QB1QP}X{A7qeGYDnC&2BenNcI7_fLq*g-YJcpOQ#+n zaKV_G`&VYsI`{UTr~{U5d$?q)Zp~c1YJPn&v2(IC*=Oz9^s#qRd%A^q&reL48)jj7 zFhJQe44EFfnwz*BI}xW5`Yl3*u}bie_oTj5u_z7Kq6G(g0zFFR2M}y?8gJ<)PfpH^ zf4USVBcQ;!g!g`PUj|q+lBx);GHK!x2u*v9$uo4k$a*e9RbSXa6a)202PaJ42 z&_;-Z&OfK}n3F-NKjpo$PpMUyd~49y*|{?+RZN9E*^Zh0k-iJw$9_S1W*!~WKNQtL z!ypXrjyMA&z@7^15C~1i_R6cQyxcb0u6(Mq3tpXBUiU@$kei!lJIYO4|2T1AU^12P zA`0-#_60tgdz2x)=?1mBSBEOPz+GB7VwpNwH*~_w@VW3g1Bm&u?I!f`<2eJcZm)A^ zdYjS2$J(@{L{e#&(T#xy7yTZZRr|B`kA7~>%~$fT^<^elm;JzZ>&`s(B1Q>2x0Ps4 zG#5AHXEV`NwVc@zzd8JJ?RkSQHkbAya?_}Og*+j2(AHFk#E`=@?#$!yWX&5&M0Rd?VwjdF|J^>_!q%8FZJxZQd4v+rF@ zwh_K{Muj|`_SZBJ5?eTOU}b(<-znVe)xkM$HB9Q01e;Vrtwe4jZJ@lLE$TjW=!pxE z0%pV;FXbMrt8Y0Y$B5LC0FiMSSddJjJr_{bZXd@JAAO_Chz*3j(iz-+n0HmnPZc1q z8sc{@pf{io9JU^|ua*BEGkJBkYpK$@>MKe{u;`Fk&NQ>L)L*&*XsOROSayIL-x`iN zs1k8d8E^Ny#{~oqTZ#fQ+b_oWdzCJk3rB*PT6hXF*uZaxdvdZOE>waf2!q%KFFj$j z=LPYw)UOW%(jEy$QM)ETrhW4dUOEP%wt*3Es^)S=HZ>{&lpIbPXOzovI5E!tk*66g}PR zgcx^7upg)#|AA@Ol^FJWjp$rZ@Q!{~bakX5iQ3f07A3^K>4jb9FVL0VqCH}MU98dR znP8~x%)|AUri$9cE6fj^eC z-#~-|y~@L(eGVj0!ne00917>-K-VmD#e2IUr&aUQW6lE4aK+sN`@!GTU?t=BHfXP> zSDHO}cCpf7^Jy=log);I8Lk1?uUe8yVG=fRK9dKG*^%%?U!TvGFu7^yyZI0TNoM8^zp($Oy}l+^dPk>$n_1(M6|sM zNdnrq)hgYl=-X8&f&6B>kM`~NRLs}nOzs!%stdj6$;B0D*~pqGP1{M!f)&}&ECxjS z<7CXwg=r%dL)zki9f|=>X1#WBT}jP~D`~N+^QhCNrgV}YLu*Xss#gZdlx?uC6)9P z4;I=N4vSRF_?so3Dt9_ORf`L*1Hcx!Ox*#e9KElkk_uQ0T)PD_dW$V!#oP^z4t-vB z;?HYI7|>$qn-GUi5J0N)WR)-0!8L9nOJ4njhwNvdq|VnL1x_mCKCY1qqHsYk98W_{ry5$Ed3BxzH63N;$fd^Eu1P0gi4s2>RjpkJ_sLmz4-cX z6IXL%QIg~Ez6dK~Imu)rscQ*0E}<`?bbKl4NA7fG39YFsNDfuhON5Uqa=ox@&#%pl zNl(JG*T19Ne}z~&5jtzCouLK7cD%oRxG*<)^*}pT+OJov9MzOt*7ax{(NcU=U>%-| z8kdJ@WuxUtrl!nt>z+={JuXIPBGK8uK;Fc=AfpKClOgSkQY3B)7#RC-l0zb7F0|8X zP`L-2yvLhE+U-lZ6V!7v)BCUzzmEvrD3dCSd91&Ze`@w^8_ZS?jx7@!oi|br00(lB zl(BJ5F?O@zKmT=o|2=?b1<}STgFuGfh!b(k^lVdXLOQ}^l~+Iy%6nAg&avoBsM_&i zj*ZnxZPRCqOI-ok4g7AVVZ=27j(Td#;l6a0$%%y}%6kg{th%zn!-<6ib2v?x;45 z)%yzEz_&Ay(mqJ`yBBt%puYeL^Num@*J%;;lx1i6KY#XZ?!>%Uzn2nsQ;*+yQ8h~a z#o8MnD(j!!&lUSs`JIEMr9*fvykU%QW#PbMDz8*$1HBqG6`3J%q(uxar5xKpe-5^2 zVX_Uog#E|ZJa|pb=OeIEQzw^Z__fdA&LNH^fA)=y-RuWNu{0&~r|9H2LJrig=nG;L zun^pL;l=06Z%>QBw*fcD=w62FZ+dOP8d_(4ez(3y8!w$aTU(1Q^m92~h@E|{dxknp ze|&gJd~IXO4X;Qas5(!Q)@u;KD4i;faNKptP1L9hEOSrUw*+FT9#O{gAI;x2Agxuq3PVZJc+V9K7U%K4 zgHv;JaDO0pti=0^Yu-cQ==V8uMl@s3IzGL~ADT@Zt14-FUO8jv-A0!7ELeP{p}d*! z&4seDvTT55!W8d7w74o+hRRdiNu|`0g1-o-8N#PCH(C%%k@)9)8J}q=NKxH%h_ep2`IK9{Dte~PvCD<-_$}mdx`gsDL zqqyfI#av1QgX7&%5&E$v|y^GNL^=uTEYp-kfJMvFY=72o>`Nf z)ed0#U~c!pd7U(>Yp#HZm9EF83Q1aRtvQao{CE6Iox^7}*FEgklAi0TC@=OjObT&c zO&g0=ay(^&l`oa>1984=uG=Ji+f)>=HTc+fNz?IGb};8Hr#vtoq@gh@}_GBpJZ*<{<ZQ8j1DnX+rY)&*&e$u=~I9lC)c?4rp`bV$yei{o^!reZfT zCaqgPnY!lXwZYrAvd~WX-YXoRS4@NSh^%k}Tf)Zr!lHsE+d#p9z$wGV*WJhOPIEQN zczOHp@Y>WHhQ61voo#Y8+qCFaX9pHCBhrFTvBp|oHpz znt0d7%wDJC@sYknb#3#ca&ic3k*kJioB^0ZYy2;R4;kxUGz&wq_H~!2CJMRV@5=OQ zx(@^&rHz)o1P4*<;JnCN!#@BUDky?a(8h9`3b;2b~wJGbsG@3Rjc_gSQhbcq|OovRu>-o*sR5Coy9%T-kTY zB*JRy-~T1-h`IkWdoSmr-HxX)$0x}zfLbzC3`#q#*dgJIII+HX)>6aOPVP&hoHcOd zj>S`CO!lO@;(?+?gz{BYxOiJ@9>gf(>T5oq!wP-neO27q_=?NT962GHyTQ!#^H|}u zyBR01V*1m3F2mQgkU&alLH5}<21kjq^G{EbBuT68l}Cp9i%Lg4;mm!RuP9)n zk^H^C61`9t_<^W?cC#{KA7W1^nfTdwfmAbUpIx3jeN6!Ws(Z#IXk@~*p3;F;neqBS z5sjam%kgla(sSp@N3f%`LD~B^$x-E*qTG|iwbV*G$}PP7UM9?9Wb=Thj&&nE%a%dq zjSlNn`yeyM+Z~P1l=s8CU@LNAJ319(E8oT#nv+G0OHR;v+iV%7qD+CK6qQeHL?fH} z)VB2IT-10}(~=xgyaf|Nms%+5o*q;`|D*QDtIKQIS=i_PJ54kJ z?*>R3yTYf{n}Z$?|DNg?^z(Wah|@pWMzd@rJgwr*a`QjNCiCALDCg)En0@AFC1wYS zF#Tbgx0ASLi zOT1JNp8`wA=2O$x(wWGwz{HK2LQVb(B)792gJGs9-+d79!*j@)zJGbWHRGH z;wiXDlmr*x<*7g-=(AhM((^nG+W7ab4cW)<2YvOuR)z zOH2ZkyM)+h(Hnt9>wbIa8c(d`SH{83;zo=JOkQcVPSw|7TN9^vloo6DRZG@x`y8!i z{3u<$&Wmiauv{_mtqGN{+jMX(6h^sN#^`An>vk*tB0hJO;3@qvI?5_=t)b{&wO!#6 z;1ag)G8b3ZVNFV}zBgDP`0w+tp>+*UK8kw_AxfMk9_O@4<_kOVMUf_;7Q2 ze^2xEYlr+KzOJ54pVv1GKIZ=tsFlnssWuZI&Q=Rd;sBXjMoUWt$=BE;Ejrn!X6#z* zFzq9QD_1$+YbF&$8+t$Y9OT~FXol^X+T_;^3=CBz+9jZ5f396i?F$w58rCVjUOIwV zl{(n)-jCH?pQ}yc@0ZR);-33~59*^wBM=r9Hqld>$8=FDgdxE41&{vohxpIy^%|P> zTGx&*j8}Bl5Zu@aq0;N8QBP$G_QU6zUc5r?Fk)$?~QSL!~h0H^bYxZvEKk_-;Zd=Uc<4&nMtF z7nStZg_4ne@0M+4bwf#!*4aAODD{-XtN_l7bKtDd_|KjH>IP7<3#P@+6B587OjQ+~ zRmc}~H*n>Xp>IF7zIpK8;sA+o2J?7a+R|`&h3-ntXLLZNQN9DjC0`c0J5LlusUnc5@AOj2;&jb$4C_udh1! z$Ba!Z)c-c|Bv05pE!kzQ$Z^?GYrLZ|A24PK)*~d~+b9q&j&x9k&-hR~H0Zv!jId8G z@P5g@bULGHY=Y&4zF!?iDfb!L-iG}%oz+5;sF7El9UZa$_9z#|ra^sOvo)W%%RIb^ zMf3uDG&~uB-I5rbN5*+W3;O$Z6t=lBBMx<0eZXJU8R605Fp9I{-NW1e~+!u5)H3mR8$_u(! zW}SYD&^+7{w|m6CXFU`%KYaaAc4osc5Sk$4&ePyY4G;0d|H|`Eg@Kj?2;WDQt;!Tw z3ru~-N<6~<>pgVob%~8`sB&fLNLN#JX7ftJwT{YBMCgmObXr$v^s&u~SxJHR;tJ}S z^+Ky}QU343rQ`k@S+kEn%eD_Ltpt~`Wyu12+h@(9Wy`rcg3u)pdeRPKPxtMl+Z0|V z;74a|(%eXFHm_3NT>+E1*<<;%eU-p$pD^zpDeejII;uZRQ_EquSn zlJL0~L^sLH96akCr`X?@SbeD)*t#YztVj*WzYhu0tchPB%1k_Ar;uFj6*z}9|2q-aR$Om8ZD}P$%Jf!S(i98m29*vD2j*@)4xKauhg)jFkSv=i%^WjEBM~L-AzEI+eRVWW z@F)9RNpfjvmDLj_X5!;=*W{J+5Vkcowi%{arHbMo(XSF*I%AI@WZZTid8kyQWafO+ zh%;Z5r3!l0$*-(R-qC&Cp^9YSE2bkMh`4P_-6g5)A&$%Ta$v(Ru54U^@zp4cFcD#= ze&FRFy`OfzmddN}vxbxg@(_ES?Dt*PEaSrC3!qK!^mmD#*DuDu1*`f>>ZN0Qhj30^ zMgi4kK73+OZ+T(LO{YB7}V`+N`c?{)IZ z)$G5IoCmm1dkr4^8{_-FR5_XAGEjGjUaEwNW3XR{+j^TH&P8>nw6P>1_IQtHRWGy0 zTE!cmhJ1}zHT1D=;N@Q?-8IHO>5Y*<&k-F}g+UUdvDC7sJ<+r!2VNdMewHMEN~X~h z$e7J?B?jg?kqF0^zlR^^xgWB$$h%$9rm@Wm1P2OhbP^=L6rf2gDY14zAR;Gt#7%FV zAg5`a z{6&l>L$39(`!eS~ z%TQ6;L#oVCuU~QY^O_!l&_SxEKN6?4J3C>!AFAp&xICdY937{itb6RiB2T< zJ=+pG4=&Oyfjd6Kc13}{0PoE4)s8x&A{34w7rA5GhdH7dc~&0X!cB#`@_M|MOZJ}? z^8<-TYKHu6oxy!X?Fi9w|6|j9{{Ug&_cbt5!F4<-wt>n!^O0d$$ZnwT#nrhU# z1J^(zrpw#+WJe_+`o;^%O8~D4OK3PT;d~iA<1fh`;Xd#Nf$wbk>%cv=`F?rw$>MId&)-g*a2A51i6&YnP8F`rRto;4>SfR{^((HZ z(fH%h$HyoBJd2xHX62S5e_l^2DL3Km8i`lnoc-=sPr&TV?`QYM5%itP2hGcU%ogs! zz1-~+h5PJ@3I5d_ox^9?u-Xl&eW2E~-KKS5^Kv@%y3ty@BP$jnr}18~QUD{5lH>zbd&BJngC6 z%UkaB2!~c#2P;|DYlY`?G1|=&1H1yqMz|}o5H$*4a_ACsDV#QC|Krehlu*yU;}Gej zx3OgDDzBi92>n!zg*7wY{^tUOuRuwNY2ICXT!+vIMJd^b4(pYJy+I4x^=%#&?KWFw z?vtUJTP9QP?e+~!>NX!uz`G$bm-4)|9xhY-)xvPNXmIOn+5etS_~8^zal{T0pRQ1v zm+|dm>-7qM+21DbGhCv?(AmoFM9U9XRSm1Qp9rGVjufeVnNOQTu~eWXs9DvgBKVB~ zQ`uyBKkwDx_PQhNHf#Ct>KJc)-B+V~4lB~Cj~mOX_SW%Qc_Q#MM(%3kCe{9=dhJ2~ zeFMyERHP>m^uj*iRNmB%LKy5_D|H!reHN_YRs7EJo#P8cNWZGm)d#V_?ScVkW%2&3JJXPw^RwaPG+GGtQPlx6lte{eha%JJCCQAtWAXMAPhj_xRl#?l9@{_ zSK8i#cjmF|93fz{>x}{gO2&~F8O<8)Q$5SnX;JXBgHccFf`S-#d`+lvdP#^}0 zRxXY7BJ=W)2_DM#ejsx{(Vlb(*IcdsamVpafjh*?_AzpaY7jpp1QR7s*kWOI>*2qD zBMvnBwxkK776tiGuL@k)-1hU$`i~_Ooai(ZNZGpHXpV9@4IHK#X`q>WeX~)(?X@w! zg02&J>bu$3$quJ%L)2i+ezUB+8WJKPHvVw7wYCJs)HIh6L~iyycMN)2QL;uy6=dN? zQG_LjagE5nxdO|Yobo0cxj3x`zi&nPV|29aFYTWbUuDUOn(NyL6$!^OF%MJcY%0D^ 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

mTgOdPZtXpn6xqFjN zf^(6Pwnpo{*HCHIgJK|S0qyzCKTMvjO)c$X%Nv@{s?$djO9k#l8c%$cJx*!9<7}AN zI+qs+AEue=cMmYuV8+SMRmh&XF07Ok0gj~4JdXX3SK z`GYm@N02s&ozgS-9hC+}nnKUT6Q_zL8am9ZnuE}hS}jg`Di9}Gl?9{!G4J}F^A>&O zoniG+^hMyfnFP7tFXc=42)H-SSNxkXMD-@odLjAC;X?g@XP;uTvN6L+SmldpXHurz zhzcz@AkQdnmNi~W*?bO5m|jk$mezoeP+1a_K!>k!9#HMP-s%< zYSeu)iH5__ogDteMs#OSef+CsV6<8t#fa!r)U9>+rB3Xyr{(*JkIVw~2ctYL1sdC{ zsb)P>FdR%??rOQs(a3UbhZ2ZR3M~7JX~_iDp@nAIn2yh)<%8C#opBDs=YYOkJenSv%QEgjYJ??dQNE?J=%N8^7R5WYz?bdcsB9hNe4fva7$<#MH=Sy zPGM(iR-Ivnoy;6jbKZyV?iv*mYSSGpiGem~+?Ca+9REN|8U&v0$Muf1z|>KkB8dXS z<2kn;*OsJ7+E2%)Q!JE}TW_MWQB}UwzP&wtZEE_UziP#7k;=d(^iQnF)qJLhSE%Eo z2z{q#&Ez%r5Bt3FqKlck23k2pV@a(@2Oz6W-RM)JJ;i?^g>a?Nbrw_VRMYIGl2!|P zWZZg)W%+F}b1JcHvhtQ^`V6foz6lEF*CIoZ3`m4d(`7P*tuPlVS&)nO6oaCmCg;<6 zdY{z~wb6Bn6sUtGEZ=XhSI+`5e7k2N&b3(TMn2QT+6kc;6U}P9irjd`osPAQm8YtF zIkELtQr$it3KLtYRaS$$N*FwKZmeeeMel0DtX(N2!T09}c$~D!0Jn&EEX8+rGgGqTUB3g8*Egrq)WsKCiLCP1d=C;(s>1WzElbK*ZT+m%8W!N(*LR&k2N#Q4Nau#zvfz zp9%Z*?4M#@7^);o>tLmm*=t(66X$fOyMQT*)Y=?(tsp^%2cRrSd_sA)JruhZH=UR7 zd&V4&9Ekg-x7_V?|39((2`Hsl=Y39hl+c1tg+9@jKx49yR!%h@e~F}6$k^As{QX^8 zAnl3Z=3gfq=&~aBN!`C0_yDIpcA-}Vux|)g>S?R)$e;XBUYWSOiXD2qNK0hh&w~h*m zXLAc~_{}RTFLH*6HAzZlGX79fDs!*y;Ea8f8#?&?!wH>G`fGaIdZ&@>fSkid%gqeo z7YCA!pxwAD3%o#}$k*?$&n~+QH>RX7VK&06!}e2MWu^iU&oVBYU5ts)JJ9%Rn+n$9 zvcVGnO756|(F&$kgOQeyxHC{XC{>qr_opM zC`+bGxrU&z2{q(EQluWqT7?v9o8U1%;Bv-c;{YF>69(^HXWYbSyuza8+Dialiy+2l zq;!~vWQWBX9pVc-Eeygh<1RxMlfkn>h#T$K|eYbDk{wd2*hl>R<1@742#99Z{wRUW$(^eXJUAyer2zrEmRy3qdagkB%&klXpb$oWOmW{=Ci=s6c`I< z;q*;!5-Kxeo=3!LJF@Yxc8V;-0~!RygQ>#ON`JW?5^uA;Vv zOPg*|#TiBQw8%ZlJC{lh{g(H6$Ua+Wn+Ib##=x+miSelne+3>WJnVm+e+N`$)Yfq! z^LP%IH^EoL`ZokL#Y1+3KW(ZH-KGb_vHAP+v+_mpjy42?uTjgJK+BdkIuT|{%g3Z~ z^g8j>y2|2nHwi*xM;VCib4bR=*z(p=RXC|dR_4fTU}}ErQ;{lgX{}~I%4(UHZO*8T zpm#M&9e?d~SOT9_QdRLbU9}LF*Yzru=S)jp9PvXfR_fp8WMa-Ogloc*{Ns=IUE$w-0odA&~Ed8uSxEjX4!1 zTlf};{L=|3?*rj1SQ^-v?DYeSReXkDQcfl(bOe=_jqTkX3v)cXlsY-tjjhKYm_A)i zFeG(sULmUW3YAT|_jNv(Jp>kW|9=l)4;dSCWIPxN9&Ww7t(-Y{uxmv8Z3#EZ;>eyb z(8_yeHJs(-x8viO^hyU)b2qayleZ>8OGq^jm<2e zWzAul2msJQ?tJQ~9ro~?!(yYsd~3)zquJicG=pT^xTPIaBSK~)%N@vh&2zkiYi1=q z=<5Z*wt3F6gfnvQGHm|+Z{mj-4lZmoYxQw`>(kEaZZo;(Agy~@%6~nRiGsXW1N|Yb z;*EaEfEanTC0eSylF3Rd_j4C7yY%kyQi#LCY8;-D!9lf9jal1FMMPbgOEq%&K1dw(6EqaQi=2WZ6A}JmG z8b2y6FT!Z4to1PIS*(WRzIs_+31=s+?GZqOy9 z@KT;rTrv*avLL3-(zP4Tf)wHk$6d60Cp_Pbt=J!Ee)Iz+)O?z+{|phMznp<#i%$Kz zc5sy_TG-oOV;2QEV){<;Nb$xk>h)YtiXU_cp`6q|#?b5tb4OAR@Spy|;^ozuH*5E& zg8fZOAyq_}cSLWq(3oNy_nYdYXI1JIDSL7k2ZBQGKJZ$9WprFB4*lhAO}~$*@!(BX zzxhX9^qTg@_7xXwI{+F|t?%sj%82z&GNzYgY3AkwC@vw`Rh!ORaRmmk5^`ll3Om;; ziT1*7^>FwxO&5M>T1o0<5Q9WeKNZ>@NC@&Ad%85Rb`=w*=ce(K>8jX;m|nw*?*Cq~ z{petX8=qCKcPM%}L`%4@F5)MCrFRUi`^OU`&YB;}TiNiCcsVxmN=SyHDtf9ri(XJ< z%b0(<#gS-o*QP`Xl6ts3bw3SP%5LjE39cw4_c;0);AuS807++;|Ldbs4byoe7!3gtWIk%$tT>oR$}UI2S4sH74bJV z$#!!Q-1e0@@Rog=xg1A=O$X#H7oK&~<+o{MIlXsGaG7U;%*Oi1tXw$w*lQlY4|SLG ziUr`cmL85}IMl9hKwyb|ql+~>3&oZw>-e)QToXjqX||mr$Unsa2?NH@oeZ{-&5ppN zx?g6v)gm%L{fwMT^{g`X`jXjxY$W5HVjo}&dZgH{QO(t_oG=(J9!TCBp!Xk3ZaES1 zL6+_W_`uDaqjbMWo*btd4Uj|j>eH}ZdkY!8FDHoQW97qlc%5Hh?xM7{FlOFzvUdgB zZih?LqtgOgQAOoITAoBLfBR;TCBh`nDm4g4S&bTo| zc6eJh6xHSZ<@YzGDsOQnR<%@kPLtlZPAwN+Kd5}HA-<2t`aJiQ*@I9+`}n z%Yh7O;UHaY45v8c9+*S__WQp-j{MU*|KeOnuC%_06B?EA`nG!Fw0Rm#Ne$jNS0_Jn zEWx)O<`ojA*advbFrhIp%3{)lGO9XSG6v}GWRev_4f1m zcGBt=JY-y36i}HX5X zyDk+&w!FqB8*D=DRFPmUnW$05+LgAgEEv$-FKYeArpN2@gB$D{IU`y{WG7`>ec&L_ z(sj%{x$-F`@7I6&g#Wl8DQxlcm_(k;8)wx^YTTxkjgCiI+*f})xM&H;@)Uo&^hARJ zEG*8xKUljak@LVWTIJ7sS+5jD?hksRuiP6|SsFSfFfYUs+_#1t%>7JL!o$xO>r6E_ z)8sR&M)YfZo8>Mx^PwizY2o6;l-$k$_Iy7$i|l8VcZVzdv|Fb(6dy8c(rFgZ8x6%M z+UL*P(#G6Wa1aO&wTvmhx<8 zV9PuJC-o9UMyuP+7oHyx#$1vbt&YA5N&-0WGt5kGaTewsE+K zU1LbltbNN`s=W_0;g?y}`tczR$U`jN6D_t6s@Q%gvB~(9t|F~`HID&qraJ$)qOuSbzaZ=;*{E(ob7Oq#*rB#Z$WI)wE&-fa+c6@Ew*B9OZtIQtd zgw42%oYWTbSF!WQ@g-Vy-zUI0;r*u%J6w6_k?gmGGjS%cKmPvnox+y2YRJkRyupD3 zII^)Cw(94dChSl`V`1U;QkR1<-hvpcXtbJgl{-Q2pPgCfnU@RlABrJw}U+8so%1=gk<)zSA|R-^x2d? zs77aYs`A7&(B5C{zXiP^Az|q@s9?4f)NoxCUIgPivb&P<{nTi$|1k{w%TE!~?FnHo zyl0`aQ)i%+|I?v#&4|12^LnlR`2YCV(+ztbRZz3qau_UD{#_7wcQt+tGOAoR!nUhH z*bKXiUWGGJtMNkGm$pB@eUmnQ&&A!b@OQSB>QVx#^$(JxQYsiaahfyo|qLtCeZ| zVRbD{0n_~Hh1s5&^Md~oojq`}?8>j+!mD>*I9~Xh(Ab6gw<4E*y#aglfvSd4m&hNH zE3~cz2&mw9;P{CF{ker+OUB3cbLO*BXXy*|_(E|fa8~Q&QMyv2e3AUU3X$Qwt^~&? zO>TOzmL^|B+`0IW+++eS;&H{(7f}XtO*5vIO#Aq_8qpY^xmIzr>)_B(n!+-VsvAg` z?LMYCe%2egvh>tJQHuiZ+-!L8={dy$?Hwx)Y0Cy1_sOJ1DWk7;sdf){p<^Rey*_`& zS;@>zZ|>@^`0bbrDhxV2x9L;o#pX6rU0{T869)lVftLvS{a#h%H!ZYGyERF(uiI)2 zFmU@F1@m)I{X>f)wHnE{_-cJqo1~=LAi>qtA3Z<5THOK{pwi+oOydDUljRmcjFVw? zq|5%n;%8>hllmNa%Z!IOiv9}P0hvn+{^K(>I&)+-bbQ7|e>qy8J5@$eV35g5fBx6S z+zS*X^Ovv4^_8ELuc-2aGUav3#}rmDfd|c;F8x3L{-a$nSEfH!D0d!x^V`8ocY%c@ zYHCgB`$XGiv(!aUd0wZ|!Fu}Mz)4vZZi6KP`L%0;{ts(!9@j*+wF}eT zPN-;$fPxII%n(3k!q{p9k{Dt@hA_55L}m!{+*eRrMoB^<5I}(tW+Xr`fY5+|Nd$y2 z$RuC_VU~G@{>tui`t5Un@43Hwzw_=ts&=YUyY^nIYS-R-t@S(`SF8=XkC^M-apk^E zF6u2Q)5=k#L)Lq1L&&0~!TL#KXS3=#d2M`4-@Hs}RIB5OI9yxan7nu1Jj#}&RMz0S`%$O4T(mt;TyykQR_8z3{#S zfS?g|ZE8VB>c44lG4e4_lBrq~31S7|>R-ye)_0jDM3!#C)VaHjPb^valOBHM&Q>u_ z3o2fDoyF5cmkV6NQm{>70weB@Uu6dYd&x!quHo4Gtn=Q}7dz_t$=*H|$=&r!{To)cgd;49_s2~w-xm+5heR;TkZ1y!L#eg_78x=I-e!E z$x_ad7kpQzW+;HOXPzWMH-9%IwT?x7JlS*I6;BVky0M{FX=HP;WBr<6)k09q z@Kj{YIao`@@*FJ8aeP(2l178-XBQ;(Yg(g%urqJ!<1M!gb=BkyVY<&`heFk`|# zDW_aEqlWh+wEOA|JH0hL^85MSmz?fJx;gfk!uynyB&_T|4W=B=5*dAM3m4^dmg;~1 zSF?Gax|=FKeEq{;2mbraDN|bU1O%;{EGLBSeqSi&QH#* z8%f#F7wWZ|?N?YTu#L*rQ#a6x_q8rr-|?;5H0UC|B$H+YD>D+gqH+`4W4DMzvg{a9 z{R@UdICd5ff$b<&KkqO!!(F{XTX1YUcQ5v_pZ`ai+Jn5GH0<<2=|fuE-#@mF%o6lr z%MAZY7Psp%!X}Ht#m{^+QG3EC>8;@+G>X4fqn4a!ZilGS8`vai*Yc=YgcBxXc2r%CpfcW7=0XbAr zEsrqd1@J=RM)zKY5t<{oEoOf8C@}$#w954bXPXCAa`WUHl&g_7v0Yf$lorr+op}SQ zI(~Y~)*$+6X_8$bR9QhKgatUYj2Tv~+)@}^cPlF>ENUjZpj)|B9XYbU&4KW<5YNW} zi#`y0zjU_?b7dvi`M}*v?ma~iGw>nd0&%aZirj+uFwz?8UeMSbE9S6uO@E3+=+YCO zDSxZAWRd9h#<(1yKKI(VKP4?}@_IKpLRzK?UUfC;cOE>&nsyKRn567FUVG3bR#xIQ zlrE3n3ZsWRGEM~pL1_fWs++tqlK9!P&Pn278ofJ!+3EllMs`<&Q=>?+UC-b)Uj)RENgF>^y&8wX4{lz?W~sqL`V*%? zvvz6Tsl=BugM68eo|GJOE4iXD1m|hm^j0R|Y{* zLz-o@41oe#)Tt08#$DiPzHrZ-SIbd0kol_KnHVLIxw1~j=vJMPMen@Er|b%!7*gXI z>5ATwl0=J)n(j-K`cT;lr_Z0VXPEMS!(H%{K^PDnbFO`AJ)PlvRDab`jhR#Vpp7f@ z)F+bS7`pZ`pTHvK$)h&ah^L9-5QdKYBMd%R{Yhk1?i-p`;-EMOsWi3??tPmy8@eZE zWu}>O@hUCEiO*y7<&nz7P;lMCWf9L^r^6-Kmi}$N>Vdja_z)L6zpLVuWf%W)o)IKl z?=>!=cznP^%;0*{`xy?&0dT%nPrjXoWMjMQ_~2l!tWxSEan;-KbZKT3!^A_rNd{f@ zIG~gI-qr0&889RLI^27ZDCqh#&b-$;;GxWGI(FihKa}$=!@@D0uXgO&*&Af{(J7&Z z?1BQpb_IFpqZF4eYE6A2mQN|k&E3xDS+ z^gDT$rq$|VPh-%T_nc1Ikm~$lemSpk4tJ@e9h~VL)&X?$J~}LFR2D{pR2<@8GlG_YmY86Xi6F_)(h%!c@ z7yeNAkH+!F!&aAlO{Xqs)uUDfl9cOjeo`p#Hw*Db;q2l{b{%kpWhdP|Ex92E&wXxkqy#|zAo$O zK!%Zn<>5SM&;F%J5iqVZd8adVcQr*}n51~M%NrJI+x))Bm*|Hca}rKuujdn%Tom4u z&&&VR`8Lm3M4`tdzWRnS(&6;?j{K>}@=pLD>W}}>K(%T%+_Ru?0d3Ju(Jc)&eJY!B z|2|1z6=S@Rv6QJkTA4T{7!j4)88WAijml5QPNov8a?9=FSA$qKL9W&kJ}@yv2dlZY z7&m29W~k$E&ODugzX1O*MwcTIGN{^E&8f?TWe1 zH}W%ECig4u9autM7QQ$7X<&w!igt)lkC35Ih8McaXD{eg53&TN1aK2mfC)8Hpl@z0 zXw34kkY>zfdLB;OK^zM0*@sfuA&t(z^Y{(AK+aRu%+=mgR4JF1hww*9P_FLD4w@1jmc?X?$5&yW}`_diU*RJAej54-0S$r^t+O z0Tvi@kstmc-T(XD*`64lLxtI~Q_BTaYe6><#nS@U9TvN>Y~3x36wCfM*GV=q0QBRB ze_P_wIf@lC(B9eQ(@a#rYRL4Zd)!AVmVBD~;!8Ozm&)ImXTq%f3%CN~BaBVD?^}^A za&ZdNZp=siO`}8_wr}Qlp2X@5^W@@(zSi7y?TKA6qt7tV?j6m#etG1*k#%O}=dtZ# zJ8#RzCv)=G+FJG9^wk%Pj%~d5To0UelgeJQ?+96rQmXSBj7|>jB?@hKD+=!s$Fy(t zi%dy7l$O`r^FZ2m8#HnaM4op&WmrDpQ-Q7K(Djs~^lVBJC3O(?c&RFZao(JVhpN=s zx%;IA;>6A~fUfPy9CE=cFAbN-O>w#UkJd|T)vMoab1CFx{ow=-$7T zCvZYq%@ULkXDab(;uG3^8(|*INU?JXpq?XYFMhdpmUj9f!WCjtxrGVFFK|v9blHa)i`XK{Cd%WikaAGGm; zhnTPhLSWcfIKFsNKcYI6hsWJG`8-TtB5eD7VZ{zngXP|Or&2}9&@alQ*6gC)q~NB0 zrxhQ~t!}}^K-Vtn)680spbHlNE=sQ5UzK=ECNV#e6Mr)g2-^9+$CO_y(N&JW$9mZs zZQH6A1%w*o40XHyO58n0y&u=n`$0EBTH z(RIFq29*_VUW}?QKyTsoF7?O?li9SH`blZQej zTk@P<7^u7Z>p;fZ2)3?hRyu~9vYaj1BsP@{fG2yQPV`Ne23Ywkl~9%~tSr$R4{G5` zy%02xva@~AEm>6Nl!9={^{{HU4Jev4i%|b<(D{_qs1AA>>2~_n_z|94)=p>U)`fIT zJistFz$>^cy*ovY>kInjtMreQhW+q${~sn^Uqk*MfHD?lLt4u2I5spdvlgQEYYeoO zo`|3n$P(6imIsJ6lG6rC`tG06vM~SwX{_ zLlPzY2IlE~%8l^ALGs5<&_Itjoa|hf=F$J_B02;QGbhdb z(ibdQHLnO|G4SwTr81K&9roFWZOU`H;h=aHtEktRfcvDnGP)ka9rkvEMd=}(e9*h4 zncNiYRFEa25kg)kH|Lbd>~t(!du!uf-Klnw*Ee?6ovv?t#)2woq<^j3f1kdQ!ysHB z7~HF_xt|HHp0X!Yip`?lyWL~ntSGEEJhqX15iXUOd*brLZ$Sxdc=SYRlA`a$?qijy z?%j#PU;(sZ_Dw0AldMyYFcNvt4R}I-!XSJUWDQGLS?b8$L8T_ybfx-$Y(#?O(Wfam z=)zA`wNkRpmuQy~u8$^MVGb>;oK!EVOX0sNIMqu6XX z+Sli_^k|XdXdUxu+~+mCi}GnV=0xXP7hr;M&qifp_KLup=M(sPg^< zrv90#$f@$GQ}^I;{!oOb%*1G9e$M@SBfcuYpaDn#&n6uX^;YdxZ9l6zt>(UUYc9c( z1uE}8ZZpZeYjY<~_NX*1WaV+VBSLNiJf4+G=p)2d82e}tCfW0h9i839a=Q^Z(tU83 z-(3Uvps|m4F(S?Kcb;jNV_TZLVXMvsOUac(`T(~pO}Bo_Q6+LsB>)rtv^@fs9gvoC zyvo!v91^AV^5g5&HeRn^*Abx*H)<+Zs<4TxugWd?5=e(bt z*!v98pI8B${6yTj03#5WZ#L9GMDyvjTK&nWb5Vq5dU1dF(5{7VJ)Fk)qm3;1tuHk; zr%??;eX|R!A~ccgKOjw;+tukOscWQVLsH-5}mE`Kf|WdT!_q zRax~B6g6FBS1xP|wX6+Sm)0oc&W6Lms6G1jQR>?sVnU5rB&U6@P;bxjEJRXr6xTMNu=HCwnPQPg93{Ql*o$@?~O)i z{i-sDO!UPYa{8nCVdnL2!pfcMJ%byWHPv!+CFS$MiyKljQykCHS*jI0P&FqF`*MEc z?BmaaR8|I^)-b8^=wso(mpa7wVI=<6Kq6OhbZJcbbh(jB225+D-3)#r@fUK(^faDA5U>Vu&itL3D^sqnQ!;qH zy!Jjaf!-m7*!tlL-5+yf$>LUL#Y!tJ={j}TZk)E7DN`gs= zzH#Otxz0(rA+SqvE=;X9`Lu|_hmIp9!BdjLomF6sJsiG&q7xWgRB*CNYa+!o8HU2= zTRBXojLa)wQCb6UZ<3MZQSs9p0$ItHO(U_Cd}w``_t}yQrVg{gf%9x$W0Ev3?3eGN zw2Ftt?}AmT4B5+rpAR5Ofer^KLF!eny~fnO`MEp0*8Q{g;?crwgQ6s@5|~s2U{FV5 zy8|%o1LmHmrTLSO1^lnX7l>xc2NE?&3>>NaHe7V`JUO|YzohA?f$V~5{`f+r+QORIqjb+09ZfizgelIq`Nto&7;2fDwLwjF3 z?=1O*LwW{t{k21NYB}K3%WfKDlY3Md0hgaF?-XvM8Jj4od2OtRdnhEz7FPPie4H8B zc;0ip1o}iXt$rwGbZ34stttRl1(41C^7X#o)#raIqQXjv1Uh7v9_;nT@~u=8y4Xis zzO9at=E=e5JXF@HVd`d3UPHYNhqzRdKL zc@$Hbq81q~39W8!pLN}MmhAsN|kZmHfB#!;f=5LYgr09vdsuPs}bdE zY;Z(zz?h*kCS1D#9iLe230flT6k5M1emr#%9vrdu6?{;(skEYGw=|dG16#l#$F{Z( z&#EAMq)#YO;<$-5;%8+TS}X5S3yd}hXskwuykI)zLj#*AO2|q-^TQ7&{!{+{UWg`j z8CL4IH#{qMK8`@Q{-D6)e{3c#_SWTNT1I`?f?rV=C-cMBrqZje zp0OU3zb{RP$atf#CnMeEn$bI(inj#v*Ty!5I()yaCPH6Nx|SXaJNTV@&>*6ydMti7 zx(wEIqUmO$XP-%cSu<2AY-0Be&3T^P02V^ziM0%{hu zc_y)OEWXb0ltM76x!N<%MoD(zMlpD@fT4RStT|`OKJ-DW-Fh7afD-6_dm-2*f6hSr z&D^_uni;ApwsanNT~%|RI9%EGUhUTTOG%5f0f|9Y=Fqs6k6WOs^S)rZ(C4=qp>76g zlT}*7CoRxBS{1=}T!Ar}n*i(WtFYmx_h4?a8dIxQW`^@pC6c^L!#Sdn=ah^wQw{0n z=uGdOKOvRA?TJ9|r%9`wVsyyT4l4o%W<_W=&P9Uh*FL*9_2uNynr_!Ple1Q`ZBAXB zS^)qfraWY(8`I(l^1*5awiy#!8iVF@ZfD`D<(D`IgpO59WWrqeZk}}9mi8ezM<1+@ z!$1I@3Sf;Hg|;vwF&+(fIztWB!2Qe!hx{5U+L3g#0JO%T6#kj|}n-1C=!{?iOUNqVU2!CVCb zu_1oJbzl4mbWWijw*(38=G)scTw5Nr?Hf{B#`IYUQjy8dqQ<3%9knX&$Gx$+{K0lB z+13)-1}W!Pga}rw1y6gcUVBwON-JzFCp%K&c>hNDqeH&eaB#bj(Ov-%TQH}Aw!b49 zBEx#R*lOc!(G;9s$Q149G8!EiS*Y+TqTVJ-$Zr}py@>vyq?om1Sp1?K5pf@{EpFqK z2QSDQECIuxFSYzCj9KvWkev}0}d34||3 zS z9+bnh9Ms%0^`K~0>9Mp7k??`ST((^AX_BN^h1q&K8xWAR$!$F zO9rgbvyxomT$JeCi<13-hsTyCvvM(k=_XU2ZekyR_wQ0R7|OQ$^R?#rMy=z-FT8YW zf>C-L8iO5PTWekyfeBpdbC=FqfeWvOiu_u)hy&Y(-j|=`tk3n|IJD92^%z**UP`%s z+j;eM3xD#=4K<{GrutB+CXI5tW z({nMuhG#b->k-=Rdf9il@^l7VDNVC?+$Uq(`4+Y7tbC3!t1dgmF{374H^NEv-htBZ zJe7-%A8IN+!acb1(zMsXo?{Zm+eWz?XI_@zGmG6zDP-#nVZY(!Zu~xS+Y(tYIHoJ- zUj{u{gCC5Hc{yp>Q)As?VfDIAW|Z6lZc_BNuac9hr*7-GInB$YrD7bGmYFtredg)T zv#(+$!Fv}6^Riw)LZsotI$Yr#FSDiP zm5!#$?jRr9>sn%%@!y5!Nc%|OD+C2E#Q**1-||Ni`M+~Gnke)n(A~8b8Mm5R{PqIV z7#xX7bxn|h*n*zB!~s}m6R(`5^aWAa3EaDdR#!5nXUX#-mEtVUDKL-mPbCU^l_=2B z47nlUAJpMR`(F!~a24U`22d3$MC?+Tse$i*HC zzXuY|nXarIZKLM+^Ewrfk19*lVv$`tlMDs$s>N+|C@xdA3Jx}Yt!#KENSJkR8(1GVyzD)gt>=nOt(8LV<2He z=X=z}M0B!Ex*8?1UN9C1LcsZ!HP?LibsEoe)(ZZdg@4uFrG5vp#-O`Dc6Qg13Sp3a z3~Wu$>Z5`UBZ^8r3bw!~z@Q`y0}7bzLVtBYlG&%c_~XL=q0QO+ed+BS zM6d5qMA~pzbRoDA{&DwARl!EmQM+=iS2f;538J^A%$2au0|NV(8tK##9LBQCrYV-g z?Ni8$(sI5(1OkFyrX;9{i4BNuaPG$JtR~g=Fl)C&;9j=+kR$=#TT*alRvIirtr<30 z>&Q78l%2s&nf3H`$_j$_#l5-7Js0NBy@+ysNl{i>I?TTf`~wI7<=o{8IT^dNm=R+3xdsad zjawFUFDc<8x%S4_RAG(h@0UL{mWS371+Y)nrOu_MX7hR(zE!hSPA`>m7nmBW z;5;4(y?m31cj9Q=P++JXKf=><`th}kD*VjK(2Sqvdz-&F2e3T9Z?QE|*2gD?ajMF+ zD!ZWl5+!`7Dmb8nr!0lOp`Vk!aAF3%vn&m94zS=m#4&aQaLqJ5BPCIRga-1RA( zXN|t>m<=@o(08}P53!|a-+f`T!diBYZ1==3XYH4l3OWrd!)?bjll`~YoP*fqiaY3+ z?swb@lSZ6&xSD$f;bPI9%YIlNdA~mRvpEsjI<;gJP5DrmV-F*KJ{v3I9#CV-*^JV? zEcV>-wO2F(DcU-RIyPFj@%9=zh!S(BuP& zL}8c1)aUAI?{70S8(e0c&d4(?!?4VMe1`wfq1YRRcY~g2-{+H3DHfTcwC>Xln;~u09exl8-|pbl{X1>?(>J!zUudn^j*`9Ck|}kD0={2b%-_h zQkj^KO{!%0j;YhQ(lM%&FyIJLmYQFfP8IQVPtUW2Krbd{?_0c17cFvH0 zDygi1T{C6_Fdecd{-}v(J~eRevg;)n5PJfPEJ+)xP*H`|eu;fxrKs!k^Y~en!;XK{ z`G074W+|&*vyNA`pbu&9NNtcn^frlkxEBqUKCDw#(Dz$y$ZpRmU*7{5m(zkE>bsQR zd90&eh1tDv6>1dfQcJU^;jPUxYQ|)&jJx-5w$qF|E<)hkgf)&(emcC@>)YHgq!B^PtP#bL6=B0z`#^j5%xAkrpL{l&9aDu5Vb`)Tw#pKOOpM zg{V)o>B}Y5Bf(Scp?{C?|3=LRt~B-MVEVri13$22|BirWob};!YOFB58`J^nS>#g7 z!u2V_$bzUJP2sBWvFg$&$ES^7he;+-(9gKI_=(5rIQ8GWa7eWekr@oni;hF5#HaAQ z#h{SGx}|Lzls^?n(G#GvPCd%^HJXw9=cfG zA@nOsQzHOJ7%zV=ZR5aP)6{%EGkK=8Ddyv{S0bvw?;#wtrkSPI&UrEXkel6+h6;MH z=%4j$Lp6z}-$m|IE>P@C_DE>AXf-`jM~SO4FMt}c>QgxE`GfF9FTty!4{iOwJlWF! z7rpQ%_`BzQ>NQwzV+)(~CQPt=x5G>>X}h*CTsghq1r{?{^i^eAbK0x7ID5D}DBqv? z&oM4gjF^GpyX)IDdAIEGk4t!dG_1Y;f)3Zcqr3*`64uSDFZyT}^C%U~jE~IgqZ|m7 zyqA?452ax9zDFmr<@O5Do$W>dEMhT*Zw-g+Dr=DEa&YrQ^-4{vX^8`~T2(lA(mF|Y zu9LJ7j;OtvpXQgmjyFV(=hb~g3SXPl03P@S)b>Lw{hA{S?dP}H2WJWYu-)VREe4R4-N0#*O`FYW(Nf1F}@r@_o=ujyg8HfHDgM&Nl-w~Jyj zRGBE*!X7!g4X9>Bkw(q5FZ^(0Hq#;}M7Y%DBQ>RB?y|mHx*5%_iayt2u@T|B{^{Km z1e&zKwAAf)Hulk+ECfw)0a{YkIMkUggW8CufX+VW`bZ0J?R8+X@znwDuXLoA=!gHa zi~8%>Uzu+tFAEt1v1bk1wWHa0-NgB1<)Qq|58A4oeS~0_lSr;_hD=V}1re}qp{w^D z{hlu0xcrRK_!gA^tAj_Q+4JFEF6}+V)1o`}Loxq;^~#Y?dgWY#7nfIGd+)hN zA|M0~=lW^@?m|XXJWg1P=d(JaI%4R&7bEKo&kBE1$1E5|4(E;5vM;%*wC3RPgLU?= z_9a(fRzAA*l18MdM)NH3GAMk<-iB}GiY~!C{6YKMPtpv=Qi}c{OsTeQ3&}Z9U#6DL z2J%xfCN%}$XYSVTT^iYbYBGC&9)u3Pjokt(?;}JsiqB;ff21!t=S`S}T;%Qh zLKvQUS5}*9UAQsRmPr^4+Iuq$tSM6B;~SWLsXO2=b^MVzPVNm-3pRPWTDhJ*reWSe zlm4}|Qm)bZ>aUMrvN`uWNsHcjiW*6rpv}l1^vnof#;-+Ati6W2IPJ@Y|!Vb_%{A93K87gZ+jAmKB~+4cVrM+I}LINO|2p8soyC z=oY2&;O31oJ#UNwhr(TuLfI54XV^W3;_?d=qaLMQW+hz#Tih~AZsbO^YCt|iQ!q| zfElfkpYs{Z$xqLWOd6Md;hu98)DbIxH=R-%hm_$po*Z4**dEypxG=h*AtH^+xsk!v z*);4}-ZHQMfUhlT?JIcw`CR4~VA^lLa=mtWZ#EpJsX8Xe8}npD+~#m!!k|~aG1Fsc zS9*wjb|LUkGq=$DCBz3Joasxok(i4%t6&Wl)(w^Q_&G&Zz4z!GaS@_6RK)g%X9lqn zRh)1AfPpr*mgH)(J@Apl9;ozia6`gxRy2Uic*vmRXGekv3ly-WW%12WlN0Q z3?k{n!=kdqD6o z#;_Z#OUTQ@k$vGK_m5lgt=lDN3_o|Yf1A5n^>N+k``MQloG9vvS^HgzyGYK|;z+h$ z;`j21lEnWIAbF9Bt=UX%5)bN+}aUt+)y6Y>nvJYJnhLAF?rS4Nw zvvdBqTJj@K!(IF+VDM7&P9DfP@x0TkeY{8zN6bdrd@T8?{DKefF4VZqINcD{%=hz^ z?n{XO71&U2a{;A@eo z>96y+Y#@Wwpe41sEcjtb|P4_q67?>FL##y(=&N zQp>lNt@JN}eC8O@=mZY6d_RvxwGHJo7eO3khBC!H})K?Vc!E-vu1$Hk#$CWpp{N|SWcMs zh8w-3cy`P3p5`Sr)_H%_T711sdxrV*^wGse&H=iRbP{DrJlAaNID_!Sx zo19!V&3)@!M-JyvV%b>IWd|?(mBA%9&8M2HKmJ+o|EaB3NLP>oXO-Xr*b!*lrvVGr zoB>h1+Uq|Ic;8z1Qhbl_V_geAzw?#irws7Z-3N7|3v0IIzTO|`r~mtOs?Bw#7@#cX znm@U@WEoLey*ZHMldZ&1i*?LccrSJ?**>GW`@a8^THm16d*r7mW%Z9`7&P8>)oS&G zs}Y7_WPWpa@RuE1#gwBc46y#4-$c6F)= zlCQegiq)qhk0&FEFIKSH{8u4Ry7jPU5RK@yu~)OHevk zqdYX4uhuwNMbWx1H8VX6t3GdHdqD&zeopwUM_q6+*e6`n{C+pla)`MU4&v$ zivpb+;%+)F5%8|BM6jX{KO3?4)s1YvCveP%s*cZiYWt!J6splXBS21qW<|1jgYUmF zg__4xDP`lk(S~r)-_?2P!O|U%%P#R4z$jlft41!IpX=?pmqsn?8EZF`p!-xv_Xa6H z-L>z-ybx)VP3K{Zm=)<+jnHMqBNzj_^C($jwP$f%05@kHzX!548P>fRXIyb zm9IwLoMVknJ_hI>Q{X{Xw*eQ*>4t-@Gc|n!B{0k4*{HL>HmPv2zY%Mp!TfuIf8I>H zm!&vb63;}So%V%w%%DDC1;|p>$2t$8X{E*PO{HQpB<@v)>fc-bpXa|38}_K)jTc3E zl=lq`D!*@;Q_Ah&E!E^ULjfv}ZIhpYTYPKR0<_~${LrN9jhKo>Lb(0FP&MA>?^)SD0UMsn__FAM3_{%IjU9NqB4TT()1;-Uk|ysZ3mn z)u4ntsD^xU1A#)3Zaz6Ml$Q1>LH9j2E?{0`y+mrEj^4QmkG2OwfAz1*;n@u>UGtzDV6%m%fs-0 z?>~KN@cpY`_vt)P*pBX8?T1!G0y;ALt#WvhA_n6?l5&wNf>!yP3a-HDT+!vki0^;r z`Cku(kNVm1`$tidYFj1q!o)2!ltfW5%fBZ0B{2*0lgzLWU7AU8&Agifww7ecq6Jqo~IeDmHH2J-4%IV4g#&DAy^1e2-IG z9uOeVK5x8{$uSMo*pOcu??OGN`?nb8LT57AdKgw%t@mZZ1cX?z{eqSLUMKl zhPf!+b(XFhcV`2W5L4NqkVm`LR+C62U{ZVUBjc7=x`58ndakIg*(_VRu?Son`>3G) z83fjNE(G>;Md+}7SWIxYzF)IrE}A>ozb#Yzz+zx7kJi{9aKLP89lLb1R(GjBc?o*h zL8zF`Qhsg3Y~iY$K|92pSe(gNlu7a;I_R`ViXM0@f-o@Q_-+`3-_wg2QN5Q(8N1$R%bk54X~7VPyq!ns4U|7F zKQGSV30kjrF(D6RdZ;>(xD#CBC|O?lJZeKXtVd)tBZ5u)xeMVplEy@8`u4L57k6JQ z=it*5ytn>7>G`WF|3SuAVU2I2J4D!%VGx~D^kHtc!mPZk#SarPxS`@Q*mo$@>shq1 z>v)*xasga+W8~4wQe<|CX(4M(_tQ9k$MLUY1L=^7>Pb1~*?P{nnJ3HnluPTabzOpO ze-PM`Or{w!oET%-+c&a{ssq zCW$r)#r9Mc(r?cd>)LVZNk_$_xv8ZUR)r<|uv=F@xl+Qgz2>Uu@nenCCzTpxQtWdd zXxNdHOkUn#cE{!(7?~DWRt(^#B<3Hs_-;9f3w9~{dioNWtGClyfB1K@1r+Xq1tNAi z3%lYueaTZg+mU&Bre%o^fdA8E)KE=$y=W%mZG%AN5;l4&c=e9vgeHcc&KIU&wQQrG z0aC-RagtZ$`bf|BE;b4W$u~($1mr=}Kx}<6Ei>rZixb_aj4qqjx8IstxQCbV%3tX~ z7kAV*$!yqdfr3rFEzlju?_9xOLOOMz1cnrdpDBJGFJ5Y8aAgH|Mld+$jQ7sMU1=R^ zZ|KstuIHHdIbtb$pQcH=ZeiA-0vfar_cw#09b6}|uyo8fauiq2GjlU!_tE8*Wynvj zm#xYn)pve5K?h6ghj1P<9FBLFNlO>UMZsJ6RDYdPbI4R8ZaT?NpT@l?;vR!3$@^_w7#cXH*_h0U= zoY4yGbc5GLnVeK#B3+!eb=--DD;AHxNUIObFtfT&;Kx;gC7FFlVIz`XfZ5c4xvm|_ zXjkb8V2j~z{m654^dE)uLS^u~{&5CiuvtY(><{0NtjvS2%ew?jHg=da`i$Ko$rO~B zY2nXgVZR_VG`D2 z={&uK@=X5FO%C(+iG}VL-RcyD80cG z?>8W>b}R2;4~c$XQEE2^(v1~1K5woQU1V5<)7W;Yj{n^ z=@_L8t>43#$5G!$pfft??v1BE@7ymsI0jQT4|_wQpF~D6w6;)LcVHork{|LslR3*6 zdUcR$JPcJeIvZf~U?lX3&QjPI(&qGQO?lIe{2kM$MRn>(2mj=0$V@&7M6H*)(dVeq zyYQYZZ|ohF&@x-Nz#JjsgTW1Gq-jn+-n}w}p}@NF&6O@4Lbw$E3$AaRhzAkNauF7#HxB=SS3d-~IRtQoO@tzYLS8Y_8VL-)^%MWgic4c_RH= z7AIH;GTDZN6Z8)*)ff+1_J3dmCQ$02DcfGhcr7VQZ$5c;UZCa5myk2&4wqH)J z6j`T2tQpG5ez0EEr+-1E2_r;`11_y+W@c_@)fTlw6IEnhJuxqn zo1OP|k$=~DWsFAg6i3f3YNEyFky)DeL-rh1i?#-}A=TcOKu-y{-FU?bqN&{N|`p!k2oh)(jk|x!jyy)F9$^N(&p8V1= zGRtqsDf;=Is0IFSi%Msh^H%N_qxpOKq1!t2|N7XAT?h}d5}D|mk|S$1M2b%E1i6=) zTQ!$kPUdQQ1TwW1@d{grwk^jp)5?}`Azv%l?<3iT`kN!cT;Xe< z%_{!O{Q7Sn=l{182Fh6#cmm=SC@Vc#RQC8&*+XuB(Al?9DkTr>=hB9PU*0u&yCTyV z)%~s5F_Cn0I|Ed}Lr>vdJ4QD)BkBU;RIr|cC(+F8=T=0%UBnytkz@M+0xj(^$)sM? zGXvv<0BlooLnFrp(!8-CNQU}H}Gj)tysa-QE z_4;)eKP1bXx0F&B(%nerk9dYer??FLJe!PQ57JR-6FXn0{K( z$jc^}C#`zv-koD`;50*IWkwVIIT?w?<|1{2j9bP0d94nrRhf%#Nw;r+czXyc)&?}6 zW}19mP4Z#3iGs=&P>K64wA=g&3-CN>*X}B@T?K{jMDVvuzvfrcRGjHx+gk$^&nMQc z#|+FZ7C>s`G|(+60H6D0sMbRDg^;hK)GpE0RNqUKTqlnLC;oFKr+)c!yR1!uHH>dx z*dD=@h}lalU$`~(OVj{}L-**uFE6QHEGr)EmTP2ImxC`42{+PNcH!BA#h{JN#=7)Z z=QhagUmvJN0dE(V(d}XB8!UF1qk>gc9vw(6IRYukNz&TNG#b_Gh9zRzdt$L1Lh8zr zpD4sMPL|}PF0bO_)R)_%ujPY?k@umF)%Cp{n#rz%^`aw7Uxp`IYP_dA1l?qtgq#p6 zt3v^HG`(|*H5yw=6Q4hyV=#d$bvMmdacDsTwaV@-O+tlSQ6Q~`XsSqy{>{Sk-vxQH;gjk# z0UG!?9}EgV&g zImki{%!JDUKu_C~U!hGsY5|vPex}_kz48O<9@k6Uon6DG`W$A_)?7Z)TMtq@;H@$v z)TJ=_=B-y{*v)**?U%&KfLYnx{2~)_*voh;;xZzH?PyfErIi!!IZgr|kyfJfppGuc zJ1z;v(y7}$lhxeW9~-S2i^>Pl@8!3pb7KPTUwILPM8krA$hwC{VN^^%;f(E@1SUbPXjmYN`>rlIsqt8GZEOIrecLr5ihnZBz@gkvv9#pY9Qvy#;g}3@IRqA0hvSUp z9JO+i8}2NmHTmr=L(H&9ms-*5b(E#XoXSC44)%tH(gktzzK@a~Q7PfJpDxI53KSG9 zL?!(AF)Vr^k6^VS8ZU2joV|M5ItGryxJ{_+oc0avcn;zhAnb^J6LAz#NjNQG#M)zj#!z~k# zK%>#BPb$_g{zz_T4eh+Z>QcjzyIQ(dSKJV* zk|iUZ2y&!uXcg{k+wH{+=32>$4zyJNtj!-nR_s*cGPS5Uv@>I9IKll$%Ym&16K6Axx7Hq0XLJtLBZNQYf-N69B8q*PD>D*Gbo`Zu zp=>fc?Sf?#Ya$Vu=TbL^;)FE%1STkZ0L$b-zs&G)}pjA7NDOEdqq<<{tT{^5SjLfG7Yu@4zGT6-?NLcp!_fPHmc=tDq z*?Y)rA6aJjGoyF(F0AQ|F9l=VD-u@_3fY9=y-0+F_wF71ZCw$|Qc_%!yrgxoFKQ~h zl@b@S)%NGcNi%d#qYWWRwt#e`V6@w@^Yu`I!}%ckE7z$|T8a_t0lnQ`z2PSgtvV0$ za6MK|k$KwV`=6A}EZ#vZe{wb-aCN2xkVW^D2l}11E^-p8^hww@)6Egh^;t}}^PoZ5 z=eqPTq{$)*cNWlNZB?LmZEYL4mh~jx!Pp4A1dOGqX5(ivy|-1<|NdhCXX%|a1gmoB zo_uoCVeN8-)&vz0GbVZN0OiyQ0(xao!Fzz5iCT<+#Roz&C+nag@Y2_nM26{W-qj3L z9La>eiS*r4ORKSmVCH%$tvcr_R)2ZlqaY#-s6b_f+`Fz%XWXp!$MH-rRC#;5XtU0> zx5B~3R44J|TUBRBlzI^X==ELQ7A3Q!WUtfv{XzS=&aJHS!Tpf=ZG}4+=-K=!`IpsD zf3vde!9uRY(~m83g23{uoyeQp6cod$>>i%@BR3K{Zx zRAfCC-cPKja4@2jPecH)I3s$cctKcQRK1y^N?N1W$54g9*H-LG0E;hag@d&z{#v%I zH76kNe)6ZG^G>*_mGlMjMxIv7;yAAK12cK%05LngSZ4DeRB>@JHt!|Jr)0m+*q|&N z^FeH*P@h@CpZ1s!^>V~)Ax;{xF6ty>vR~E$IYc3DcFcQItMX(h-Gp?<-xZ?F!7W?C zaeFz^7iZk*AVdM66xu%PtC)I72}sg$DI9Oo7PTd|XVA%mL0~+l(E3x8?C9VIUtYvD z0m@FgqcoD|J=H=5^}#Q_PtN1jKd*s(rOp-$TDAeY`=wpeN}v1zHqL6%a+m@%R8Dj< zhzsfc`S%ta$NVCAxE!%=y5!B$387y9JTUjWQqgih-0n3$y2sw&MWq?&j5C2_P-p}V z1k%a+#S^b|&7OnkLt!f2?@%}rHtUZ2qOaK+$+&O|s#h9bZSK=#t-Gv{=z5wJpr4hd z6wbmTf;@l!*58jOiCKRXarOI0{^#R2wijg0s`{+uW_fq^^bU^s7qecM7c3FTmO=5+ zOvOFDg4N+7<(kk*1C9+`Y&F11lhTl($GtY3Kju?>_VTrzTif9)Zo5VWLluh-_ZIQj zZ9RsANMDaxOJe$~jay6!WAoxlCOO;zLW>#OHgOO;pP01WSkkY*>S%{zCQKf}YFGPq zvxiyqeSFiFfMdchr4Y>(#I3~4bB~1>uLl?&96m-(#Co*NgRAQdA(D*PBlj0+KIuyu%clgZEMF+x^; z1PvT^>07|PyA(gcBbPTi*cPC31$X~Yw5E=RA93Hk$N~b!gnHzg&ehrH4LBzczB9IH z4||W=zyw{+u{V`DAZ)ZLg6e`tnf^r1EPk_w{aDDnH6@er`Mms;jJNt~iaL!*vqcWi zYrVG)=rtN~{e`lMBkefATvBm;-gJvr{h7{Yhn;PmPi-Yci`Ux1`uR?Rb02% z4=sriG8{tQv!|)NN%2L0!B69fQ8r#%G9&{)PJmJOeDvrfKcgmgH769hDyYK}beeKazZAsQ)Pzi$1m-06|BL#aQ; zwRSzaZW+r6H)wA*`tImXN#m`Z1-HA`So~X1GKslas-|fRTz*<>%%Vv^+56p1Cj00d zag;#b^{x&jl?<}N5v>YeR$I38DM$aX75$QGP2Y6_tgT1oNji(kf~e+Ckw=hPpc>Jn z_iklM6);Wbq1T_v5~}^!7R-l9It`lK-i4uNFhDlF+ z8MZtnOVHG03Uzr5G}#st>ss%6(uYC4drmJ+4B_d?g)j{yF!;Zj=}*9b*OwuWU;TZK z`AA-|kClTE%vqk8UbTI@ZoH-@1yH=>oc(1PEz;Ss^0ySMZx{7>L-!XGSc)7LL=TKF zvRm`WwPtqfRJSO-1+9$`kKp24o0Z~n$@MFWUdl~wyqeeRDe;2t*Q(SB@DJRwt`VL9XkgS z1+nKEVxVh!FvmRWkFzK9(LuRKO_CdZ-TOYQU97Of(&q4?q4>m}9_v^v)L(Zn&79tC z-3k7c>seOzEcbAjS%Iyo$<3grxlZ_29gQ@6+mq=wiDMm(r}tTES=r-^$zOILQwMP& z>$%H$4JIK-cp#uF{jmi5G*1X+WpgFB45TOl5xtWI*gi^i!G|t|3~Ft6=>b_X&f2!R zIvL&bK-udDvvWIf-}^wT%OO#z(hG%a)O%}3@;4Z=0>lb3Gy26_gpNKU$5PHh3cMwqvBxYbIFe6x)1P zo8|ta^o{WrQK%42-y|WV59JUDD0eZLP5;y5@S0?m@ZGELet+Bl)BJE8lvkzviZCVy zD@b{uEa2jz+t0leVmek?#Ux!DJ;5#A&WE-CO$#xZ$(qchTtp_P_5!f^F32wy9Y&m8 z656>U72Es9m$#^|bYN*AGtjsM^~2JKt5;e_by~tm(GQt2aCtnpv;eLT?!1xl4tG*c z#zkJiW8Ow7ZWO!R}k>0jn$g6aB_l~nf69yMYH;C2jVd= zwy*#am1pA;b+KmiOI20N8>d(@vIGmDs+XI;T+UVu?(=);g4Y<6a?28zU=lziL3L|Afzy zxVYLsz2M~pQ|OUfZw-P^@giq*t5H)me+gFPIx+aVOx*#m_L7{}$^m&J@w!x<=}jTW z4XlyHr=UFzg3ej8mkSROqQl;7=g))ND#@y{0;?mWAAf)1|LpOb9*iQSKg!8}AoTQ@ zhm}9wz);CkB=sh_eP82HWoT+Qu4pmp-DZ_FSeX)NyRvBkm)a)4< zFFgfZk8Rm?x9MCh!j(=YSqF~~*x7SZn%Cmi0@uDvaa0gbT_Bl7S0n~rBp?0C_3^N1 z3Fbjy#F5efKPRLGr#)7_b60$7X5}^SNp|Z}?u@}5GzVl)ytD#MwARk)_8319)4lYQ zn3V#-rbH9U)9kUO&& z$JhTM{q`Sc=)?_hq-@CF^}%n!I$qi{XNEmL@$KmHh8H;FhfOL?VK({o4dyW)2WY)k z8}d$8HjaVF0lJy;U^j45uQ%Ib+^Nb{W-S%uZ_KT9QVvQv9}y`Bh19Y|i3af7xyDt! zS6qP_Q)kC6gEeQxV^V&2RnWsYE($T$c;+~So_wnyB!$!Mz``(SJH#A8TBYX{S{s=a zZ_hVue(_I**N{7E!Ko_g1}8sBAaV9K!-*Z4H#S(KncSCWG@HHBo`ugxg*B#7FMg3n z9lZ3}Tv4^2o9-4GEJ0P3cE}mFj2SBma;rZJ5Cn)vf@rN8v;Tm{{O_~e-u3D z{5P$(;MF40+p`E6;#@c-KX*`-AhDO4weiA&052_F&m|M}p0d;2Z4`r-7tb^Y7+?z&}2Te9N2FpWlj zPjT$%_RieKqu(Cjo1j4aU{gi1Et0(-2TC|3@EhF-M#9s?mHT9^JthYqn}b4FvicSc ziX}w<5L5)HLsPnJi=LUmAd5cS)x`dVOyYz>5RUX)Z~x&E6_*gI+`= zcS9h>OKnLH2Bxlb@Y`Oob#mKWOI1#@Jyr-ytP_TPtmE$v8mET`KaZogY#=uz+K*(8 zOGiqRKX31s0@bh~qeq=Kodw4 z(Dmf^@25SUy_cWM*t$-_>kne>S2h(?=?-|F>mxk=DCRp`QFzq8Vj+fQ<>1pW=)8Nd z2dt-FG?|cYIeyY-8>I+Oh8HF^F4clO%LISwg?`V0snC=z&4D~6=|yO637Wur&~c+( z#1-$ecz%wqAM~}Ri=3>g0`@TnYxK2y+3d2SCYqyB^)Z1{E4BfG6rLF4)*yQ$9VwX_ zex!PHwz1A1+6n(Q4cylJiHb^1l(H`rPChHPxfw@OTL!b%@>*&$1 zA%1c3fo<6ih@idwQ@G1nzPnlCXWaOMEoM|jR59>3-u%C~?WxwVSaY;tOmw75pA^*$ zf;FbOL|%+YFT^4)&t#?A*2GL*C&02O9`+st8lSX)DZy{JIZth2N1JADDMH*+%O-vDOwrJNSSpiE zm#gS7&sclXI|MFn()1nee)u&(w@+rb4}tOcoZaOiom{JVT>XTAEFb)!0(V+{L(^8q zog7_H&yB^=4|WYzk;op{kAJwBx3mN;u&G--V``?m84#lEqVSPGuI0y1MJac;gkh&? zqv{L}2{Cj7($y%u83VdyqFVI6)G(O6!4y~K+A3?%s(P`AYU?U^X(TZK_YqSY$710q zC!2==w^`hZrL`vQCQBiB$LOz+N6vYxrJBU0SaRx&zi9T~1b5&2!x8-ND=zN*%C*`;1}`lRU7os;&%8c1 zn^yd_Z(rhdT!&(IN!)YUA+;-ICAR}Zn_yUtL+gQ9Bg=p?ioOfQou>-1v79=kBdY&Y zE4-Mrp#HC$^Lhn&)^EoL?>~+!oS|DR zVrpe(vG(oy`CvnD)+n{FyvdYVBYiFHgjg^(cfJek7LtXj6}-&qw&*)esQg*_$vylI zML>~a0QkPVPhsZr@@T4UI>3ML`iQ37t^a1t_$M)bw_jZO>Os_pq07xq0hpq|-ygkClZFy$fCjQ<%Qe@@nGP z2ud7PQP^{++kD?~dg1lk4Z*FLW-SGY2VBZ3 z_C!Q-NZ;$VCHHj?h3B^jMbE9WR8}bAE8mmIn*M^B8yH|@`;+>LgO`kOHtb@QMKvn; zHn3LjJat$SZ4*`0nmPKVaha?g38SOj8eMDpfItx754IP-$ts3>X6l_5$C`Z!>m5A) zdFsMS==`Lv;pm9J4>hxTFfqffPqU9GqZ^%n`?*Q4`enfgA{tk-F_@IpdEmIh>%DTaW!D{asM{ruMOZfN}f90D_bys zXS~P0~hnBJMuC;?m`CHUC7^APQyCp<+u~BiRvAPfs(X`Qve(A!C46K0`>Lc5dI}mp#+{odL@0 z4i|eA3!a%FE+(U^ceTRHg9yaytJa3{H?zDtl^dFkmzn(5&HOp-cYh)1cyu_w|DOaI zC8l5i?(O2xG6Y2>g7c|PkrhmkZ!wH#pCCM5eo@d7?l!Z~0t{GJ40Z^OdB7)fXR4tr0KVF$rMU}J zR>mOMsGaTxYGJYajRuj4n-$ThtSkzpaB!cvOa;*l>qnfc_Jk+cDWg*U}o-s#Z0wS z|Mjjma~-vIOqK%v&;G4nr8wPw^D&k6By!*t8VV2-J|i8lb&Axj-LTibF#r0tolOI7 zG09H1Maw$m%t)!8a#Pz%@T6;LSad+V472Zo&>m2$-l7^T4ILl3A%6u!> z_Nr(J`M;Q+FwN4~cU=Ak<`@79pHi;*A5KBx3_z_Yd-V91hL|`Gl~Kv2bXCGY-9}O{ zc}Qk=c2D2n@WcQUJf7M_SNq=5)oNl*x^G`h;27C zUqGNjNBJORuJ0B|RB}$Sl~Fn6H-TTb?va%Cz-7FZC7%jj(d%-&F^cR7Y%qBfzPTt^ z>0ImUrF3>uOxQ;kNQK)Y5eN~A;Z0Nnhd;AJr$_A}5N6y3z2YPkh-#_@tC=h`_xK4u zM2guKi!g-?nf%?Z882d0{7-eWaL@ct0~NIuch3OPbkn8aSm7OmknXeAsqm!Y`c>21 zKtSO}2I-pb&DqAAe$RH5YyZb6JZ|FP=C54So)+fRnMg0^u(wq%#^ZNu1e4c28S)u} zAIdmA-M2tXobt2tuljUG-TDy^XwEGH}n}O+Q6D2e}Zhw@}3R z$3Lm`kDOIbxhji8hkIAL6vm8%hxN>pr!c;;0BPd9yigE9Lgx7<6^0UyqkbL5s&cx%6{7iV2Wnwl?L zpW8c-Fz^pOc4*OE!v-~6kLYXPh)U#;5{cOB9K1zRa?@?E5o)r{>?I!#^xO4`@<1M^ z%#}x6ZTLfQk>B1oC)k^c<(}9P=LQX)a5z(vxF%5ae1YyXRjyQK4v9xFTudIF1;V7L zkGM{DilDy?^Z{;>$blJWhfy3R(Ro(okIys5QgZ6exi5%^KX3?)%ByU247`$G>_+?`vhZ^u9ti$PNt1$t%Bkn) zk`aFx74+LE|2O4q2VYiz-mC{vdL;%oz4F9=JSQ*xU2*bH)kC-){h-0v%l(^2{I{qt zW8J6%W{wV^+Rmdi++oOW8a^}@r>mYiAB8L>!-6~eo*l#X9cKx0SfiguR;>^DVfH5ls}w_$-ARF`cN7OJd0+Hv$2eXN(JlXl zNIMTUBw1}+CrE8z!ehxN>jkJ}4RuDO#vsTDF)IeyRk|`ME;+VNbNpQ1aNojWd@XYf z1xHVkW`XS%?%v`$IU^e1VMI(9F;ka5xPZEYGhHoGW6yizCsll5{T_rjcP7({pV|6& zSExx(UhYH&L(ovE!AJv-4^r#@)1T8fP)>TguHuN+acRuGCBlf%_2~p?94Qy^G)?l< z=j{%s=`Q0^774?o=_bEF!Dq$;X}?bRx@xazLeoT?p6xsJ_8x)Nq;yVCs7MrnHc<%g z)bdFJ$up2qbR0MM;Xa>v{tZUqYC-aJALtdyelO*25Q7RiG8?kO1|>7OC2H5LU#CH9 z3$1rhAWiAhYUh@7|Xkk(l8UxHpSLq z;SP95Uy-%RxUbv+Ma!udi&|AL#7=(DxcZ(LGWmfPVC9%{r8?76~R>GLML-OW-FlOq6cZYRvM{qF8McDUmAbVQg zcKP69^sa7NC%?7V{VIn%{mPTSa+%D^uHfS9w7^C`M(OHhX!$x7TsM1vzT0gESR7c2;g*YXoLfs7h-;1cpk~v(%<)mzJLFOm*~#~Q{>Hq} z;;09p?p)NedTkDE6J$0cu+d)WUqA5)pZTl}j#g;FeHRW|pdt#ckJ2~(+~7EjD9HJ5 zfiM5GMg=iHbJ)H&Wb=B&5;@L_xy61TG1b{CUJt8NFSY)!8WTqjlO zBk2R1Uv09d1ZppTqDM`N#|Rc3U!?mKJK*dZMuc-C$IiJO;be2FGGAC^&}{CZrk=)o z$>hwH8`ozDyL2sp9*Xq^7P6wI7-H+ux_6BBQch`=txl@aLS~9_Q#G^4;{E>U{NBo5 zJw39)_`OBH%?j7@192sbdHBc0YxQY^mCP?LXg(YSt~{N1L2)6 zLdcVxwgSmD+ak~5Gm2;C#>-HP9m;95K>Nu_%Cw#Utc(gJdE+jr=1=?kc6i67V8b9N~8f*f}o;Fol-R3|7sZ5_DV@u-!t?GKM>lv*SV<_< z^630E)AZj6K@hY+5slF0<<%=*T;5TFX-m>9!54WndnU%qrJJx_dCm2Q-w_C2vTXCr zbJv1^QdndA12kA*LN#4n$W!u(T`*N^ev+s}sV+RgrkM?zFfI!|oZAO|EiT;jl{~%D z_@12H(dcXbUMUwyzbvO z9yV@OTg+Z*p7pcg(-XABkLTi4bQt9(U>3IyE_5tcHQn&Xe|jiF7HuS98jY+eV5H@t76 z6`f*&^{pf++DHT@TqM27caKG#XI2%0@RJ?Q6lN@hnc zcw03i7zt_Ts)Hr3k`!Qxz9M|F$Mz00@-nYaW$Tg4U1yF9^os|4x(Nj`(F5Bwu4Bf*N8?n@_GyKjL(9qW=uK_mBVPaT_T3E5W-`2YrKVeC%yCG+((dQ`DhDsuI>@o8z5MmNRq20R$vhuo`O zJKtnmGUO`n0)=)2j)|W`ZU&S0yr*o{f^eM5GFa(^vyDMg2i|=jWcr72;0Ca-Mv?++xej zt_mT&)8CChAnF8=$)pu;+4+xysY5G=*widbt!a$Z##GwLu=9k9OyJm}Em=SIyz4vR zgfb!@^XI)7GptZBa#r>^eNDt8pV8Sq>%xekX^T)yGm+Q-?fALO^e`{{^GOR^))R%Z z^{glCsMNF{_x&A?v?ka|apfGkqp2rz0bo6IJE~}@;+K#_3vZqLN1Q#-tJ`)JwVZ9`qgU>z<}Nue&; zUiZVnP#7q5crMo^7$@tjD{0Jo7hg&@HWzowIKI?}O4C|k zXc~Y?*O{>9Y_1bA8w_H|c(Yf{k7o^*V~_{Qm1CeM1rV<*=9O)z=oWczLJ~_@-Q{zH!nsz2X&^ z`|gAHZ6YRbo*SgQkMf>$6cq$zNWCE=9U53TXtj~px;cCwQBXhcOOw>dq_!`|idDH{ z%6PhfZn8>k(1p#MuaIiZj)>Qwi*~beKQo7x)c4bKKEPxr)>h1&$PK27bu7HQq zylj*(RQV(~XjXR}v2&kE3SjOSrH9PT)}sO+lYaR7sQ={&YV}9Ggw^8v`RcJo&SIP3 zwJo>e)jp%@&=|flhZMlXwYQ^tk$NWYmyrhIF~6BI@=vs=j<<5Gny%OFNnV=Q!oMhL zf-u=09_p9&Q{Rp<9dY_I^-od*RRbqqoQRTa9VOoY#!Pv{ru5e}#PuvT{zAQ3Niu1E z*kSLx()N*g_+zO$lUBp*^WZpF<5B)}*E8Pn6@R7k&e+wBykBnx_dvdL$f{IFqJuJsg(w8QfUV~27oXe7M zCva#H8m~y6fXtJ=NvxKfHk-9ak1fDiXMETU|MXoy`BaF$Ih?!5(7+o z4FXs-4U)u6oO||@IFp{$ki~1*puP3s;wZ3eoz53bDd^ov(d-7PpLy%c-?jER&eCM-Y+9(7gv=GdY@b zBXuRxIq^4jnMVjJ#dUsJP2^TcEBUDuU9d?rn@gO0d%kfpyy#4&HYVd!{;r)1Joag2 z<8ey=;>eP~ft5NNeJ$f4QcvGyz*L9rk*J2aYBPGP2Ru2`B$zFlO{JXxBGy6Y*&HbiYAOo z-MM-xL*+E@oChrVh4D>=XJhi&N9hl$Kze%lQnktOy9M26pdHK$qtAW;VffND0cb%f zJ=aqnR*(CqF&;YC_Zs2?WRsYkPTiDMgQXrfh;rP z7a{Km!bsWJO=5yfg`IoL335BSH-s}I`_49L?YrJzXavUk|H`$&3)2M0Vj_+HWOGn& z!;n8x&_ze3KU3L25`-tYO&2fw%%(Uvjakh;#ksd7@AutX63$s(&{BHeecyzNBA{CO z*IVv@^ozbVLqsMH53IQVkr@AW|0L@%Z|II$c0f|6UU~84`SL+sg}bvr z@$&nZfWEF4BvBI`LBL!bK(JjBIeKoBV1UhZIT#MHRkW>;tLEIU40ib~OH;2FG;k!21l4qI@Et#I zdAogp^)k;$0XvJkMzpTYHhLu=tp3Qgt>tA{?ubwMl?zwK2luhA+cAhf5Y_5cDu}K+ zZ|OTrCiPy9|X*}0+AA`WtrjNsCF?1yIXuT z2&^9LzFaQp$!;B;V@a!HExoH{AzxUYnF}lX1CjB#h_<$xgtP67q04&Xul+MDl4}!3 z!l#b=!7dqOoZr}DXD^GZiJvuBNv@yLEW%T1nmRjcOvcT|w-ISXP9J zg!+_tyLn)z)jR!+Ft9&dF0bpUpCqppcZ7pLGStt!_8s@A~>dkl9 zov}Zx`a!}yN1iT2AD*ZDJZ}-4lsxRdOR=*o-Yn#(^ed=neg_Bt0<{TZ@xDjfL^lmr z8sD&-wCw}Jtw0rY`)R&eV!JB8&C!4&9|xP>bua4xSz6xDp$f2jlYwnUw+yJIxkFs&^ z)0;AvHeE-F%#LLcZ9&EWPy$)zW|;+ermm@0=FJ~_EWWYyW{QkNdmEBbZ8c@3j4fHz z^D?tiw`R$zmbJ^D7%kjg5Yz9B^C^hmYR>NuE3n!On zuV-#k0U2>8k90HqFiLV6Z`$x#6V0zXWv|$q#y>Gw@`f&|Kkn&!xE?;wG6+zIC{!=( z==Ho>xAUzT+1NlrZ(UKFNIn%C6J*%7vD-&u~K)^l$n zgOPJDr)ziQWM!##H!zrnF7>JS(7|H5OMwvZy4NNradcc7KYw_gG`d{@z=l6AY3_C& zP-!!pk+bJ+LVk$1YB4F;M-eid+MeVriI^!GrI$w_jdBsS0O*x}q$2p2E9*r6tG4z1 z68lDDS=w;Sxm(JMnNhghhyD;hs6=J#Cy0DWXwznr`fU(Rn4PAUfBLshzFDj3=9MBG z&SpH~I^V0_e*M2rG(JW$GAa|&i zOooG;?OExvJZwzF7fyscS@y#gt}|pP%y>a9gFd2gn}eO>$aoeD`Jlxii!{r!jg^Bx zy~Oay=;$Nt=Y2wqgX(i=8%g~bAVA*c@mz?wa+5^$IN2#}NlIH_)G zlm@qO>XKba|B*8VJW0kI3`&1_|5$NV6TH|uNjZmoeEw%n&HrNwEW}894UeadE)Z?y zm%)^h?W44Tw$q!HR$5^;jF2*6bf!h{huBCC{ojOMZ6&outsyjuZG6LOIVTdHVdwAF z$IWbsY*fUQH-Ikf2OTQ99!TiwE@n^s%C(=y!G^FzJytm_+a#U&?VmfOe|Wzq`Nn1X zF&EpmN$SzPcDW!2d3m-(gOJbCewI)lrIEqSc*Il;Urp3$ovFC{^0m(FxhjDHQPc6x zTa_{?lA=0#@7{ifIXQv}gO4K&FIB5VM+@O;97{J3=!w6UW38gaYLu2-mzkqQ;upy2 zxfC-74hWCzQO^t;ag5&!tlb96%5@N}B9bB_*5SR;s6Q5-iAMg200|MU9V{|(vD2kH zv+VQseKnkYc6O$Hl-fA3mlF_uG-x6PgVm6-lwrS3KWZ?9aQ_c z-+tPy$i9O7CiN!8&+YKL)_kcqx1HarCCx}<4#fCJfCjB1+uHkzjg#W9@khQsf%~qc zSWr=-%`&2w?L*cc=sEt_9%J;17{+7cN` z8RMSOBlj%HO6zD)fw}(7-#1Xdfhqq%(b^AavmD&I*#`0}&tZS=d%fszu-}?^DJ7lY z`+OC-HnAGkC}x=FIX-cTvorW>`SxR`bBSr1H|b&LLhh|nYb%GK3cTJo_)v5I%5SWu9Y z?mmL$um=6gb!a~5Teu(RG+?tiTv(C2GQN>Xi(84#SxMM6DxKdF44p(+*H$_#WbFI) zMB2L&*VAZP#2IIoC$79UIay@`;h(Yw#y(Gd3~TsGP|oD+dQd8TN7hth03*r zoYCZ%89BTtOmJVAIYA{UDY+@8cfTlA%V&uoaQlAk%fgMcP=o#XzJmVzNT}Ct0`PN^7ukV?N45=Lt_;STWw})6aN7kKXTIc>MPL&-_p+zF&Sm=_q~{ zPnABBtA_JU*T?LswToq6nM+tTxpuc|GVy)k3-ENEm-JXp$A@O)OQJFid0+q{PTFH2 zm2WOTP4ZhFzzf3L2LqzbisTr6B@;4r-*l0h)2>zG??^=aJX=Ftbsr3zcs@(G3nC=m z?QR%`+XQ!h&3N^%B=g%nfkgkH@CE6<_@myc2Fni-9iBPfhG!sRYw=-SFu4dXaM&_F z_=#GYwc_4$T!EnD&UEv224Lr2w>8i+I;dI1@T`}g&d(k9$Jf?PcW0j^`e)3x!=^HJ zqoXsEKDBR5Rnh0HB0eh(_fcNdg|!Ta&lVv z<%o^c1x%i<`d&_Q2n}N55TIeR)3pa=3JM6uf`4Ej1QE^Gu3B35Jt2hq7x=bQL?-6w z(mO_AGeLh#*EVF{N6h#dvS;yTl~Q2)=S79Q^JWci4vJZ#Sm}XDo$N<{B!j=-_r=ql zi)!gb0ZO%dMkMj_vvnCyD`lnQ*TxQ1yBo8vkea1F@%4p#_v2q%aMzn|n$O$V!uq$? zF#;;b5TO_L?9E}3Nvt{EI0}x!@j$QqHCzs42V#0W;z&EGQ&${0^#76e-T_UeY5TA< zYePgwDFRYP=`~94jN<@O0@4Xpg@7T{(EF?)Dqt9s02)Fv5<=)m=zRboCX@)FcMKRq ziS!Qh%j~}2?##S9v%Bwi{(z^PlXG%E&pCO{eP8!=Rp)4Id80=z2tzw8_6<8`o~uu( z)DJCLjx(ouqn!F;aX`Z1?f2?omff5Es^4CkI}q{i)QK1fXpCyP7SvYTR# z(vgeK!VSqO(Q)p{d`r2={6)rN^%b&^!7Wy`4$#ah%$7!1RD0E1RJP})J?2`8b#@h* zZ}LeVZ&OLiMFvC6D|Y~&T&MYM1GScYo?!0flqY2=ju;Ud?F%3C-=f-NYPqH74nd*= zO$Ya#p8)AGAtG!1J0^WgaiS>tTQ z0Vou)(0!o6cmGm>Lh0;I6wFw z8ZvWO9MI&&z{uJKk~wG-3978+w_1`uRLt9V4BLnwv|O5-%0G~;`NZKxT5S}(1}h9!fgY*vAPk3Oa*;7 zs8hB~%%k3^%rs^Hl?oLL6p#{wNt{2t2y6-BbMEfC6IRQ}vO0C&IWExH zJ?&7?Ldk-tSTka<1W>rTHctmVcx+~=q)cPSa&*-i>Kcx8BdF#|30YY3i{ffC0M_c} z&e#9a8oy~Y^FKY|L_77G%V~O)=}SBHKbd26syv!H#aS(CEE+!EKl9Oy)aq+@48qn8$9!NT~gk z`q|MUIFq5knAtWkutA$$hQ0OhnH^{buFioJee}Eg!{STa-q@r>K{(=@`=z36>&^Q% zu|)Ax@{1lBk24?-YH0iD4wF;EmP?|Urc|p&@QE{}NNbd_kUL*ieck<*-qPrfj^&kj983|$S-gy-d7`;M!#rJ*>;~g5dZO5 z;!syGl;Rt@YTKY2r{Ea52a7zYPUqyrQv(J!MFG}jmwYG3HmzQo5;6|w54+bK9ZBQD zur$9(hMu8;q366WD$Jp;bTlo~20?ZIG&juB7gUgtWXPn&-20H?pOvPvD<~u6r6zWk z*2Y7+anvOwa_!&}h3BjG^WQ%@l}j2>9HGAu^KA1^eKLuzdr^{LP7!2Cv}rM}8;nZj zuaa)3h3voSK-G002s?6Fk(Qq#(eSBW$pbGcIWw!ma$(Wq!*#Dp4gZsvaI~>JKqYe4 zbeImk$nKdR#81l!QAaR@RUbLc@#{QYP7CF-OLTwaRMPX!VMifNtcr6d7f}j{eP`Nc z$g`RTb{}Jirh>fYH`I|rM8%dM2r(ZPl@6v%=+H||0vszoF1;3XX=jc_YR$m@XjH!7 z2rEy&3P5k0ygp0zbAY{|b7`#vId#l#RV`}Vee_4)L{fQ?Xtk{`B~VAfV4p zw>~NY0Sx!56P&Qg3d#1KB#YqXZV_>^&E_4Nqac%;Dm6sRK}NEtvbG6Ojw&X%v-@w1!xZ65`;HIdy#oOj|Vt(4| z!g%7#Drf;q?HKayD@(gMO>bSnunRBb9rk6GZnX%TT&Oe;$egj9YJ7tm*qHo@qh5{% zIP?I`E&$7k7b_(^JK{T?A#){PS&qz{|IO*Y_&Q3;0JypBhsa8bv4hH!#$56c`KF2^ znr~Zrwxg{+*z*i7`h`&vUU{{%@!x&M636az$;_g)SRlCKETSs;W0<@UR zF;gZMTOLog92b@8-zp0hxf*@+ti?|pe=WUesN32;jC#`@-422Ee2v12yg9yuas?;A!IGSiolIQ81vYf2SU7gP|5NWO7O<)8(3rMw&J+7)>bR^ z7p-{I8MFheaf7me*}0h4S+&cac57W%POW1|nWr$_HRn`rP=1Pyqqf}sTIH(34`X-F zuHX4)Kx<{b#vn7L(^LCWWRwP6azpIcT>bH1;R4@w-8ej(TtQV_9S(j3Ns`1e)2^3^ z)HM1enhjRuj7r?Cc!Hb!h-6#X%r?%o1UaZcYdxcxt0XDydUdv~XI!_j5b_GyFUXcY z#|M!UFvniiC~PX2-BNgdGgijBf;^G=8 zb8u}(x^8uZ4Ly4#+YEj3Q*fU_=Y3}@10dQ=LClQmt3?jMLh2iZk1zOX_g2qmxIkf6 zk14E8Djz|p2C+f;>?q~s>1?$njnJufld+1h7##C@P}+e4!(p+t=CqG^{+X5brL3~H4z8QeWU&@L#tL3s_ zHeK34F*67yVEOTYzf79Me-eD202bt2t;ySo;HWEP?WU|K1lLsiNxm7(41ymMhC|Us z9I>o9*YS?@$DE{#9J@(^z!JvmfPwVbdv4W#x1Tjz1iuQY1!P8#go&OepM4~H)av@v6DX2!N82xR0`-@( zq!&U;3Se1+L2$d5f;7?$=#%W6?Q`a3_xYp0i;UAA@0T$(1_4EKM`KqWklZ$D#7;n(vq7*;jw6AiP2Epi!!mQaWhL-uv&UT zLBBgZPP3@N2MDxOO?GfNRL5OSpvy25)*@E7Y9UO2VJqW0rA4w{A+we%!cc+LU+&>s z>^<={8lxNa`4Fc*0@-XR%grCYzDxG(MRd$o3Dcw|D2|h;dcihF_BR)2i|5N!I zmHd&T_G7&dBkZV>Ok1U6ujFcH8NAi2alXlr9_rA;n}`#D<%;$fU)RTVJM!(h3t{>Hf*y0=6F(!Xn}St zC|5WW_kQvfV{s@3JJc8D*CzQI>AW|G%|vrKb{wUe3XYu|>zR8zGbwvyzHo1t`;)~j zeNsFRUjm5}gT*I1=!)nRO-jA3M54o~dJ^uq{F;N@!K?5D&!IsG-$VGjmPl`aX@-JQ(O6mZs2&#?#U{5YQCMAZ{Dv-9=TA#lR5Tg?D__oAm(>BY~8ln=*} z{UgL7h0Ql81;jqW)!0NCY5Ph_lX}c7H7c{QA|plPNh&?ps5e>rPK$nT@zPCIas1BF zuLU~`I+ZW28>a40p~6gU^D<>F4yhkM>4vI1`sNcu{1;k|K|OR#g~-b>^XJ(dHpe*I z(l|HVZ-+{^bLv*>o+~83 z^m65}$1VxMQALW0u7Yx5=e+9xwq@`GaRr6_x^n0E7R zS?+HyfOg#|n?#J~!P7QMlP5QYu5=#nSg89crOPISxvPDp_4H>@AtwTNX`9U5mcpUM zK@r&0?_DDLE4f=j;AV)wyHf9Xo%o`tWyqyGW_0i2K5h4Y8U53KN5*;*YFNZO+aqMj zP&`!DSI1(%)+~+rW7O6)^(@!yIr1D1VW}%4+rpYH;8^!0F}*%?PPScHH)xuryj+5R zvU;Gx3t705PSkv62t3#^67Kk^qbvAtkGEfq#_x+9bcB^khxudp!Z*L~`d$4mo8r6n z!`F;!bd-!q&i+aWcOq8_u>-QhY&$ZiZ>BrGSNB~3HWY`3gX?N?hD_y*s>c-dVuGT^ zbMzEh=BECc{qhgSrv?iEP2kqonbtQWGl5sM zy{a=;Q%cB*PA-xM*+Ze(9m@|{W#%`ja^U#v1H80h-s6`|CC5Dj9(Jmj+0txRM>#!_ z^;!7G!4mKxpGQH{O{`_Z$gZyfd(2$BGjg^8&KoEf!<*q2Q$fkGo>JFV7V6i@!d`mZ zCyEy#$tDIOLFxhnv%TGu`I_J#P)!2G&*IE$6Qh??usiLmFIv!3J0D}E>x|S@3iZHx z+w*JH4w@R6Y_jJc$1BW0-ao{6Mduh=OKlbqF+MW&xsfClQ<{5iVyj~Qn6CiTQvK%>ugaL{WqWP) zo&%X>Bi=C~*p9(lN7uZ))F>V3`+mbUWgJhq8_nc3%O@`>8;!c!6W=wySzZ*3*ca{q z=@m7Eg#$;tJ=Mp`6(+Z$6D%rNC52}0B`q)6uIf7nLcR$XmOi0vtP#PJ7;Q?Nr~||| zJc67^SvrE++xvg(0%pL;?;x{V!qp01KR#a_oRqgs z#9$({Dfic3^!;w8{!!J;UoW420oc@yt4qVgXtccLQ2J7853)X9=0wqsws<0HgjwL%d342hEd% zh{@^fYlv4r}Lw*xjf{;gnwXv9y*`tdm2M zS|@WcC=pHl^312*U8-%-@;P+tB-a-5`~KG~wa|rtGBaUpUyF-}3^E*V%I&uafu&{g zBDL9reO;^glZQt4e)^wpYH9Mt4<|GRJe2gQ?^>pg$&2ETTQ7YIJCZ+sQBXg$_%xK3a9aPKLthFAt$V+cMEz4yu1koBOl9boWI+TMhbF zXqA$zPzl~YpXg97+b4g+IVD8|Vc)Yn{hb`u^SMEG*_fN6ev%dsQ3 zqQgpq2aU8WFX-YnYv(t%?4yOV<@@Zs2I7|{tFFJfNr}Dhh2NF$w-J^Q`Rd)W?pNd2 znv&|5g}E-jKaZ*xAB4aKgdR5OJ=1Gx^PG6}9%ASjz1;4K44HZ|*$MBi;8}$@dsM2_ zmyQ}MqWmw&`$sI>n|#&1PPy|5uPeMN7FTEdrotac&RF;H%BeKxl6dW(q_KK@o~bTH zv5=w#5gw1;Z)&l26u=FFl!b1lOe3I3B|9lD8D!4nU`tbG(OzM|GoU@&U#|(DViiL9 zL)(7ox&NZ_5j0d6{g4Q-6|G>$2_Q$%iP?~FCljJ`N?VgN*$L;EfRbL zQH{n%(qt@ngH$nE;PB^7*F-!|Mff4zb#q+@e}Ij@NmE39T+Mc8>gGEDJEg}~9&T1a zLd_hF0uhWe{I%Mqw=^q)vPcGxZ1298Ig-~hfO(W2^?jm?Tk@{=_3G@0cePFq_471! zh}YvA!NEJ`XOxE7UAlWp_M<6N3>wO^wZL`Xk8v9FBR$dTBE_Q}mkN0P;{8(og1~qZ zj)VG+nX-%yJIPR#ncOXZYu9ZZV3YQBR_umEuQfc~@&gJiy+_pwNXy?)p1uS&mJeCD zAF1tZuFVbsJvNZ2n|>o^om%`Zju1zreUM zb8;WFL6KKUoUi(NK3j2ab7%hXg|l8IyK1FOI85>l^~PH-db@XsRS2~$n+>{ZvgyxM z9B3`J7}idet3^ih;g!d91#&F83h(d9#oZ{TU99Lqq7KnRwq46Fv^eZx*-qa3Ubxfb-%y<*tHD!9mB{h0>b<)##Fo{0=jFrV$S zf&Iy73|x-d)rTkMMN~^yWTnmSzk^Kr+RuSuP<>UPCKak6#?(y(=37Q~82@lLBS1HJ z^+l3ww|}HgA*ft%+2&oys*j{~E@>{`=Iz9?d!5f|L;=Nq^JwM_ksdnOj-iR+RTp2( zz|vG^{KVX&ldd z5S1@Iv29T|GUmSEzPv(jZ`28u3$np5GT?hYePPG163m8+R#M@gixfYn+mlxK_>iRD zA{FG0Hsh-I0Q%S>pggWz3lbx;UZ$I!b=Fr#+=!zYukx%f9`Og{3^RU4lXeuT35m2c%?AvPwOoQ_ z99(w}UmZYK$ld61rh3#<_QBN2=2w@akdfv95(i|-*)TN~S?LcvMW=8EZ_QLv-y%Ii z|JMFX-~Vybx9ZT@`xKqyAiZ4(OJADVHQgn_%YUS^s@4V`e#*UMJ6WSkVAlEt?-<@5 z{`N+Lvb^%;1y3?%&+yP|U?Q)-**+YkQ2U`OFOM{Ct{@_@=3epRQ0VlJS$F#jv?b}T zLBk1?8(ZBbMf5QuijhRO&bk0V&ilC7K*y>dy(d=`ry{7cWp5jIR8jF}>Z=asvv?yA zM+hyojSxbPw{F~YGqjATotUMNlTxe%+hqjH*~TOAu8ht(8B7*=P_bJ<$V`t&i5vTT z^vs&(ZBM?4a+cTn{8v=tS7WZvl+U}{@+>U;V8-^#%Su00fJk~X@HW$+E2Tb0wJ0UK z%YbYHpXQ}J@9k4oNu_%0Hmg4+i%Sglh2xiMr4l$~N3$8E zU%$L}AP6OF78HiFgUoDbqj(Hz*f!y8Q6)A;X0&UMAl=_HedmwIgZsAboAjzf8Ou;8 z3=vyb74sg>y1%=lyE#}eh>OLBw*qCSWEc(P#53P9M5;Tkqbey;x7e;%M@|X%EVm`~ zXG;W_%S!J71WhK#zp^v{soQ0wrsajIXB%K|7;Vb%3@jXARFjWyqMR?--x|!`oJo7x zB{$wA3g8N|)sj+mE}q__5LWFw?-P)1iw*(Jdh9k<=yUVej=nKy*XylmTQ(z*qQOy= ztM`wHjgD^Z=#%ob#Bt&SSQ6>=LhP%t*!w~uw7`nKa$tSr&FW%aC`l_YJ6&k@W6mq4 z9@4VZQ5qZG-C&}>fm+|LE5|Y=*RX#}`u$^z{HEs%C1%&zf3*B9YlGVumI5)&J1EIG zVek#7>x-cE=l&dxDqr3XG6v?w(NDdI_{S0dm%_;|OBI{c4!2kP>4ySK1N~t+`t+6y zVckEUC^>!#NZ2xb6RlinKD-Z(VEJvepoU&VfesE1#l&4%4Wf4b16zWY>eDr5v`bM= z2jVw(4_5ON9s8>q-1CUK_XuuRO5%XW&u2pRmWt^6?Q?gE|(jp*wk#y33IZ;@8gQP4l@xTP{Jg$?#4)B-_R{eA&UpdA64^$yq~Es~3I{ zG8mwn}Ye>eqDbFTXFU&p@Ml{iUc zI|MNjrEfjlQC_Y4uG16w+Id@+$qr*FlJ$J3KF}^*!3jxRz;RHpOU`G2UPj7%TAWj? z*pPi!uZXWT$H~t?aai1IYUV1TH-#TyIdaDHi@4;G@L-UlUM?RJLZCda1Md2$rvv`K zAnv~!3246Q1g&Bx=kn!T;fMZjn~!J#i!!d5EbZ8}dDcLES5|#ZmS66hCxtSt7`$kl zubk{bxZbX#y58IIo6s#-w_1xuiPP$Rm9#WOwpy7|6^HwS>%PPt$$GzHQ(BrprE(3d zUDp!>^9)QtRBII*`zb+3&X^| zL-T-ccZ8f4zyKDs$pLSFqIwW7MogS^lXLOQs{?M|KoJD`F(qhP zG#Rccw3U|HqG}Pf*=*30rqE|~J#K^J^3bG@aP`L$w2XsNf^A~EvBB&2{*^WUxJ~Ns zFt;mDDjfeFX*k*X=IcM+{Xg#cVr+l|^nhOTi%LOIeYVOEFC98UQ0rS9vIJBryDX)eM*DrNoJ>HcZ~cTZ{P$+PmO5a^&{> z%N@lV_CLJ8{iO%7K6O4#z{6ZI6R3bls|Ve|5RarYYVs@FmNgryrN&BL_G$_|Eh|{* z>O9C8Dtdjg=7ZDPZ2NQgQ1j~Wg}&^#9|pVX*YPiN_Ukl|kM^@EA3fraz8f(#b`Y;; z`sN+v!>F!&A?APz)G`ez{bv+9Uo3`-Dl|HBX?;}4jO#-`4#jgsc0-a^V}hQPy4o?S z$xrw;kn(c?M;|3od3nQ%&eF&%G0TU52cNlH&*zZ{9TZIVin4)aj6||`zk_o%Wr9n# zGpNNVQ>h;r8>O04T9doG18~EXkOnHsB~2H+icN_qPcSsO@v9#hllO)Tv{m*G@PvM< zQxCe`Lxwu0ZE)3Zg*DV7w88=lV_ACl_NJS?N*7hLqnze2`&xzOBJ9|p=t~1tgI83$ z;>k)?eh3(J>QE&5*)0QY6TOe)zIp&@>tyd*mEnzcm71H0-OSk!)kFZ116h<}w5bOB z`@^TTnUuRH)akamE6>9=q*qfW&bUr;h==~;xy#uR>K5>wi_2dvPA0NB5z}tw>;~%TSeVN4EnOs=nTTE>EOvO>m?v?V;gH7Q$Q5}jeL-@fE z2ekx>G;Iw_oLO={Rh(*1ksOv`rf;^b2Ba1dJ#t4NKXZuLP&-8FaY#h!QPvq|ZM@(B ztysR$iG`*Zb`zuoS?qYpY=#0R${@Yq_>05V1&LhxP?$TB7z(Y>m{!F|b=|-nh|MRQ z3EiSA4%q6<$vLJ%k1o?P;Jb0hH{vCBiN_*gMd~9Uciix6%JRfaciY}{YyL!jefwJm zz#Gn8wS8;jOq!3@Y-j%MUlvs-r0!jhl2(DN23q9K42Jgm6k)t7mn}Y^-n_7~y1A@z zq~-0@@zvb68i#7C%|t+0;gREm%vS;_>n>Mur%_}LqkEsq2;RB&2gLMbA2(au;9y9( zpbnzUh1ZFE=0|+WJreG;jY6y6o7ETHMOYRGYM<~F-kr-ReEi03b#F(%r%TOV`h3)6}R5>PG=9vukQ(lFb zL>sDN!G~G@{Du3C2L~C_yuqc>s!B<_mVos>tTxs!rzi8#mgPmMaDQ5l~o1ZJ0I3Ra`Y)g5G!Eu6gzC1xQ`p z+FTP~tlsZV_a9VGkE;WEjIH}@X=gs;Ruk4VR*Y^;(n|@fd_3Qb5NM%tpZ8W7yt>vs z-@eX-*BZhYQ>836#7qfiPgdH6T)kGU)DO)>Z%nSu^{b(K)dCiM8|-gRct!<2*<6T9 z*wN8RFeizsEGc9bo0DQ7K`~Okt9eZ=3EO>3o`pnf);Qj47e#c5!-?W*5AdH7E<)s+ zUF-)EOY`$;d~jh{a^JBM2LUzp7mwG)Kpy>=1@9f-N2!peYTU{JF74Rh=M#zJeOW~3 zW@Y81NQ`F(+(SHMBjEL}TYHxBy$@^ZaL46Hbj$MsdYksGssr=3g(=tKU-DU0?j?UC z^F@Sm1x@Ih6gK8+SMsN=uh&OHT}*tFIEo~E*ad3a1-d@Ilq_Fx57dL}QVfzq0 z>6t~7><4CBXS-qPLT>4nH#={7oK`)UZMU{rZw*nH3WkqL&eUhvOsLW9xZktcVybOzTu7Py$sLxWLTj2A@b9Z;Ox3U_qzdoH?L0RC)0Y2^d>5qpR zk`G^+6GyVDqnMntDfAX9*f z!I-kEt0pe=b~Q&=o1`BR2$)sdM*4qF2w#8V%V0{F^sd^3h_t_8L7PF(Ot?g5A2bim zet@;UoavyS_Uvm8lg@yGUUt7=&5pURDJHP)*W)5>DwDMS&97Vj>+*e=Z92I)CXJ>9j0AZEz_=AIr|YKxjq~eqEF2dv(g&!Yon@%-QB9NZ&ig_N%!e2qb*Js|aeaO2YMgTkYH z_{&w;cmH^ZIgDb-D`xTJ*6&>QYrx8f+xorYR-|_!B5`u-(H^^M#xH9ItWMo_k7r8;+@r25Wudd#wiF-5 z5Ts^75pPUMnnxu@u5Zlrl$>Ef!1bXAOv!Qiqj zBjbKPu^b)E)xPNJuF{m_9A%fsP)F@@XilH=7TbbhvEY^X1y*hRa}&Le^ihhQG+2{H z!4%_0sbL#Q_Cv{@p^o*P9F32!I4OvZA@4uwZRsG8DN|DhR_{Y=?ei+b_=;vXS{0NI zar(QdRu+EMMw(YdhpPE1cYNMCp|hsxzSyOE$xpxW zjk6LVM*Oxab9AMK&R}=0k~VfP}>M;fEN=*4LA{xLC1R{G;zLKg?WM=R{T+ zX+kALawtR>tR+j!#PRF^?2*%X*)R?Slbd#aVQ4&m_`Eg>;nwSy`p7y^p@j$fs6x{@ zHp0Xk{j%=kJH~QofHnO3n-?hNDvWkHD{#K1=y`^*OXkgX?HiYMsxsJ>*zWof$+{GX z$(TS8`O}RjPnMtf9E)Ho(X(mMr`&-BqxRmUNU|z<5 z-BRz1@{MW1#xo@sL!|`P=aC6N1@+jvwt5nQd0R!WDZx4zo!tXSyFQ*0S3my|#aNkW z>-I0MAjiJw_S}=@7{y)CN@?48T(6J~vZ3*agNQ>Dg_uYy{<-d%q~NU_*ZY+~AFdsr z$3tq1*`zuvaz)o4TkrJY~54t=~U30cs_KX-<#b>R<47@sAS3xF% zQ(ZAvdhCM5yg2NqMPy>Sq%0%z5u?I^WMkdtC=#LY3q3w}C)(IZM&N7ogZbK3#DUQF z|2WGRH;`$ltk89M3!aEl$|0qsWZR^Vm0;eKg`^SqGx%Q_K9K5|{pbGwIPkwHC~=ux zwn>GQ*_uoqa~+11zW3d1fR+X2U;GLgYjjY##cg=i%vsmd;x*VzFc>-2n8y5!waPuz z=a2wadpv19MYEEU4+}Q+<}rsIG~uAT;%fll;NVs?7B4qe07EI{j|kGUFrMiNGUKc* zofrwXYNmi=mRxNX?V{u&Ub~mR_(0`Jg5b8Ek~`WCBtOyZw(2QLN-cXASZ01Xy+K>< z@X~+|(QNor-gtJ!lyk7lIJ5?IxUrkHT79HYJVo3jG^j$r!BW4hq%${b^nY-XI{Wcr zr4_Toz_a9&6al-y6>ZZET8&cTZ4^~9DesroGjCXv^=2uZc{BCc3q^DMd0SUg z5V0|pnH2CU)y(|ta7|${OR>+Kr2tOxFjy`P2}VPzqIX=e2-W1Mb+7V$JJP{=b8p<8 zJ|04PJxy^B>^+!^=j5&7)dj}D7hv#aKA(Dkpw5xzKEemg|E-<68lBQ?M&RIH$n`l0 z7e_9MoRO=N(|f@jU1r$h=hAD~o>ZSMYkqqLZU5O3`%{7io#6^b%5TS}!Ya}td<0GJ ze^pb*4#a*8!8{`dI46SXmL7r*kj{2B))Zgz%N>ioe2}P(#ZtPsUqkZX0=509%IsR*iSCN%Yuf`80 zA8aUt1f$v_zXh&M2`*J5>BCsfvR*N7e8D0BKK`L7b#8?zqi-FA%s@clGzv|T9phqN ze<|mAYiUVlhHd12_B%vyBHZ@im9F!Lz*=vA<09&t9dOLm(C)?BLM=|(s-uETF5YOm zYPsbG%8@RR4fD}cveZgvdx9sx`y`+E*9IYpi14Nz?b3=$E}C>8$AAB&scVVyLd^%c zD4%c~(1+0ct)*OiUb;DP{{=?C;Bj99GIfn_PT?LsCaXbj%7|W1mIxu!CG2*^0I}3?&FDUSH%s~X@4%V0YQ;mgLtLJ_|EG!RjV(vrvL;+Qh&Kf)cRG^ z4=Uaj3-|7&oe}Hw5xbGL{lQcP=>-1f#0ik_H$!nwRL#eij;v!3)I1C5b?uhczMLhE zXWBon=!-adsFYb z**U#F?y=ZdPGZlMCAFaD)?aYk8=fYF=*GxPl& z#FnLfQ)iC7D@N>N%i9Hm7=F|}#^lFJ1(LA}GFIi4j5btqOlh5BV?A`0=_O%7=nBrX zcr7I*GSAL`))~S;Y}aWmFru9CJY~G4AxsLl1uB~+#vL7l@fvU+Rm-=m*W01=0})X= z#g%dKy9zRCLG*QJYlsp{t-sA{>WZdVXDLb!~p=Zb+Z(!UWriTCr}D z*8HD&gSj5{AoleAMOBclAv^lV=p%W8c>YC03TsG8N(dmu!O{G}BW;0t7t1^Qv_jg( zqBq0q0Cw<=WB5Y4^yc8&yBs-lEE!ieyf5HiN%A{ zW5WQ;9QTw)8Ggx%?HlEJEH(!JBU>e8!ssqFZQPxVD=1u`UXJoOBQ53q zVEFQ`DlCkA8FV0&KZ#n3#JF1z5r$1`uZCcn7?UHz7`_@So)Uu#PyjM(&<9+9AVlrE z0hR-2aBfR!1;FXm*VSY5=|H2V@>86wggC9^3)474xQ9mpRz}flUueWTa|;;LECd+X zvly{=g_i2nbV_wuWiLh;yP)b{eEb*l{$Dj^Ox6zUnsd?>;195DJ$%FSLXO6jX2>L1 z%lkVJKTZEdC)B!6wXu?dxjyLnELW&fNf@+QTh*~o>b;LNc~mEL&s0LF1m^u=V!rq( zDvm>_ajHKOe}^f%oZIbiqc&>UzckREF!8{wPs4l+aORn89i?;UyI)-i0GwTOB(J0h zjuN2SX6`i)#EpIPOZVxNru)4s7QkC^H>1e75Y6uHUmf(fB1X^WqS*ZJTmPv3MN1Z_ zknYo8bJwb2HLiTNrB(J@|0a+NPA&vP;ad;{v&-Y>`*rP_F&`ffS-N+1#u4o1_xH90=&fSXV~(pmuJK*FQ}WV&sFD~KUvzBx+! zfCFRZhxyfCwb-m1XNTbWciIMf%&5~`!O%^|$F>+2m2J~@p z>jI5fa{(N?)HkViFwfw;<4{^ae*z5sa?@uRu1~|W26DpN13lCI7!{iW4+pD?9Mssc z^-_fSr6x@)bl61>q_nYzAn+Td)P0iFAL zRY+}}GLqWhpvP`{ni$^$HWEeX)_K?qGL;w7vIg32hi-4c z&#Ry7s;q5Aru1G@Jrb9cTyiubyc!7^Ho*oO;#@QqU*drd=~B{)WRSKBruY zFOaJw8Ka&wl6iJ}-kJwa09gYZGm<}_GznJ>2M77jGp0$1RXch(wu z@0Q=4bnd}AyI=VArQlBfQsXkMO(Hpm^@$fL@yTdKS^XmK{o74#D}T{m^QDOrz}x$` zJ%3W0Fe$7xjc&+9Wi?QJN?$L9)4hbVpJ-?5b7=m4KJk-bm!oghcu}=uQ_=9$=LVCN zDo9aHtJ`v#sIOI^VH?wh_!v=p*-YJV@IaN;@)ZI#Cy9xTdGRBvRsAHfRu2|@EXnF0 zcBxgGaQAwXY4rkkw~;vF@19}!p-kp<{ce2EUUP!Oh^<*}Z=WHNn?~L-ur2I28Z@iM zkJ882H_~vTyNLwb?;^g{V=qc~9sFDHbI<1GRR z0RciC%U(;d<+2n;gy=KLsz^vq$^>6UM!Kh)KFOvBiJ&RSl%6*`2Tj{H_H|KOXfjy9 z9BGU^szj3X?tMV}LR2IDY*Mjx8{B3*2^+j zCDLE5ge13b8dK#kL_vN{@j!iu(84#;>)>X zveb)O`@llOshlB4mg8o-y!)<#s46Bx*#og{FKcRqCjx~`1oeeW7@7X^8U0RkcpmSZ zbc9KI@M>=A5s+*KGf6%FDJVBIx*{p`)TiZ$k|B3JfuG>dC|?-v0;A7x_{b zl9b`X*pIohsS}>*oHVV1WX^6%gKBJ&#Wy`oDR4Oz$oGm9+V$P=}xnz>QBS&b^ zE!Go+Lf|SKL#>y=NYZ#q>YH!FK&eql&HX?9>UwzVS0=FfPk(6<)iG^1G!F(v1-SD> z!*d13S}tPlW4`{?&i`f6!ok^OiNkGEH2O&$)fo9GGU{{sreTpG&yrLD%dQA81u*v_ zNTG&ryy_?~S_}-T0U_BNZSV4Cg!p=gLVe&pn>x=m#%u@MYg#fIrvOJ*>4&Df(HG42 zr$?*n74Nr>iJvOzUu1&U9MxIop=Ov+@;h|7Cqy=@oZ-L69kHbtocjk9LcQzY0 zmSN-`r3KSgem+qZ8;7A(YCIk9HdfNxzKjhKICwe62~ju>ty2|<{7KViGuGnoRaBVSPruX z1_&OPhd8rRA@NVxxbx$DRB;7L9z)PrS-YEU^KQr5$qJba3$9hb2xN!rF)*T2Vk3go zGTzTSMu2)3Xmb41Rk*%=XjiRvi(`P*HK2m-g4a|HM?%px_-Hk1d!CsE`;%d~Fr8hL zp&`pmo8RXVAeh5mXB<4S-edrSnCme%pAMe+O&ohWm>svmCcPsY%a@FCV zq!(mtSELdLKMB-P$LX%sn99+j0D*-rZ4-Q6Okr@k-~5c1UyZUk>P?WZ_b|z6&ZJ`9 zEyPg)fYBbGc8C@Gm7DiZ%y7b)8-R>7x~6q-T_echCNt}iowN7Q0p54rcdhnfz5Q~k zY!fg4vdvr1>vi+@Jf$Y%ks99vuCxIz*5{;hXoIX}`%m7hvaWVjeSMp=@O=vC?mj#4 zids@v5_G!}pu{0B8HAGF63tL^=|u*-dc^Ku!EIJYd@ z?Lgd|fFEKN_gAxn-e$%yCikYR^D{C$TI0eTDmth(@yxd%qpHraF!jD?V=S|%j&A71 z1KibJ>SLgDsp^C%0^zz)7=z394PDE8-ANX5anTb6yGRdfTPz^tr29=YS}d5#FbVI- zxU`k_tW&%XO^J$x^zWbPs8KoO79M9_`$_oAwS`=A4Ijp80~7>Q#|~cY*Jr_ot1Aq~ zwtaL1rGJSn;xmOH70**0j~-y-_IKf=&*l!7v0UM|5%+l&2takL5A(e z4f*mqS?Tc>K8k*|4>J=Yi>52M^%kK^P`P_i%if!-r2v=5Gc2}evqIi5)5Xaj6QN#P zN%{UCw*21(?&KJKO9Q@&Z`vg3 z&!d-ZewxFrA+=>F3I|EPy7)q>4VCMus`p6HN%58TPc~fhRkoCVn}w@gJbIp|v+rfH z;ung-TI|x)E8C&^2V(lj%@SLhkj^zB-{`Obkc+#GHJcPEyu`5Z$^ww|+`hw1yHJeu zOisD{Z6f`}%!lL)+16L$S;M;tjcf(No#U+nE@#jkWc_JLhdA^1Y6C4wo|`2(<2m~B zoG0voBZ{G7QA*7zd?!tYFS`UQ2_U1?jXaS{enJ3t_| z0VlIOAF5A1QGB|i4!nO)I_=|F_Q9pJ7gBI8C!qMG2=mKO zImWM3j!wN69q6+8+npmL`MWFpZ>k2g)l!n%^>ZEr6Y1iLM>EG~pwL0+HM<3=&89hA zX_z@aOdSM9kX&vG*6zn!iGrlCA=tfnG`Pm&{MJ@O;SeD?8@O3eI+45A&2f4UH(&-G zupz;=aKH30MNbi|Ls5=i6BP@Fs9)$-4V$07x56{B>nDVlJF zGnT_y_hs99_m(XP7`zfKTnN;p;<{^O+fz5&GOY#1XY@s>Ip|$^TVhaAD12=Sr zEZVmV;=VU1;>Gyf#`ImzK+wR;4rtB`Bn(Q4zTco^ILaa6q!?2S?B48ZtC#Uj$uboT zE`6lCuKYjRzB{g|WbNPGwSWk&4Wz4-5UTVJYXM9mAe~TE2nZNT=q0dM5S1!P2-3m| zgwT=D`vO8tkVFW*BVeRT@8B9nK|>!oadQyGH1@r^L)R(s?{@L zFNX{1b%gb{T)oK8NA4%gdW}AVoH3ed+uGI$Eq}@8VCEunVISxDg`04E$eQWxUMI-p zij%{WE!Qq0iTrVPBN{>%V!}?3Acm1N%$!xUuT`CN1p%lrDa|2q>3tdQ_RqiR&Xwl` z;+GOrQCX|l(u&W~1zooxd!=oYH`LfZ7FW&gCcty27kcM_rZf)@;DH`v)XfM092CW5 z?+0h7tEz&krhjXOt=FayJ5UU66kuWIzId>SRYJ`>f^1g7;mhD?85SAM&huW)P>Y4L zTT=&JMitW|FTv z?xf<+v6rY(gz$HC*Ob>xY#h~ov6<{K4%?fiS?y={a6a8sIhbPNGeCF>rE;*U78ymY zk?}J*&3)-_O0t3)Uo-uarebE0f1UGvQTHzwp6EN|Nn-l$I0&*T4>PIB1(!W6KKc%I zmo^(%K0J&H3b4>mvS#T7v#~?inP^sl{{1Hz_XlyDZ#52gu6m-D>NeHZSCXjS{p*7P}X)#W3vng^XU)fbK_#78{-eDY^Jn>}O(UCIR@s)h2 zG3hjU0N>uf$F0AX*eX7hG*aL}wpWp&$Q+No-(T~fI8f@8t|f}1c~Z1Ht}o^ALw=oE z@f(Pn$0OlXwDFy2$G+~jFj|a|D-$5q>rp3F+@wSUfzmj*olf*FEe<9sY`M&3n&>;} zi)0*yV@!ErY21*@j|W;F zFmTY+a7VQn)cLEzM$g$SMrI=_B~wTyRb;4}aGgBP;(l<$K}<=5@EX;CSEd!N#bK>@ zS}KcmxCz@flt(#PAt@B;qK8}fkP0tTdiB$9dcG*E=U23dQHp!xGK{aRlf;c1^afom zTI`4dt&E@O>dm8D+rW*m!lf~u$<5p0mLFsIrE=@5npZRpjU+^#h^~=;Wwrv(rrQ@( zb<_J88p@9sViqC_(q5`mQ)Jk+kAY(Fe2Zx45Z-I=SZc%KxDMn)L$a@5xQ49raX;8uUhjl@%X`{Qb$N!ppg45uV!AR6VNj~ zc7(C-B;tP8sb6k)SGs4_oz~#nY<3RkZX=LQpV@W_p)El%Ik4BNmnCuSS z3YB|}A?I`hB7RBPx!UhSxJm!SU6}RvyU2FkKn7q|8i@yz9y-rBZ1BY@EWi1J9e=Lq zyN$5N`WgqS3VV;h(C(XcC z?M!!2ZGecRGcO`zO9N`;ShU&~;G8)Z1n0_AzSvGZ=iKS0cy@n;51k0gr5M)RSxxN3 zRhatlpEfHVub_O$*LU{s{d|P5sV%o}ttn6dx!Ce!{+>v!rJY7t&Ccf|mh|?h8J?Lj z%gJpGH>c&y{flG_TAsa z=C_}gc;8|yMc&1A52ux)s?s5-8${`93j<;r(IXRLXc zUV?EDYay{v)t%7oGYi3Lq93s1Ia;U9dFMc?ZH&S6=dQlObx-@T9w)s<3MUdCC#Wtk z9c7x&W6z`w$tCETWty_(UZI?cqOzpzJA|_uPE-68VCr`2o3iOOwp2Hfq~;i`9Z#!l z3dR~V8Jxx(Gcc>p0N{lIish?2zbWW;U4K74-z$!ZRi2q#S8UeS5S`RKXY{l@@dc#v zwDnKZ^Xu8Gsc)Ik6b^6q4TEFuv1;v5^xjym0jR(EW%EARu!`lMTT~<#yEw>(va99P zE@kEKcdiuax9KpWM@bnqlrQxIvrI%XU7o}c|v~V_*TOw{I$w9XDp2(&G{U zci=wA={QCy+^Oe&hkuGk6>vc18&xxoy9?i~hipr6dxDcRp6P(5s!C&)tA9jCD}`GI zO5|Y_d2O)5)$l-#Jt3mI$WMP$yTKe>vlQ?Bk`m4I=kUaG^2*j3!i4S|Wl1i)Q@Fsb;Np~OQFxOaN%0LW9 z?1z=^Ha;@$@tG_3!k9&$#iYDFwH{=l56{m6u-0oJJ|7ua*)2ES$gfbXzAn{)XtC7t zwy>&W&ZVpw(<@EybrfCHE+|seg;+izJlIqwg?2ub_!_=-E9$)t@lF8+PnE9Og11C7 zXOdzn1JNOvhXvvkITpu2#c)(}CK^N2yVcYZ_F+f1)SDtl(r|nxi7@zlgymjUQgcA| z_OhKUgzPIAKg#849Xyjzme|}&2sa#M^P@ncnuqB!iPk8O)3we01(*hvw%!UY6UQ#S zB8aCxMRR+}$5mS*d$xBpq&qc?fIw_dtSDM-x%)kYkg(ppIX(7LJ6=!x#+&g&{CqCn zRw*eSbJ*#X#Mq zjY;y4lM7O_@a^jKa@E8cLLgu>2|zk|GTNyj2BttUWOtmdG%}344G;p#tI8D?ToFx> zIUjreet(bmXqg|ELrR-~C)L`tUVF*AVR1PM1U@Zwaad#1QgyMWMs%&&`a>#Z6)||_ z%8q1)sNd#a5pQ3t(r)NvB|i6V4{T8@-?bA?3tVaLrLUu6yU>~i=m2hn9vidZ2kOAujd5Ohl9}DINAzI=f6lvL!7`_^^tsPG|NrwE7y%v5eTkCx3nl`9S zUE2%mS%%_fsAkmHt^BeC^9?<4p#D;kBiWR%^hNe6(s^RnyU-GE*^uGziJz8DpL@?S ztP-aoNC<0nFViaN;`e{p>Al;JtqXJbh|N(U3U0f3zy_O6B=!{3?JW+4(OyHtw#jQe z52=V+n|_9O~< zy7UxxJ9UX#7$F|<)y&2`zH}2Kx{so6K`ycLMqB_^i}bihF%cq5&ugs;m0d;{?7=Wg zrG!=}OhltuuSM*OUHX0RVR`VVd@!kp$xJ-Eel8QwVxYRExp?}cF{oY8ouQMGg2FgF zCD4{Ut?zq?wT7v1cEo*<5;X^LQ$!JeNy{|LY>2+uCn%EkQmlMGB#l0Rv)G#cP_dMB zk=7z1j_oB$W?YBfd27MHHV{v-sPb8iwzJUQRH;DW!A3c39+5OH1Jz;SS5!C7zW(^* z=frSqgaql^*``db&v89L56{*n+9iu+Pp|qs$WA+~VUCI6Wqshqyh)+Trz9h5Ln&z} z!?hq$AD^C=q1q#i&&3L&|2}d0g5|6>oL-ZhG5VLS;li;Jh+;jM|BT4+mbz=Lc)e)q zst0SkZ~fNZ3wv|MAw%+)_se9P!mCq}&eA8r5+gZdo=~0OeJOZ?!7kP~UMtLDY);Wt($`7VwTLF@y>7Uz zP9X9?hEc`lfJ)bvE~iN%8sU4xcQh3q*uWjLvaRhXA5Gr zHpMfwrL-|DysdIr3Onz_kn!*M^55micR3jX`Q)Vs@|>@N8???5KW6uRSdPy}`_eCh zUF~5Jp7xRuV6q1dRc!No274pH;!3fO^<~V1f@ddXMAEEv+43oK70~)SWjamn2iO=yT8uR)Wkz8j(-?+Mp6J0UCPBcTv;!#f*Ev zpV{?fYsGr7WCiv0B^PFKBa%d5CWb(+VrHndeQCcADvC1E--EE-5t~ZFTCiS7r8#hC zsY=QjPhi4tG@o67-iRrlCTT`@;8;M@eLx<)(=j|cAv_DwmQ=2R$O4KD@{QLcMv%n3 zuBz_29>A7rahVrQ2_|YprItwjs)Lc z8u9j1^92;7E&%utU^9ejy(;az!!l!R?ER1e#u?^LA3Y8FdNzn*HfCyWb{Kf3wUB5lQaBrYWOiqs$8XZ}forMN-d~V)jZLI7-cU+!OF6 z56!4edCs^%@|wBy?LlJ}N4b+v2J(vBm{aPN{Zuoc!|76a8*GfoRA~j|?CXSn@t*v* z=2pOyw!Q_NCRC2wfhE*fxx|q7ejiV$wUiU~MHNuFIW}IOXGU}0bw{JY-}rHW zRY0CnjYl)t-l!3BuI}O@hKkg!GV*pcZzze8KJ(Z8moIf`xqxW$(t000VsKqkzAG;0 zOa>4^bDyomo{Or6G7+68&5aS}9ALRxttPI#~;76eo z&mf*uRn=;AxVou2^Vb=>3D$HlSzQ}h7k?dHqBQ>1i^l`+q7^*7So{_e*S=x11=DJ^ zE+OtLB8ISMqZXTI*GFyEQ@DKRdrG9P1tK=JEQ|o^4AEC3sm*`l1@rx~nj5IO$>Ekp zQ@Eu=t5WzDRHs2v+Cs3}2!-r?d1AWps##MUSUJ+%?jzOhQJs;B!w-BH+~yQQk8>_e z6DMK*Y(i38vA7SEY5QJ^p$3L{s8k-4-VuL_>IVyXVXZvfZUPg2J1oYeQzr{=-jx1O z>T<ogWTLF|w^mx--US+wmJYah>>yh1Ft7P!AME~>DiV7%i*b{?TtGd9(b$B=Ns zGaWyV8Zz8~pKho9TWH4r&2id!*{){&^O4s<*2}Mk!)Y;vf)%qHJaBkI#IP4~a94Ta zFoD&lZiZW@duaH=cq1b8*}HknF5g^{+I$=jYH5fe*gUl%#X&HsvN#3=){8l-pS3@r zBl(S(9MN_Ix$XusN#krwlu+QDT4?;XUyz59luqg6(pKBm?SpFV%b$-#SuxoQrgy^( zcHD`oJvvRQ0i@;~gO}H1gL(`q#HM87Fl}!J(^0yw)|kP)N>f9=%{F4r-kBhnqdmgtn_cg*XoQRQ$?eOx&6&?Gc=;5TzZzck{Aw=?FhJG? zalsjSzeHSCfii)c%4tE~8xw`Ldq^tMkxwXDJ~9thIVca~i&8yPop{CO>6_c#l4E(I zuih4w9A=1~1<}?s*TRQi8{19yyT8fKB-ZaS-%(|0{+p_JYi}?Jj|)IvVZWI(|)eO4wX72J<0IPCTxNogCEprj6&Zjt!f$0Kblr{>FXjlz z$}*XS-p-28lhor+p3%+I9RaI6pi&(8max|H`5a19BV&j`&U&qOWxQIyN*LgL66$Qn zrGIP4Hx{hdvK!$_de9#ljkWLWtL7J53jtv>fxj_YKdIi&LRngCWh8BC&EH%ofv~hu zFS;5pCM{*q07_+fB%_l)YF2hBTYz~xA`^c!FeJTJiZj)gu%Qq0om*4vP*bq5+QK_N;|T1D$U`^CX<+W`SNZlI%rbc zJO66h)!~rzLjakQEHo2bsv3FbvnNB z^j|%;zSwC3G~JY;_?L8Rz|+leWPB#wVz!I9#we}gq^V0Y&hAIQF@B9A7ho+Av6zQ3 zDCR2z(J92)2ZEq29cS?#22!5TkC<$HTJmrv){bi++Xod5hQy@y;s;jy2k5JFaQ7%T z&3HZV)NOA8tuz5`%i@xE*_a_Xpxu5P(6ND(&*vq?OtsRsG$iI-iw@<(;|wK#{;S5{ zFTo4t{wMiG3yv@`OuC@u#!64z+Y?aIc=WA`8LlY1A8sR_!Z8T(oolC$S+`zZ-Im6l z3As0&wwDxb$9{h>tf2BFm`&>~)r=T-%;qGR)nB$!lvDe-9CMJTR9*wdJR);0u<6wl z+Id=wK5v0a;n>=3($7%hj7}OLNDsLwAqc^a6J z<8t{J-oLXY5SnNd-%IkNq32D9v)_$}IH&ra^IqR?*V3l%VfK|vs&ux)jBXBNgC8eFEthe6r^&Dy|4OEjsJ=DO}!CHeAUkC5dGif&L}8qlfxa7O0gX=SUxm^+tAUFVL0< zG_poo^z(tU3cFClg;^2l+`d;jYF~ z-7-WGIr0%n8v!aZ(c!If|J3%sOKH+tEi7)Pmhm;Qp*K8!4SF0}TY)bEwKddL8!m)h zJ3LRHE1E4$qZ@|6RH}xj_OjM_1)>eS53_EV>uMVklC^~R{KLw$P8`aH zN_Y3l9148QYf!>fn3NWJxYd_#X$z$jQ{D9|nY0}a(=?$=*%=~G_UBAi5_DQp#48-T zYuusr6q(K|Q7mY1^I>WrM6AIb0aghxOylpd%bRl8p7<2mXwXnGsl4FE=6s>1DQ{D5 z4n;K81&dpL3MZk6LpJAL%O{Z}76OAPmHPOGc1>d3ov-$%T~cKmRaGk$Z?BeBD+dpr z-jx!lu{~xpCK&1EHa(deauA2)(+tiYDZS94X)7HmXPo*T=e(I zwwkAz4uGw2{lb|8O7$6tS^*N6p;F%lY?X*Ci`l<>_-y}T8lK0a*q~o(cnGW-+OZHc z{uIfPj!c~0kV6wIBsD+|ReKpfGcmg%5ASpj=SDD@Qm-2iK91NAUZy?SciGOeE^N|& zwwPJlpCx$4{>0m^ezmmPbh#1}k&WD3Lc96}CMLzu1$LhgM1r+h`TnH8mXe~YT-fpFy`$fWOvTAPD5RayeI990d;eA0NZ*-ZfBxj|CS5@lfc`OBq@RxV zT+;Bs$KodrGr1)Q>_;KH`J5>hQj!e2pmtySIYLjdN7EUNuRq2dqntTjEru60moj=T zLyRk6dX4P6PfX}zWx9N2XuAxgQIRB&Hbqn)Bf9hQP7O>o_NpRdG?L=S(XL%x#;+54 z<_ug&n67af<2+EI7D+3o?P7h}IypBaiAhChtQ3Jv?gh6(b(d5-l(QTxlQuP$@bKro z@EnBonYMx+^@7dTfA`f6RKCw;WG=BQkR&DGPY~_?zZ#;y>+deFoU3rXKvJ1m z3ttRlS>JFr?kx2Ig(e4#gn^j@LR0IgypbI$DEE3_R?T9_^4j>O^Uz#{ePX}qmX6Mh zuF9ld)oQ3eGZL4Pn0NX~iz3APi&V zE}ImxX}`CvC1Zl{Gjs)cM+9y{m~*(Ja)O8>caIo~K36XCZZ~Rx@DD4QBYez&3nP6- z^-}sU5ezjK%85z^rKdP!Q!rL~@!J^%bl*GOy-tfncLUA%lu8mH=0NMz*9Qg>4UMeK zI=sqm=%Jxei-aNDWhS&0NM!tk9qJ7Q;(nzRUCsIQ3`|xV4&mdjhkZ+Yb=bU=pVYt$uP7r9XeebN_U!-DL$e+9A9A#(!z zpzhW1g5GFC9e?tJPObNrw$aYy)9j4WwCt$LIt;=tQ1q8rXE)2r5qRSQ4i z+Zm;LS9n(kL9(3A_foHW8EA{@-+Rv5aTm2BQivLAKf}70WcjP%BNJ{RA>rvXG|DKO zSMTM^6901xoxX0XH6W+6@n{Nh`}&~b(K3PU1yAePPp7s2vGe>5HvMm+KlJV^yLUSE zbC>Vz+5;BGmrHWYN-O}@aDXDWWQ_wRd5<*d9*v((*Br*D74JGu)>MfVRSzdoRh_jh zn*5=$Vei}O6}b*?!#*GJ08C}XY5&*(H81#S>ZGloDk*3;&EGSDV7PB$8@4=d(UsS2 zp^iDQP^vL%7tlt}_#lIf_IYQ3^GEqpy2#Bq^o5Sjc@mvK>(SVPm-rR zo}^{9_1fMxi^6luNW0ansvYR|ixDB!kmE;eZU0G72np zbf6seIKst-C~$r2UPWRvJAmTo+$x#Ttxgnl04`&1<7MvGWjM7%fkgkiKt?r!hLR&2 zFTZ&hNolrjwQ#ox!d5 zlD@uXZ;azvB%Nxqj=(0(*=B~cb!vEj5d!XO*8INwMA(h=cm3B*L$fwNAKA9(*}%Ap zo0^G>%-z^`Azh7X{X{`7hh0D9P2BAi%~W!k!n+z7yUaiuXOWGhUqfa0Z7&|m9Le3W@u{ z@|qX*I`MUi{^ZtW>-&+tfcX2x#vw|Br~PE9tR|>9xs@#$r%dlW^KllYljK(qH3ec6 zYNRX@scld>c&9;(aK45-DmtQi6No<_?#8VPZ#q^0N5(w`X z+Z|x6Y=*S0Rw_9Y-a&Rvfm5LmwszsYE_1PH1LKSzqZn-bhYZt-gviIUMNA0d!z9sa z=#uwFF<~cG!zab%J?nk9eNx-}h5>WoVbVW*QHB{KVQ+F2zl&+W8D^m2mHW@Xs{QW- z$~heqhN`2aqi?<_OtIkOq9ET034-jVHJ)||-iHa-oyQEu%%HN4M&59AjHKkaHgG0HhjPS zPR;)&sTqeYEbf^Lx2_opWk%p0U8HN?G@T495GxkpYm?T zd&eMUHnp$JmC{FhDr`YF`sw|(AZP8prBMCtSgKk_{}ZXfy;WFOv7eb=Y$wo=qrORk zv=rEI&9E;~Nm5@!fimZlP(T2JwM`pyn-;nztr`pY6=of0o^Y;=Y%I`2t*`M4k#ghH z`!vXDZ?8agZv={*vh}wI#k~ zGM(G#2sfVkGyTDKZ4qnejQ8bL_{4^xFU6brvQW9P=cII~?JLjp0N`8YSH>OTJfiQ% zRG7G?XGdeW(jTT2AoTb6ec?u4UP5kxo>RxFh9i<4@t6$l6XsZH#;mHCWT56)ylx7Y zwsGfTXe6;eblib5&+~M!m^iDVkO5m6ShK6GP@NR3$9Is|M*U3=74W7h&|So~mY#iX z;+E13&fxB!(f;o;iLGh{DW1)R_WT{iBT3=SzDj$ZPe&J^hLsTQZkXuWf-d7ZlW!u? zgAJ`(&%G=s_g4x;Zt*v7Ox)s+CokV{xgyuiT8b4Rn;Sz;^&38eoZ85`I6G@HRHZnG zlg?y%#A50&I{nR#)ns43mn~$ykw;`@vO0)#^!t@KeFu}~uIwH#b~0(U@#DIJ(k>P( z3)S~R_tVuS2xkISeABJWx@4A#Yq6cqE~~qXI!Vxt&WedY8)pA^EC1c^ckAO%7U%{~ zTU=$Cz^H)r)BAF>>1s&PA|39^forNWeo1==w0GJ+LLh=IDVYKqvPl@Z8>mvf7ebx4<4t&dx5TdHEKEu8@!L8zX8ba%Df=#ok-8z3 zW*^V8T-(>QmTnM)=dW8{*}Kp?FA|!rv-xNtP}Z$4Cc}~LJmMpDOf6l%tR)Sp*)hEw z)VWH_iqU1y4p5e?Pg}itMc9eC<~eW%2WfLIEec$<@?Oq3=7n;@l5iiQj503HJYmr( zqM_OK2m(U?bVT}h9q`-v?8BKik%uRH^NJ1KBG0b+oAJz} z(qr!(qC|WzbdnD&LkbaA)Y91&-}W;_ij^_|+Wdy^;#;W>^dZjhoNfNPq=AXS=|LRV zoql!e7~%0cjpZ+C{I6v{fM=eN`%;FU#Z*h-&gs0b<0L)0kL8Bp1|_uQXOdxi2_38E z@Ev)y1d90p%jw>F_~c6QP1WyBae*=k)3}c3x(NBDs1D3n;CbgB>)`42iY0J$;o6LV zO;)mO)v;e{lrggBZ#rT^Z-3Yk2iv5yiJa|%vfn!|B9sMTp}ZyxEMP9b724w~3y*47 zA@^n#n+%J=K>p32`r!&LE3jwe07G>9oK@7QzM1)UXMK~{4*8JKe)8vkwc|g`Gp7jb zyXR2FdrC+f4Q6H>ur$6LwWUj}$mydDz*>B%Du_50w{dQ5!+j&de!n3>uN#h$?i=Ru zHG_9hXcF=6j22zCm;Jp8Z2R!MT*bl3nT#i)mwJly?qD*jq4pzd3`hL=>|xS<)T4BG z@kdGpfK`O?sFdEh`Vz1wXtWI;79&`=Tc<1DXItvl;J_=w;zDM&G=@0>F%r@<8cCB^ zxCL044271+*q7QW63VorKy8Hg^b3e1aqoO>;KCp}aOtN%W&KjOFg*ZDk`d6P8T9AT z+ojuIr7-C_YLzP0^0BzU4GnFdAeupsY5mSb9bT8W5cS9~ElP&o{-$~O0&Z{tR?uTw z^!W%!o1~W2f-|88>L;REv}wn1D#*7W46|6*2^a;|%=^?BM28vO4079G5}9`8S8 z&p(8MezbgKSjiH12A1Yn&%3E$D4dwK)*^lg)fvH^4P1sfkkOZkykd+;%1!r`<@i!p ze>#F0;ue7%!w{`xaQdbp#YVb~%#c&b!oD#9gLFl(v{a)NO@O1*{DRl6$rQIrqJHBj zIZ?$XF~W0|Tym)lfXBJSU~|VEM);rb0{DlGUrekA@h}}X{94QbA};{3 z9pv37`%3-8+4C1H_(e9&`(P&-8=@KhOJRB+70o)XW%t~;=2&t1<5=JMR2%=+wL`)O z?ReL^Y}cSfwLLSdbRB_gSpm)vp=G22EM&T0YMPM(FzDOjEK3Y8!$0WDvgTLE_5wOI z-Lv#BTvwz=qFS11^o9ML3^Ua*8>OkO&qv;^C|2q)1PtX!N%BI?p? zwH`M`W+|*DulKq!PCD@4HYKbyPy0&QR=UEt2ZmOdxF_R|%c*J~@TUi|AG$;J3%xgG z8;x3b8v`W>{op)Zqq;eL4Q5o%27BN2JHd__b7Y7bHB%M~5LM+RGNW+(Mt(zz@#ZY&e8Sc8ewx| z@|lol@<0t@EPfP&=?_;H{p;c#kIu52%?gQ~D_)NFJxKJeq?-)DJ5oMSiY zey661yOLB{^NgEB9@wY^xR>Tv(>A%b>NJcT{8NVf3851O^bNc4$N9j{dqNA^Kloag zH$CGlFjO=~Bd8-&G>6@+3em4e|V9V2e?-t6V_4R|`Z{`^V2mVy(uqexr3P z(yH~YgtlO^VoFZ!51SE^2y>7~no_$ns~Amkb~YusKX>EGP*M$D(>gXal`3F>G^prQ z7!Ny@V`H~x7Ywxn)@X!A;MD)r4lEND#75pytbB(WsFj*M z-y~yZHV1FNQrSkTbsL!*HigxmJWCmUEPY#%8Pd{%v08G@tHqvdT$K*?ReJ6FPDvQ=D;f8Z!x(ly`jl8cs>1h&Gbdc?R z=23PGW={An*3VwMuRXN>D3A5Bj(}`4lY_FMt zw^)U;AOX-ZS4e%?uEha?)xv+zW%fHgzdfmtd6GQ2*={g;s^IaQA*)_m1$wDz@}M;A z>0~kCT5UuR>|)^-a>sdHW^w~xkORg$69_%!6II#o*C+u~OyvCjeQSDu!F>KzV?WbM zsxj5^aDnNbeV@B%d8&DBOY639XWp*c_yJ|ui5WI~PnnDsZ#L#Ozj2c}8N703XnL6~+udI#xvxw7*zp0NP%?Nw(ZgLs8Dob8 z4~h~ldQW9Aksor6?YDi~w$?r$@!Wkpdm!cT`G~lLKvuqCs$9b}TZnnnZn9mcqb9O@ z3AJ|-yi-%7vq5S--fvZvYdkJB$u*BsfJCsVE)iVTs9 zSQ|MxUR(#ex|9#jJ(zJcPP0aBIw73~?Zw*J&c>InrPQX00Lhb8EnBKT{i!bey3lt; ztcTe<>Td1#N)dg6{Ive2Nq$3+I81F)1gHb?Mb;QL;YhQi9(l9t4WjUN&RK@cOP$Hy zn1D@f>G=lzd0*pNzhTGJ8S<8vb+L(rMB)mS%lpHEo7BZOF9tRjJRYGFBKBUq$+{GI z?WoeVQ$MqkJ&eKXCKCnlEyu5G_g9JEmYmN4!M4M{;R=4^@x4jwL_OT?(cHq1OK?OK z7=G}Nkcgwj?+s-nA6c9VZ!*X-)=sh1C7lhq@*f@>0fZ_ciMe#?D5K_c={Wa{eyTp z=PW*Qb)O%*7~$6%BUH6~m_DcY3UL7ZVB@E^Bp9wO!Otg=Pm)^REt?t)+v3306joC|4Ifz5;YvnkHqaAL=%zF(X?dhGxykT#|v|Cm^F+B#_@aRzxC1|H2D9Q`R+lB@r-1GSoN0ZN#F#w)& zK9A;lG(DSh($X@l`Qw9f@PL*vYDRKOY-{1&^&p*R8r3T#@4wJzXYl|EX*uNc5z}7S zu5V>#Kj8Os#2>62tHdbQCaYF${QKoAGZ(cc{tKhjd=Rn0IeU%g*v=-M7!LieE66`+ zQwQ!+Y!Q+{@VQW#xQ_QZUl}mzr=K?dl)>sVQ;>P5#M>G(E{h2fqV>%d_02l;Jgn2V zF*Wzra$H#mur;x-%>c_VnetXcitFYcu1fDZb(yw?aFdg7bv}RhYxBj+nLOfM|Aorm zR22*lymZ7$^ch;D`J#yAGo8$&5^hT{#)c8)3_?=F7 zeG%Mg=X`q>d$DVcD$l0fY!e?y?!G5(Q^>14d8#(kD@hA6KmSe#R>SWhwCd%bes}5{ zljol7r^|c{4_~TQn%w}7UTl&)&|Ch1eQIKJf71$UVw;^2*+8?n)>}NAGHO-~@xAjN zxLl=>v8md`HGn_qyNo$t8=KXENW_OX*A=vEwhUnZ%#(1{fPHd}=G|LB5WCT96pxpdUkH-#p3Q%U z)P4`$O{K9lyZXvTKIs`r!}`_l=&>6U2R?bHqM?BdfS`E=#Bi1Zb=gM7r)A9jVTk?C zeNou18UVaT_M1%p6Cery-gtgnRSV6VmmQ|Gn+N+I6xWs6CZvYawBO7oLM6-xRQH9} zGg`Ylf4o!Re$Ev%rS-A6#!S=fInJM=8W5m|mSFHYuQQVLlkinR@_zv5P)KqO(OTWB8-T6V5v5Sz$wNl|A~_O z2xUETTAz0~w+`mt>-$Y5-wA(JJaMEpKq+P$G|_9>o+~JGmc;RvW{fonS>Cs8F=5ToZALhQ_J&>%w`+|^2nhlikHR&kT zsctkv>-$^E=*ZW$u}JIt27z2qCQ1D>4yA9uYR$hB@b%dSLX%WT0-uhfyew#}o~z4D zCezMgUao?2+oocE^#UbG@MMR?t5KMSWYLv=R zDmM4f7~)YwGJYI5l6t!+zeb~ZqCGfkHD-9~(YaRM%+;jhobNSLX(QQA{j`xTtBmF% zi-kZ#t?Au-2$~y$(!5>_vx!>zvlEPeXU{jBhmxn$Kam5-T5QxBU0!?(Guk=5zI3=u zDIaoiRCK&dbcVeES!}#%$Km(KR(WT$1e^hb%W(}_3Dk2~Yph(?yR4@z4GncyqIKqn zR=BXsv5c~xQj39PEv?h?xvu=H#Q>BDSf*q5pP%GLm8=gLp$M7dua#@TR;R( zBa6GmOhfr>yvkzY^4sjvi5!#5$z)NZWwYl7_SGF*m;QL+|GzoRP@v)W#)zfiOW)gR z{P@Rf4K*lM8ZSm!pKA?N%4~QQVACkS5R4SM0pGCd$;`}3BKO7XdO#vOGoJ&9W zvWI1tniz$825P6KV$%8!#u)NTe{As^a_la}@SrGm{Pfsk5k=0P)YS}!Sv5_bbcHl* zpbJFmKBQ50PhexSC8cLRzani0@QHD8Vmc^EZ4HxktYTtS5#?QLR4lD0-aROj58CHf zFjLFL_Kv0n<$?%_`#5;i8*TjI>pXXxtyO0xE~1`{k6DL^^|ttb{(yXgZT}Gc-k1q^ zW%$Pz;IS-KoqM2c5A!UKvo`#@{61()O?LB_VIBTdC=uauZ}Zm9aGy0g3HSSn^FLbr za|!iAB4xdzpQT#Q-M(W>4)31SFN$93+Gr32=b4QgLvQ6QOhb$-)L2wFWqLJK#>NGys#^q3n;&+RX&6ftA+ z9FEKBuj07%yA97iNDevwF!HA_=qKX8_&@6dUy%7violnCUyIWV1uE}GM*ZwFyS@dk z^5ZEA+;Zx(oU-zUHx4W(w2BTd{pZiXv0u8=tf8P)U)QA#XKdg2EGfd8Ktj&T#!S?B zAwW%~8x35u(e7`}(O}v5#C9H!iFKInOB3ymp>(N(JDA|$sfo6B1lowHIzW$L2nYo_JriL97X# z(mwioga7}hj}|jvJUSv&);hu<%Tk<`Y6JIL#_=Ke`3*Kjve&4RVvzlH*2=QQ1;p=l z;r$r4@80y1HfJOBu{NK6L+AWQa3>kxN)re@{e3!rKM-1)%V_zuDPMag(j;(`Q3^J- z>HAQc0f5y;157WKp0s!vxT7kKoAun5|9!jPmc|g5Rc+F3r3ZTRMu8L!uL|if^nyZ) ze~wk4t{?O!enZlkeTSm9t~OvYUyGfQ@FUHwFhlxy6`^%1uhEmz?eBUB8dh}(qEDBN zQk_zs`xPE;T^D^R;@W}(Os=>uwOy0SuG>h#ud7ryUJcwW7)|!r6EIuSBBgs9kRJW~ zZQB0V(sNy7?>B1{#?u0{;&1RQ;QJ-c=`*zSD|k54UC~j4qOXQRoX1Z*Q$ zLMEw;E0H9i&g&LrD{pN(OOOfCl{h$!nm04i#nbIMWY`@pYOFG&+J{>fe)?U*-+5w*-{_>w2z%HKhNkpNyz}aVv09-jg6?dv6&-$1~mF56rk6*C@9N`ai9&V=f2xb*BT@-BUmD`b2 z7dOK7lyFLti*Vpjy4e=cdz>;ck*;4~Ie1cBtYB288+Xb%QBrGK>(+m+`+rpP_)svO z)oTy;sP-(Kyc?&^>6yY9SSzVCUmRJhdQ46Y1UX#1^v{;RYmA447SEXD@}Np95%GDm zO%d>%&=OfHG#~YLwR!Gt0X9%BC80F`(*CA3+ugwSWTohfuQT_yL*$WvO(Yg7i1e+Dr$J*+lFQa ztZu6YC06dfYLt)3JCJx-3e4H_8n0T82Aj<_h`<`t=jDthv$xyB;z-9E887b;E>wpW zbsZL~D}+!p!RBO=dWhqH{#nno5R)1rnXdSuMp940T|X!Uz}tX)7b(aDTlESbip%*Z z=4{Btxh7K}!F2sRai7>^b;liS43U;l31tHh^C?liF&55ZX6$Z!J8m zw8kB4;oJPA09cXcwKCFeR5<{9f98;b-91ZiqNlHSv;@HWXFWCk+neye*Jn$L2uAYW zs&e--4tPtf;}1%8mNLC;=BHz^0SZw2)IVEXG8awkOL0>fir$bYH+Qk^v78F=tZI#@ z6HQw1YS1*hlf#foA3=SvXIZO_B&ezM?L<>Yw)DQqt@B@X<0ukwwREpP{LpVuWlL&7?y*9PMfAtb4%GWu8s_kLHww?nPAs4J&2+RCOWjW3~R zw&+nj19sm|_|;qY2=$!OWp4xS#c*CB)ed?6Dv}m!dJ0mlBW{+@s`Ft{QFbLR;9r&a zw!GoRolD>NQ%jH@Ikqar1TV4 z=wVW)_YTwX-DdBk5-}DVeTfJZJTJt1oXK{d`1wd`6dh^{&Lzw_@M&LkCUB%?_qk+N z_jHW;Yvb!Br%K7W`#}A(pO360>l%H+1p2$An}hMn8XBSwe%QG&2ho_tZdW0TJmA&} zxy@;MMYst;#K1Ul9B#mtw{}L@f4dU>6{|R7OrqUE4y}JDQ2QRS5)(PhTsQejy)PDj zztP+wbDE7JW~XEzane$J*h6ai=P%ayO5q7Keb%eU0NAF=jB>P6D||Q`5Ao}H>3)|! zBa%ouh{^4S7WULRGLE%I@C>aC7ITg7sBPGu?Mw|q_EOh(VnkO&_R7LN%pzuZA0`@6 zWt;r85wZV|z4riXYTed_*=yNQu%Ps|6p&670Re%mwU8P@qy!8IC;{oB5D;luf`W9Z zks2k07K#Z?sVf#Rpp=A;N)QkNh!F!)!~O7_`~TO|4{K+SrYl$j)%n{_hljOXw>E-u^H0vG7i4`CdP9bY_&TXcI zG2-h0x70!4xf3j#()c5=Ia|O-@b0-I~b6Si;KATydB%cXGHYgld1+tNArBfrZ@70oh08^RGMF$ zFmj`L%jpjKuD2wIO)IvQ)$pqAzc?YaM(dIPSO0;(eZY95-pNS^!o06Xj_>i(qNM-y zw-@;rmav-?k`^90^N5(|lq>VX+9^pXqk=47@94I%(I)@SE9fYLD^V`A$WVNv2=b&5 zpKnMBQQnso4VlkPJKlYe9xIXt0@W_&iM59U>n)`Y9-ek z5+gqfTVZa!b{U>omKQ|_(vCKEv|Dc_F8Ecs{bxyS{-U1zFfbW@Q!DG1=UfA7u1l!n zG>o^1l6Y3NQjrGn{cGX)FKWTR|8Sj`&XTkGm_MD}{587i*9pn<&Tr*p+1osynH&1X zB<{`LHV8a0L$ScEaDzB~i`#KGm{2;RjWj+vDOsr)#%Kf~>fyg{#{X4&=6-qvhqTde zCJKWjsg?dwb_CRX?m{0&)BRM{+0P@2)x{TAdZJ(B?CJ&H!7e0RGB&%0)swLw&`oMK zxAIbPRZf%$?(V?J#eUP7MkDf$c z6Ya4sUQ006g2s5LY@A37h{2Tl2^PPch;$WQ-a?f=v#R7Ew& z%$%9nv6CFXu(6z;iw#7reNm1 z>ao9LU({M4=J2N^_4=YGKD3|zjs^d>irPJ?BcJ(gA;?BoUg*;`h=k_2+!e(-PHCqB z{c3tkBRxoC^YRpD>I3olyWy5&?ZY#Hor{lsj*%wpd%meRsAEgg<%OCB|EQ|n1YX+J z)BXz-L-s$wI z9G&`eFGbKbQxJ^;esIfja-)AuPeZyQ!|@v8s<6&@%8E`k0}&7;JNeDn2X?X`xO)7g zkd*=m&)s!sBqk>$qFuV?r++sNyzr{m^NjiFW2Anhq>*y7`*W_n+ycXEk%6!(CL8*P zmOw}=-?abTcm8$f2dh7K^q=9FxnFRIN`+5;Swxb?puOlePlB+*rk*6kZvMm3oW!Pu zto=@Ia*kVS{&{t{%_*AqF?5Qt=wzd!@|pEWeE4<4`tS&p7dpcxa0W*^RKWaa=+a-^ zh93eK#s5Z~=&!E(|9$cQjle(e2<-Zr_(u*e|GaJee=Ymx7=ii`^f_mJw(UPhYyRq1 z$U}JDCqjP8TKdoO$N$x(|4)7KhwJUqk9|aFA(p2S%z3+B;8TXpN1#Vs+!BBPpK8KC zqMjo@$BvCwSz572pSzpEHz?g>lHLvSb-_kF@`ps9{~q=BOUA!Mh5koW{y$Qt5bU(S zepHoT(Ia_$ba88bWnS85OKN9lK=P4+tI=>mrM`Q1F3Kue2f6$U)C6&CXc?9+?%`H6 zee&t&n0RAL^>;#ygD9u0@V0=5|050lhg5P@>_EU-0W3gl0k2wdkNrRSFRpP|8Hr)U9we*Cd;?iKrO3DvVNiE}_H@aUc;Rsshr}*VI*}M$Ou$ zO8+7K`kyKEsKnyM5RW<&|e;PKj{T8`!xPX@Ywb8)2(ONKo}&0ko4Ha%|oQqrC4<< zwMe5eF1Xx<>gA<*dYgv@TREK>Y|<>-=K2t@M1jL}jWM+W8u#U7Q9rECg0Uo)=W!(| z!_j3f+W6-`sp{`~0M%}OF6Y_t;sPFNqZS%yWKua<3Z0mRfmvT?#Vt6Snyb7U%w3!@uzGfU4pO|B9y=L@p z2lfxzKk=9wNC8|0MUNbBcAA z6I`^>uUj9ul=wME+h{K$Ye8=1lKMje(XWz(VVofdbGF*3lI(}1LDK3yHLbEF)v>N$ zSdB?d#TmjqfjO8?f#-`d@GL!J9o^%Mxe`T! zswSe)*A82)c?h;ZtQ@9aZe@442UcB7d#(&Ty??m=N>#)Xu^(j7zGa0$KOK^7eTfE3 zzC?g`@R$j#b-0*|kJ5C~?|bijP|@U2Y}!LfUARhB__Pe8q=;HE(e|`9R5jr9QDkp< zw=Js0=?C2FhhF{`g{2=fUQPnP_ZBE-?5<)&VmV6~(Y9})`jH%;Uc=J)#{FZ@vMfW_ zC9C|*nnO;$zw2gaoBh%tyWGz2g8vkWH41)i`c*rx>e#t*(;l~No-PP8CTB6{r@!kg z;o&idH_K&(=0goB(%Jpb%y~CNg5(J`7r}2c_e?(*j~}BFw+vh|9Wq17!B|c{xCS}o zm?n32Uj4W0QyXv-B;9j%%uOKvlGy}v&HshuO?X*((0~rAsWZgD5uyXXKNj)+=Usob zUU&4^6uT*>3ywkK4)W!AP28JQR#upW!}hnF+4!bXYY)Gw34^K(O3K^Oy$?VYKG8Yd zj}Fa^teB8WVj64Hai62>GsCvv1<6^#9TGLYsc#&!erE1h*ow~MuZeo; z6zmj^4R}rXzv+bZ$r>nZG*}$~dlpsUG zvjd!pt%T=96Fn++&wLS5;p-)A)Bwl9rn3yYrlOr72Hx@JzHG@s714z3=mqNWJ451CqQRS zq)G~{9D*&Iw^C=YUGtf36ZUnIqt5xNG}+MWy?!u-K`{_I#Sp>v=hxLr&JGjc#8tIx zc@Eus05kitm8eGl@=ROPL0E&4j4*J5_4&Cc`ukoFu>1s1X--;}&*Kjs+dK;85GCHoXQBG3FI;b}SLJ=$GReoDPsbvp z(Pw*Ae3s7?ypO{`NgIMrC*RQARzk6e8?e(J)yAo4@&Lb*GyfbtT=EpXB3SWS?9FIl zhR`h|0;90)VV|e{n%QPNmToe2qKzn+6$4qf7`IGWv&vh?U^}n)!=gX$-jw*ty1vbG zg3G7E5;VIq*cPqGiO;yfs)$JDH~FQ?Ccv!2;03aml%l2v56c@}%y#m@)Keko&Q=Y% z_=dBe)A{)B|2?Pnu4k6&Apeqy9jVm2PB+BsQx1o@l$Mg7^VBaVJw8j%;Pp7B?&!L$ zva@SzM#T8UJIM?5=T^#BT2^2>+z#Ao4Klm&(WR3^;m@@V?5@GDT{jEsq;kGwByuK?0~G8=nO){ykOx`?Diwj3i}j;t^Hx>fAFM5@{b0-8}LIRY#}_e88g18m(iv$ zs1Yt!Zt&xyTW7LzAk@TK^2(`#By6S#>QTZMS_c+xIg84!%$_iiis-X1?BU$!C~p?q zfk|a~YgUG9BRXq;Cvb%E^_|2L%gUd8ps1sjj-9@-&7&y2R60X;r%!UN=SwEn_rpq{ zOZOWcuyn73IO!!U+I!v2o|Auy#lo7^>V`)oO+128v|>^rd)N##wU80Mm)H}nGn>vv ztL_JdnLKiS5ore9Ezdx!eNmRm+}%CC;H;}{?9JI5jM;u6+6mjt>hy)o^{JwuNsOzMO$^eBXqXGb!Qq9w_ZDV{a3lA z|B~tULvYt-^{QMutl0%nVtyr+oi7`onz?OUixczgTV!+yg7T!E^|1Wn7`Jwkt@fVSL zzqNB;@*ixyF1bVi`OALZalu`n_&DcUdCZn0R&-}sV!6`&^#xhE4^6gtO5XyRt9Vv( za4DTOXT|8ZcC>8doC4yo?r}mg)Ld0n+-JY`nFw|G%r#RdsDD(Jmwe(C=7*+Y|Ew9| zv~|BjMcX`;9lO!h4E-n z&$k=*IGkoN6GQ3K7B#&cn{k2#ap-$_ILvCpYfDGn&`YJFT!hq*^l-sYjg8DuQ-Zig z!tk?D(+wF#PX;^DgW%k5LnkuZL){nL_4Vw-C06Vm76V+|4=?sj&j;CFDPrh_<$0*I zE1e8M10`xF&vCO%wOL_fpmk8g(OC@#+q7*SUYP*~>k;>S@IX-v)Ld7FkgRQrr$Jo5 z^o5I=fJji1V$S?mKuu)&$qgAK!7TVVE8;%55|!a>ukSOtb(XG+TyXNjk==`(UrrXU zs??6}sys_|C+_^WCzUZt4YG!jVaGf6P1V4&-t)Paz^MD1gH1CXS5(SZA!3pISL~@3 zUaLj}W+C$4$_k>LyCtN_CN5Na^T_=$3w*R9D`z1dX1SGEVnWT}tO3b@SiGvhNf;*d zRl7nJ*>RiIzi;M%S$4pTjhHsrJ8i)0pt*qZg0j?VNyBtq-w=&tJd>`AjW#L)^%?NX zm{9$H2|GON{8FyO`K1(&8B1JM;;gdu5B*jV{T z`FUUbB7%76@;tcr+S|HB>)5s=dYG^1%$QJnuHu;=DJjtfZ?wWCvH*}hk4%7&Y5G6( zuukZzgq*bXb4pf4TBm+=VdSTrvw%*0*12^CXAI)olO8od%B?%7mHGQ?pJaUfrbFy2 z!XLdVj9If60zM!!XQv_CJU@jx;zHD`${@2?s<(G~j^!ad2IF1pDATI5A$!AIASI;s z@54d=z%HkmU|dJFdPm?|AJ^aFs2oXyPjX#BnCoq?gS<6P4OSQnL|OUyCL?m2ipR6N zkATR02B>EY1Rp)e-RGH?7^<+}$m8l~vbTnA_E*Y{4FaoC634PmNW>;1O6l*6*e`n# z+dPl;MUd8v4-Y27&wmMxwai?!_8tlM*xMasc~`5(Iltpu0F61nsbF>)AfO=lE7_`=Drvyw&^9)qAgFSI0=*LF!4y%)1s)k;q1rh9tH zBwHQrd$|&qQESkrUXXBzgGEDLeO-r>`d;3QW7y>=uUqD@biK=N>0Y@6CmeHOSda+J zQ0YHdvCRogyouDlOqV@E7x2-%EH0mW@#>i@9JAZOKU&9Yt1n~r;=&buU64OrdH7?a zlEP%Y>BssTVD(mBM9*1!?TL?`?9jXMkd$R@IbXM@Z`%Te-~M*WkgrtkcGt!lH< z+;wk{$lStl*Y)?~6n%ck#A>^_^)(kvn1f|LSxsAiKPF+b#L2-8#KyK_V}^cRIUAEN zW@6Ej&|%S%Bm*XK7M|HikUF3QQ;OuZ4Hp8Fr;)KKoU}VrdS}}?%fQ)&3vI;yHL ztt=Y|O;=}E-Q|8=QJxhH#onF`KV-;EF$ANuYkgNan8N{fc@zQ@Y|WmlYNb0!aiAR^ z)ma_&9``$^bsuK)2>8m+u_cpam#$5L(pC9Bka8_0+SDc*VNrY8OC+=4oQz&LAAgbW z@!v@?;iBCHMH@C+SD4)6F1=T-He6!RYlz$fMp`|eH{^5y-r(RZmJQpAgtMieR0&|rb+p9OpZ2W zQ*%1)aWm5N=;>P8feoPBe^`o-XnvUG1$-j#y zk4Bj-aD$hVTQSCQUA#GC{tJOoHa;~6+H}rw)<>GJF=RF_X z{Y1MfwyA?A8CGn5Be?`-n;&w^OHbOM=D?}1LU{RJOkAI`9}zvS8%KCOFDP>^n>c{jShz*B?ozFxAZDK%=-Js64hH$ourb^9ervEJt*H)$XdrR60JQNhztc{bZ=on zhad7xaie9U7mPY|=_uQ8AHWW(m@#E813^sL6G-f$BDx^1cDdkQbk%47Y386Nnp)wb zk%Zlodb==cMV_$=HYq&yU|STWn)#;R8hIi)1Idt%*0B;^xN;RQub&~uoNiQ7R+B$i z_@d2xYN;+T-JeC9p1bC?qW8|S&`hsDtI0*3+-=jdy3SYSU&J zMIF)QEfDH}Gl)1`4QFEv;Xqx7Qd=1vJY^z<7(A@)a znX=`P2X;1lvb#Oi9bf^1>JMY$!DbrjGhFnDZH>%+0??pv=czA!n-zYPB~ZRI0`d%b zx)hEom3EvSuS;g$y%2PmwW`EYV6B2pQ7LkNW90YAzj?@n84CTeZ&kimDrKh%C4dfK zO9Rj99h~Sa1kdW*tP>FelIL~f8^17ponNe@*a!mKya|PaJhs3Xf(Z%{| zWgS9B&_+Ejv5zwcaXT?iF`)&)cc4NR!T-0|BvwYFl%dW}Ba(TJWf z;xexnC!kVO+YBw>yH-#|S`OT&&@e7#q2ZA2wE#y;fpz0XRheb3W(DsPtmI-EAaB2E zp!!<tT7nzTmn32Zxu3yk! zw-P!^;NPw$6hn11VlAAl+BV7N+E(g#!@93hd>(z83H5{S2I-Y4YPH7LY6mB+5xXVl$D-haJJr(0pQ1P=f>|R;nJDuYHXafL{Wmnd z`vm!k6ie*1hmr2BNj1IA1g~7~9W)D$g+ZJP0>TTgF=&AzBHDHDG=4cpT%=iL;CX9I zS=Vr$IVQh^E&AD8W53}H z($zDbp2|&jq(VWiC6(VPJlUFc19x;sUpoLitz-@$e6RW}1olisq{mNWQi?>O01IpiSb` zQ-gFfhxkiUnWvmPER+)1ev%q4(VkxRfuz=m|VkeK-Mctd6_=zE`yL_i|st|E4#9t8NaW7zxPN?==S2KFwOeEhUk@cI=o zs(vbvJ6;U^-JzS$%~e5kaQ~ls=Qxq|*|1>s_mdwroebXS6%}oS1=zsgb}+vzW9ggG zLkzC?vUS?PAYgktyS$G$>iyuihCqfwA#B6hZ zEJOD7&wq?jf64x?;-Ra(0qKilTU~&`2p)k>&? zq4vt9)yVXX>p@mT1~H4UnSX@N%JB)9DrY%hmWq;deD27^3<@Xa>D!G;NXT3|3z3g+ zS_;coUdjcQwsGobFSTM`^xQ@b1EfDZCzYIz+B+iEinAtX;TAgQH8na##(Lhemvicz zZ`fW1(U3wHiA4#K#hE2+O8AWRK;KP48_1}9s>j?1ZKeOPhmcEX`8b$YMJ+2(v>mo+ zW%rgG-3B9+UkvEd>i4`%;Mk?8&4FwYKC8;H3pZzl-hYOY$IhZJRvlQp(eq1reOPt~ z$IrIuayAEk-p-NRp_(K9@Jr0gP-SPKQ*Y$x%V7b8CT0)UiR2I1wg+>VB_dI!EKIbN zwgRv5t_>dPg3AE%1CQzMY`i246qu^koF;`Lj3Lp3;zDiKHED(!;O-8qJpey33RAps zJ`NM7c0SY>7u91Vx5ZZ%sx_6>9&G=pgOh7w1gQT)7TxDuhV^Yw#}3ItKMa7m-v?E%nC#*W22K-VBJ?ZWhqR8ZpCyn!&Ek7^~SVW%N$CLiUTlQxd5on3J9Y(1bV4VX*(9x?+^ zBXG9QeqnO0*Q!R6acTu!b5l&It6h5ciiN>J~TT*{RQqrzkr)GRa z>pbYbdZuBj-EQ-N<-p<<_b$oT9+>L^PNne+$*>@0JW;~lTMG5Ov}N_8-Y0lXB;uTn z#%e&Kfuo+gsO7}K>=4D~x7|@nyEEOtKix_N z9L+W z1=^9_K{cXfnixvKSPe0$vRXwX+N5vu97-WGeL`)CYA1RiR*b4D>}mjPd~e%oAgYo< z?N3jO6laIgS(-j{$}o!e)K(Nh^B;YV1y4yU@ zoD41V9yU~?Uo{oamv?Vzu$zf#>AiE0iZ@@(k2&AynpxHP?LP#PKX*b^P+|+!L9N9q zZ<#+gGcjzJ_h6fp6yx^46kIZ=_ilLq)D{@ZNsST9@JP$T%;z=ys#xutQ4lpP+j0_@ zr+1%IZ}i0w_qKh`H~QLzG4{^No9~aKv59~+J_$LbjabAWNf|==+F7A*x&&gkdAwgo zgdM99rA4l(LS8#iCKVy%f{~I=pA`-GXH01@Ow3p0Ov~OJS`EGK zMCopUPK=<|D-yB3`GQ>0_$*a_sW0ceHzCBac1O_NLtJ47aaqyh9iZZ#XS5$wy~(YX zmu!pmPId^mYBlQz=@Z5W!q5I%tTzJlA3r(&h)#U)vMuJ#@xJ+FhspqH*bFQAV0mKz zWxr5qZ5!*{aR#TCw7+&L>nN3Gkf|(}cO_h6h+~J}H-k66*mWjC$B?4D&7<~qn+K+{ z{_E8MmiDOz;+qu{m31fl^r@QSkr6|Ay+-%8tpx&$;WY0_V150v2ZdqXy4@nV|7OUj z3ozm@OBD|&t!(6stXj_`rCCRYFduLa4A9O(5K`@0+@q}}*%gp=J4>%fss0Wf(vdF( zeB(xSUj$>kT+X-FWxv#9`$^%Grw8vsc4wta9Z*$Y(MZlW(84+Bwb7k*<$+8rOfBpS z7f!x6TVi-fS>8R=7RSDGp=y_Q z<_(aMAimbxv})fC8Lxvfo}-q14b1#I3#;OL`i=Xw!jF^FAN$H*9=2=;W!}x;{a$#c zKyZ5P<;#BJ#&ikuC-*-X#^t3N$7@&{2QFOh?21ZBt5mO4*UHQ=*Uq@10PtVJVBZda z4;ogGZXcBX(c|}FE&k}soc0%>Rhd7G9Z(Q>=;*)4&Tgb5Ldt>m(Hk>R|F-Z}V~alA z54JbEw6E-2modguM*Qdv<_c%P>g+D)`r2Avud(?=%X{F&@ic}Bz@NDLKE~S1$ zbnKz+n-2nMD;6L7jW51d?jM|-4oDGp9MsK& zjJZ)YqG4m)uVbh4Jf5<#32leHWlA^e3rdGH$cjcKv?Z;%I<2x8H}y0iTRZkS}6yyrka zq3OZm>e&W_u;jcSmOt;wt&RY0Zo4CF@??g+#lv^$Ue&Hy?Zj=KSVd^#ndc&Ipz+O0 z6ra-xu0g0n1H6#ox+59*qlwnvu5Of8CmcHo9OsPu`t2J84LueDZ;C*~iZ?Y{Ml~E9 zT~3bzzc5~-mlNN9qMvohI`-ZGEI-o>KK&HEAX8T7F?VTm-<(>?GFAa*g=rdoJr)pN z|Kf_G!HIF;zLmym_Vp-v$XZIUwDNdb#85kPbdd4PN5o>e_C^kjdx` z&Afj6NP!)}imzpPOgf`S1{GZ3M?@bv@6UEP7J+$ z_~(9+9hzTO1;U#`cIPz!e4ofSh}hdE&5fL)qKu}RLNSpwc zs77p%u1j=%(uv4}qqRQ63k0*>@1*XEdEZz!Yl4dg$GuVIbDX~Jq3cym>C&zfJST2- z2kRDCl`B8F58EXp&7Wh>XakCOuaQAVWCCJ;PFTQDqrRU$9VT*VQ}XnSrkBv+(ee)k z*HZ`f0Zsf@{l30keta^>*a_ZW)j{xP#xL7E=1Lqg@ON5~St1PsB$Hp7%`8qKhxFp2 z<}w#h)-CZ}miX}OE|^4Qdcm7xE}ZO0xXHR1fG|Z>r4%18U-AO|jf&e7(~16BFgV>! zKc{z^Xy*6`JX;9tGJ%|?B08a$Yw?^c2SLc50Z$)T!%5PwaSj^ILJs~>Ux4`g99RlS z3?lQr2GBT(pSI#SfRY1bJkUCK=zHm1<-%ll6RJ{56cW0tJdzhE!kpHfSD+4OU68+W z&Uiniq9WV)^;D;pwKZT5O3o+_UpZ$V6FBDjO{XHQBQR}*IaNOZ*v`eRZkXCPoyxX- z)AgHc+WvJ7?<91yyAI`XXVS~-VTxZi3f#UbYOSdndE3c;m;#Y|94u2TKBUvlumeqU zpJw|9I$@upWQd6&unln=BC7jfV`)cpRk;g!zzHFlTu#!RE55i8#IRY>7t>%BjSM** z7!hv=%qB8r&tnpE6iD{%yC;7%5}1?ghm~eosT88VV{qs041*m=Gp}f@W&*l4|DLbR z7#H5EI)nRm@>d@vTxfOkW%~6!5*uwj*G}>Gr zk+OVO%D{@c8f{on0&g;tEp94ihYyxiE=x*!izR8c(!Gk?$R&vRcR!XY+W0QmqcfYX zLDN&p-t}=hEipP(U&4m`(?8Zp-Yi79eWaDOe!)y{ZR)iFZoVsYAl}lF)P+e>dTo-p{g%R^Esb^E4YJC zqh~Y$e#u?MQUFV4SurLvbw5tByW?KAi@WoKMa3V-&)*s=@%eVT+6XhwkcfEW&Zw|@ zJ+rSSr!zx)`56A0;xPtXKD{d6j;PvX3rzl9M1_c;Zm0+KCFL6GLdcrYWO2RIqi9de zyxfd5#^1#(eapIM_`Rf=I#zY(SjcUjRP0`N zeKqK`3w6xI{NnWFitZ#mCmBtvbT}*ZiBO-f8Rw4JU2!+{QV;Ygwaj|jKklQqXBwRJ zWyK(@+)8WI&KR|-_rO#02Cht8FyxzuK{bk$Frxe|9NYv0j-O>KuGv-%cIPKbK1owUeTKskToqr+j{L@!hnAifsM#S803_0 z=GP$|FODV=ilY}&`<$~Od*K)ey13k$9fWjnKG^skkgwUzCw&e`Kdm_11;|$y^fNfF zy2u6nQQO2e^rUdjnyOT$LaT%4JI~4eZ?BVq3&EqxnZ$_1Ho0RP!pZrNJ!BF{H|?w^ zKJ;VA`O$r&3Uq}*1-e`s0EA}|>JjQlpq}$y0MeS_Z4=avI&LNvOO=XRk;XYc?*)EF zPGN_-fMbLT@ErouZUYsHTU9AlE2sKBP;@)7%~SL-|41aCM{&wM0xt`t$T@V z1d$C4yXmZI*I<5v|L;_OK~I9>iNwxJ*|h9>4@FUPW1G~Zl#@q2pJCAjFYtL1UtzD4 zeQcp~+Ep=FOUrXU=^m>6GSeQ+82alU^E_b{nkR z<@)s)V^yDSc6?56=7gB-ruYESxdR#M58Umb)MkwtBa9rARi(|w3(_7k>dqX3=#fQ*dX z0aDo=;rRpdU*P-XHMvWsK*lwGrgh}8FOZA1k_cYs%&1DT%*((qas5=>?^JEWU0{dr z=sc8)uS9<2&8@00h57>X$8(Y6d#r&L-5S#{LF~B>I+J(NBMy=h+pJ zhev1G1l*F5eM&3Jo%rLJ3;zaH!B`V!z~A~rg0OwI$- z7L~g0va8b?C(0}@xBes`Ar|8Ps9ygA{%tm`=NXuzXOEVc?3a_RfY(swj*Dz5or|b1 z@av1mS~#4cD(Qsy@3qi~EPSmNy{fD#Nru-y(HZrcs5s0k@)Hj)yd;C|GT0!pEVr3e zwIQSCHr0xn?JKRm=0@1asSM8D=4t6z)u=`m=Wd-g36jc%@k(YIOYenyi?BThyn>D7 z++;>hK+mMOVs(e^FVi~$+H%s5J9dTH>#wR+I=^bHSAHhn-xFn%z&0#1RaI97#3RHa z+oU*t5$%3>h1;Q@a}l;4;ID{@(YyU__)E+l87lJ0PFA%SS4E-%31}|9FuV z+hu8B&6Ct;z4qE%U-HJn2X_xddCx%4q7}xwS=L7?&i2-8t3sAW)dtF)&cgA(Xb#oK zGU{?n2yI7<>o~Vs`)IYH`eoZZ6F4XJ8=v=hH)6iz-<^CE>H21l#cFj8W-unWwm}0A zs|=3x@oOqK0kzMt;iOpHGv#}Po~DcQD1mOK^ZwWx0<* zUd}hC6d9Ltx_0dc+%}JUObAYQED{fVrnkIidd?NNK>yrAy*xfXzQg8T26k{eIjK20 zQ=UPwFyi{<5s#vlo0X}ocT!rk$d?mFY2odr^8{GzNdB@-%3dV0ru+$Wj%3i`q}lC4 zltlIga$~wjYjv}Y%nVn0PA<;|L8m;NB(>JChUXM#hhR;n3#5l*YG)+@F`ees`ChN! zuH+fSuj{V4->$ads`XQgu85?onVau>GX(6@5cJt!S7ds3tVTO-YBF|uV#YP5zc;&j z9rHTobb=*h+Gvy}cY-ERXxUerPq;j6+;bZUapHT6O^OjkEwSIXI1cVHCzkk4>H+6f zP-akeXIk3BH+{g(q*EVCmBy_~MX$)&uu;~I^i?@qz+5&~0AZ3+N+}aYrhm6RrN9;e zyrv+Sp=idc_&%Ui-|_n{0uNE zMHfD~{Qk&QwsEg9`SbAmCms}CAJSV^m56S+3H*juA{>3x^aWj^7M*@R;iZ@?O2+gB z#k4WbEkPDwsZoZRDP?C+u3PS*pEBO(8FLT7r(qmmAO2My-mfiq{rK-ybP3ZPDnfRL zUDy$E_w3>Qohn=Sv)l=5c>ti7FDL%+=rA(V?eK^(GWGt5*)dOo5y<1jC+O~Akri4_J6KUBQl~dK_$oKJ0Lr=}Th1cS{kjI(`I^IK169#2B z?k(@nU}PNs=Fx}YwrLi(7x>kUxdjX@gr|Ifyc}J1RPd4Et(a7g8A=&uA0O1ndQ%>x z)};3}u~VC$!sa2#zvn47)1iOL>XZ zt5vicBA=W`JXFRqaw9q??wd{l51zUWe#(klDKPTDxV%BbO;ljJy1wsciha5i>INYvd*{5BGu{Z>ST7ANI_SO`AJ}^1)BklnxiQEum^xxvb?XZd3g`1= zvazo9K~N=k(j4k@&!T4?!yh=Se>|Lm$u82(j|?Ut`(1|w;+54NK?F|fju_m8Ou-z; z>w}i6c1^q!)l**~bIH6PUuk|yrws;OMCAdd2ovJ)#&%l1fdTtW>)>}^?pkh;_RaAQ zvPB(Kd`*6rx8v3OCl5LtR!$3kCM3Jz_Dz}2 z`Q}i)#Ex>Nd8}!Xj0n-MkCYQE@hoF<6@DN6RMdi(aPpCgYiXCXoSfvhEbvwv>2pV$ zGu3Tr*5}!lN6uNDJEA0)aX>-nyWrJmL{~|5LkStBDo|v}$~<{MW(wXBs16T*$5YSI z9VttR39RwJyaNQ?gTQkz4VcfrJN?Me<&bPdk)Q>oazo%D3iunM{DGy(gL-aHU+s?g zX53dBD*#YNsSgOGBqP~)^OFH_8Ix?Zc8#K)yVC0tN3dYjf4CcY_H8#3cn9L53p!DW zbGJ_C`#tC`cGn%rDEFu4)qVobnVH#LrXwz$;k%0fZ+t>^4H*ShYKe0|M9st4&bt25 zrmQzI#(HAyd8?Xtp?d}fmxAmC7clm_|K;x&8BbZSV+lph3ZTboshFe_kDY{fP!jY$ zLDuqsEDGF0QhkpC>luK`^Os5IHH`NIxCAoc4(<9~4Bg>ykN=)@M|+2c6*nDYgWmax zh=|DlC=Fb@nRx=K+5k3x5IKI|HU=;Sr0-(qE8mz`Zt6*b?xMTY0pC)_M^Z98e*c$U zhhKryoo8ug>dD47>1Q$uECBt2IFM}N?z7G^`Y-+aC3o$8KgWlcqi6(858nzY47 z`0ok z6i${Nrg7@W-5m5!Ls-VWtTOh8B%E;q%2IB~C<|)l-nTX_6me2{-GT^a&g_{82sg^! z++|v=(e`ww%kRMUgOr{H7b=jQtfA8b04QS_ADWCr5hWd)MC|mJ6_wi4&Og#$hNu_d zM?|_1K3k{MYm7({g>4yE4Dw6c-P+u`!!Sn?2O;tr>)2)s;zO6|GZDIwW-K{x-OVM6 z%nB;O9plb8X&4vvdzVe49~7gn#lagW$_4_|1Qx0Og@*yoWeo+GKVi?z2-OgmVQgpQ z^dvov?Io3ii~7R);(P>R#7>o7T88vXn-ibKHDW2k) z^Bf`TSr$39?st^DakOqjppZ7&)h+X5E9qxVp(;r=@KZNi?c`2PoBOZ<~IOv8= zkCtJ9waI#wQv_BFk|N6GxsD_dBozA=3zji&v9eO&0|x9J7t>alS|+w(MT=DIBsF5< z6nYN*t{!85e)8??UH{?H#-hzL<@tKaqnL%yC6?@92JGUw@_5~!k_wYZ>Bi;0lq`O< z`kYZlf})W1no2RsBJ)Hi*lRcHkF!=QGEWUULCdnBxMw7sM5%xOFI~=*lIljIDW<2< z(z3y807^YT-O@}>0P*9l34Vgtj*<#cROa%qzPdj2HjpSo(O1p^`ryhrgFQU}Z;OBg z)>pfu@dCrpZinNAm4a!CQB`tofNKPxqo^R#c}PxfkB3sHIYGzP8o4QIS^S!4b0$-i z?XC)?X4H1k5^I~;HcR8XfGf4465sp$u)`d1*LKEB)AbMCp4~h;``srrQ*JzHT4NhjfWjd%@HigBt@Dkh-_K%%)RT^!C9YeKj3Y7g)`e>S?#VZKmt3^D=6`g}{r|fTrxPx9 zNs}wD6ZN`ZSNn>g&u{Z=eAqZ5SImureKQUdip)MgSA5g{&g`9`x18Fv^p6gv=rM&) zQPBXGK5b}VY>?O~lSd_0xOX!3VooYeFAzl5!X;UEfYz}bg2TG8o}?h>P3ys&+Kb%u zLS5uXg+9;uw2#27QI73R^6njyo=pL{+l{V&LSnbd&srs)B2{8n_H~AufBeeoSTRBq z5}j?)o01|0Z&E}yL=bRMy$Qk1LV$3o;IGe_|G0&HwCBqcou_+T=LFYGDdo+pDxBrI z|Ham~z%#l3@jE9K-Q0?#$YtiPMntjG!Q9C`gkmeAl!)ARjymp=F%puI`y~rSE=gfq zC6|g)R1{j$avR(Ff1Y*D@Be!JU;pjdp6A&!OZGgU@8|RWyx;HdvjNiJK&!Ir;aeJ! z=lX`b={Luq8I(GmPTfmZhoSh^__M?5_4$;x)aoNgO}pLurd2hfwg!)v#{AoU>Vri2T2WM(jZ$B0`(mp ztIkaF@JVMPI;XHQAUI3xFy2_%E_~SHhL{XVjj8rkRXxM}l&b1yT7KS=s>Ujn^!9z$ znOJ6(D^{b5G7@p({Bw_2!aH;P_j&Igp%T%_?PvFHB!1J0*4Lh*^6|M$FtEvbK8 z`{rMv7tKu#&roA3i1+mqa4)S}k`2|TBs*T5Fz)>_I4{)s$vu;OU}oCEdLB#{5`dW{ zHFtVTfgEc`PnkCBdQWK`E63{q@9IjVw-6`GZ63sFbwb61C@#vokVnF5jLm0XNo${a zSA*uFZ6lReO{eS3QR82VEppD+ZdE$H0gRe z4t8=08rhCorS29j@G?IjN;yKPBV;AnP>HClBxEN;4S74t0%D};>;^Obi}~3$_$-Dp z#&dU;#e)a0?FRHVcdQ9UI??=wi(cm4aU?g~vj@Tk%nS?{czhxxhexd%TqtSVpj35u zR82YY!R0~mrA3u-mzNOlwuUK?fHp_3mbQ~yhpEX5i{2WxEi8H)((=;wZBOXjlEXA9 z9*^}wmUMF-2{`C3K5NNGG^zkL_yOoCw7rf||1R<6rYVZkq^?+-=~$Eo2nKHDg9u0_ z2w5RMMWHuevQves0UKFKO8;hoP(fEQUC778F7Nrb3y-9OdPuO7!3lM4->$eu@R;ax zK|DXSVK5jR&Vsg?AJ!1wLX!)%h74ICymWdStb?lX7#WCnE?0YZZ-d|o6?!K>%>-T* zLcJ>L@e_6~tj{l3nOfZzhK=4nf{S9E_cHM!@wRwo<;dC3UfJw-S8n;7&;HJdQ?8VN zTLf$4ud?eM2fXAepSnZ+ zaj(vgT5~k!6)V)lxqc;s^5WwijmGrR0mCM*Q#@;P$ES)Fx>s)Ln3c12)7UI8FP72q zFJfP!(>*81;WXoVLO4xr!oIfk`l~S86RwY=Wz3z5Q!h51=9oV8xMvWf`EjD|6UL-9 z-8mt^(x#*&brQuqsoa)q$=P~7U@pV@q_lSBJ(y7KV6ljw!Jo1cm@GG1{>|k5ThGQ$ z9(CW0sns5?@_}?dK*o6cFgL!3Y4=D^+xLR_O}mHA!Vb$Cl(v*0lR=wEi%22lL}NsY zFtm>~Oh=%A;%y9YJSZlv4evxK81#FXE1RAj&dBXfmqUuD9=UQJVMsRiT5^OUYG{VFe$Z)>PEW+E%LF_EMXD$gRXU++rZzaTpBy2Dij z?KxPLeN-c9;%#YD*?Zn65%qh5n?y!qnS@m;=7GQ_7*_c~2J;)@*7Lu3BbkcU9+bvX zbv;g-z`)eEY&g$FI|OSvB#o6#iGIURYBM7ZW7EuHD(z>fV9b*Ibu9;^vN`pwp&5`O z4w{S)=(?u)x!^MX!DRr=GL7(|3iWmFq)Ms7P_7#;T8vGMbIloV8Hkqja5^<#5pHf9 zW)`t8Rly5~%5sP(U(NB1VW^sq7EF? zP7rQv{`Uq5N~KmvNJ8R@My@IeqEZ&kQS%;IAzZu!k}NC2UGWmT58>k1(dX1mXOVbh zfP&mBsh5sc5#O)$JLHydb!`^yhoX#5t&TTQqeGAZ3=6@+%sf>1O$BpVt9x0$7&O3~ z;U>4VZ!q+!ce7qp?2qkw4(v;4rmuP47bgo~oqIY%1o_sZ<=J@iN!t9mak3L4p+ygv z0$)=FIsmSgT_@ZZaR90nUsU}FQoFna?{F;r1@8hf`jj2fjDVbm#au|9G~2P z+b$s5@0y7Gy6_CYalar2szxC^K2B!$uh@cv(DJLWbW=cr3SG~oH$kD+)L>hPd~dBq zP-;BA3396t6TBYsPJAj7c2cj72x4S~0>l~+uDsbU>(Qq}CN+u%kBM2`=S~yfmn|6t zQ9k|f&er58KADkvJy`qI=%RhYvhjJaj@Z_AyUs52`#-$T8I@O>R$fzENZ;pgXjPd+ zOKFD#jppn#@k@^~ZOYfq)L!T#oEzn)g?VV&k(-qc3Cg!UMZVs8RBGn zq?3qySqXJ4t08O%ecrx?Wp#fdatu3qAlAIn$Ys{PinXmnX{B#8^5aXk>|L5{#g->* z#mHEzyM-tZHqzWGxtZ%G=!UR^M_O>@(RKHoQ@Z9V%pc@&cn~bC~8Fde2+Y zmCJ=8vh~KylA21d2`7R$k3vtDTae^5%6(EbRPh-)?tAM($O-L^U4ID(nC$-VynsYt z4+GcCXzO_z5=VNEHd~#?NA%^>P6lyc^Rdj_?Wh;6ufI)t+iUx zN8sff9wnrE-1l7U7Mpo7pu7Cx)@pI-F5`WR$++jGduKCR{hXspyxeV~6^Q%RzFG4l zWiAD9{P@<>s) zR*(H}F}8H=2%&dd)vuCD8LCw05rUq(ZMGxfqcTHP%8^hE>C#7j)rj*!ec)N6Sx9ab zrcHw6O6q@^7C)up2SGSUP;llKoG9xFq~5%{`B8<$y`~S&NR~xbc!R789#x1#{b>NP z&MYhbL%77fGkA!31&@%Y-ZSX4qmX)7;4vi_X;%|dM9cyxmWdgZV`?Ag_y`tu?a|l` z^tGsU4qYg(;Nf)ZabPLHn1w74Kn_#0yIN7A{J_e^}y~{EA<>enT)rjcZNwZ-OWDMM?B5}hK?6fHMT%smyRN# z1xXpluUJ};dh^8(3GRW+2Z9`(3cse=k>1{3f)!Op{wll*zq{xNKw~s%d8&-sFijAT zhkB7Dqc*|Mp?)E1^d<*5II#0m~J+!3JgjLz+mU#f>Ea_y9dYu>bLPaCC=h9GzPI>(&anfovvFO98 z&?YM&$=Xw`pY8Br;v4ijDnbJbn*a-Do?Eahtn29?RQ$8&BJIYy;xg~Sh3Z-?A@k`_ zK#azRVaEDB+O{|HhnjFlzAHtw1V4J|Vt-4kkkYij=au)_^TyP>&02XyM?cHvcKj3& zt+Nm2l$Cwn#Z{!en8EHfdY9(H`E&oC&fOrQ{qGj{hahxf{<|Gd-5bBB8&tWwf5!>G zhFC$9svuqhbh4oM`oLJNScBux+JkK`->rC*c|WUf+EH zHvd?4#o$Ep%B|4`g2`-}bHg%MjJIw@>eNS$D6@)Ft{&)(Z6-vo|D@pgW8+T&f1^KR zrRH2_gu**QYT2T7_?3wjs914WY52$0OB;)!c6L1@IEnz>7fl zFK?j4faHNA`UQ!a0JrE#Op|W9ySlr~1%Pn9+;7ElL_~eDQHcbzVm^KZ~q?xG^9Cu*d@ zdq-}!`!nMC%3X*2#BnK3rmH1(x`W@vse=K9^{Mj>5jjhHsL442`GZ#4Ny=`DiW-E~ zIDkNe1WU&7BLuJX25IqHhj0I^W+B{A{!Q>!riIJ><`*tv-difaB+mtJe;lqk<9we? zp4a-iz0ctmtN&@xJXF%NJKb>AT;bf)re9?o4jg`+_&R<_ukKv^`mNrTcdc_SM@FjY z&ISA^Y-Uc^3_gx6uH8{7KAU2MKWHi4=i2ck6;;XB$u66qM;2!4SFz>tAOgBIhgHD0 zhO;dSjI}LN#fmKJ#eaUEXJ$Q;lbmx$_sU0$<{f6#Y3hs*DvQxg7|K2UgskUf({g=D zqtruB%83@H3?(Ed`^b_;{jAsioRswDh_Bk)#HY1GXxbr+wHbITt(0G=StbgpHBmM# z8F+^3|6(78ZZ?#n%un@9Cz?JuLB2O?XK9ngP?fk^;t8o8KkyxZw?M$dIH8pwHWDOA zPBJNYd=`yn;HNZ!&rgk${*403p4i`Ukl@KcYZKCVcs{;GFi0K*g>8vp9Ifs4-?#m|hENWCh{If4%sO74ax;w+E_6PNEXs=klw%fCZ=AhYtFjB{9tF0w7>oAd%X@$xecP3hc*jhDg zT~`TcyalsS_7eqN=MJ>vJ~$yKzpbPV70<7ItTGN{7?>UuYuuceZYyFbIsbgVrvw>o zGvQ9EJnl?$!MIoy+JIg^($5#pVmOuSr!%HG64Tnpr=!-QSA5z2LMwl4S59w_-K5b`d*m_y=OwHfgO zGu&*e+JdSszly*V{UxBhC*;Q^|9+8~3{3|SX|;vzTu}_UiP73|Nk8Z9RZI9nl|(HB zHi`bGxV9*@z~$I<%`Q<~e|)qgrGCC+VZS&$(rB{(? z7){sl{cPUo0)?9ZR7Cg}GH;(oL-#oIZ)osXp#RP?!Q=JZ0Od#GS2Y5GsUe6M zf``@OteP;mL#`%3G?7*tf%sQ*bp#GUZU@f^3i_fWGRd=BOz}|M!Y8=EkN=0OT^%`k zb;Pxo=BA(z0LZ?5bJ6$Rg?P}pl1(Di);KQPqjM{q zp7-rrSbH#9=h;xK%FD<1e4DjKK4vqjj&?v`#cIsR63C4avWUV1(eT z7ufsPo<9U6t|B1~xjnF;X1xl)PP7I$6J2c;tD40ZvW>r+p)btN;T*e|x1E3gg9lfO zRaOqXiAwGJfuVnKTafa|%UMuhxCOUpG`e=E#QKi?5P9Os^L2p`hkjANg#VV4{V;P0 z&K;;8Fislae07jS^)|p|1ii#$RHJnK^(S6pv`W$xG2aVml-!76Zyl{NCPTI3TwAsi z6d1_ZtBrK8)GV4N>^{&fs5vw>>rpC!3a423=0~&WbE>3VJPrC@nJAc&P5k8B;&5LOJ(4)w&Zv#H=?jmvr~+@Q`|tp}biGz78GZf4m*t-IYg;zkya{R9&Q3m=S2106{_O=h-qD@e^LO9r z<9voE?v~LaF7AocU!Sv%fje8*=7hWbD&S+6qfdQ!-2hg5dGB5K(wIEn7V9w4n2e|R zyT*@&P5&}6t=KnVKx50Z1ORZwt@}+t-2G68(*Cb3@NQkBwh@Pk$tdy9)2p+d4Sj{% zlIWVzs*py>DDm*NyrAS5UUzBZzWs9{Z)%diNpW@>R=xLqPvBlTx=GY-z2H@00fBXv zeWT<{7M^&l4XAd2qPY4|t5N@_Kt6ToEzkG+3$NLf8kff}D+j(0jj+6Y^k=>G`bMs+ z%hiVkj}GY7k!D_uDL1|@%yfR$T#aI#UY90TBD3!b2%L?(Z@bS0Y`0&=%cw(9Ag?GWTyy-uMm3sC zW_{G=#2^`mEgOf^3V-VwPY`tJ6uVvfP%nCOhu~=$=p1xz5`!EF0n??Coam6Fv}->S zF`!T+xC?GWN>0>g`CTs`F4mKb5?iDX>_cS{VUPkbyM zN=FD7@HuA`&q0YO-<$U643vwxZrT?dU6t-6RAk{9+nm}bk8X7NtsjU%v zN}M_8IAZ0nf-1bT|7(8H%FGaVfcE)qRf}f1-B{Dh^H%R}VL58Eys4*yFAajNgIFP7 zTX45Uv~JxRx&qfBE&#oQ|ezx zkN_U+|7@Csduay9YcLNXg!hc}W>w5IHjZx0q&h4SND23~$bq9RVNsHf6%kt1Rm0S# z4q=Izo`K#=s_c6jID6${ zX9O*EoUmUT4_YeWS0a1T=Ll**08k=cQgvJVdM|I2X05ol)bOW*h##4H*Wjw(4ryeB z-zhdai1_5EK-^A0-bs#FV-$(f#;6?RQR&y%8K>*hGgZkC;I?MX+9Gcs<+;j^{rl3u z#ADjAmEuLNeY!RKme#ONWE0jv`-F!flr&>MgroLC^;=kPUe~zH`xNqGlr#R!&13Z` z8S%x~Eg%FL`R>263h__<%=#K+G#Xk!m_10O`A;>1Ul-&LgLN^lad4S_LdYTDd#k^w zDVuvTyW>*jjjXntyw9h1Da79~N?8JNhM_j5Zux-Pw3qtM(ZS^;o#{xSI?7Z>iw-9~ zhttm!=3GgOtx%1Ldp_lM0;p;x{nOEwM8O)#+@At&&;{P%!&}D6mwxwy%4J<4hs6{2 z*wE3(P4d`|e)N&E!`xi%$D@~q`+o`)NL|TW`!aWRhq)aP7p=WFZ^LE$T@uLFy4ltr zwstn@u=iB|p(x6Q9!@Wuc&0TsCNmS72`a1Ej_JsXRFX8B#E&U})$?;2joi@x1t1NG zK59@qCOK*%bv`3_1HOVn?;|<$tb_mU3EUeXJPzaZ^;2Z&91@HR+zARVg8*m6W|lI74hT$O9C|M8MCcO>icCDkKOCjIsnK+S)c`{ZP0Aj6>M z<;VLcjSB38gK~}UhGI=}=HLnt4Lm>pc}bB+9D1{|`_62}rI$SUcH;XtzOe^oV%@&m zet-Jbb;|rr6kIFMUd-EiKB=3Lv>vEcpopWVSPp38IR+|3*!GV|L9&5d4k#^#%U z(|saqF%h!o0ebOQz=7iI*M`7vSASDnBk-5-8l~!s_?jD@8g1H|*$%*6cMryiG|)Uw ztlEkY)XQD&|dLGk~1!mXPFn>00?yJHr&-Q8cQ}UZjjt z?@YAZouDFtt1e__$lW8!l|mmQy(_g=->AyTab#;s0|fhlQ6ZI@wl$?fia#jk65<$Z zbB42kAgurl7CxuNloAsEVJE$rLw*N!b|zHV)S5d6maDnV)LJ6y=!iMyivKg$XleRb zeg4Pz}4g zp+_V=qNF3Hl~*TT@7TFStDOE$9KcTYbz)gdb5_rZgWR;^#XYI9J!X;7QF*wmzzuHg z*5$_r_NJ5Qdr&yzN98@k1?5!xhxl^F2+)8?g?CV@cSmv#7qXAcGZ!_d?VsR!m|ZE0 z8?+~=scj>nlRr2+l*jN4&38{)LhS1sl*R~`BHys6r*3PK!?9tR|oY z5xWOq3qK8k3m0js0s4$&A8|r>0J3FNdhx#(T}6HvDM#?z;5{x^fy9Imo1oJ9RntHN z66zi(UXTs7L#~J1Xnd*@%VBccMLgDb2ecz!u2M2D_3U~=SVvHsIB8gN{#kAWPG|5b z*k6)@AMVXgFdEQ_F^U4G3C(o2^{auqiwTPdLJRa-#&nx_JyoT(E#G0Pi0bG^Q$w%3 zhVGR|2J^C_bDRf#gd1-4q&7r&^m=Z(tJ@xuj)`PHzGrp4)_b}0(-%`#Y^2}u12yc|(R(Wa8Wa!Yc+U%t{muJS0&Ukl)cN#3CFuhO=A6(6L=QAwaCE`G6 zFlS|2oo$-gcaNb_LWAp__O5%;sy=gu`mPFfl%bv*c3x9vtiI&TiR72wdUq^dKUF+l z5~Nj4_~@sb7M~n6prcjltpj1gq80Cj>21+UDM4Bf4w`@WG)sF=objG8fOHNpF@lUd zZR>fU41LOV({*@Kd|ho)T>p@(n*msx$pLI^RmUTiqd~3^?Ce>-FrxEy5raNoL!CnCpf!Y{N=JjO-x&h{insjG)WB%mkA|c z>PXXOkw86PNY_UE%9A+IrBvZmE~3DgP2CDiWvx2s0lN%+2D}1_fp=8|e(JU&zTXFX zCRzr&Xc5z27B#0#V?C6N^fpcYxp>^MEe`yrbkh#^sS?*!R`RfMGuI^85qsGYqy~s4 z#g<`CW*;S6rIJCqcSvHo2q82E4;R`%1t3>{V7mhv^wmD~s@B8Qlvv?mtEAJ#0SL)j z*rH#X^hJn@pUk!);Vf-4fwJI)md9Ay+@>AKJrI`x5C$3 zA&pNNpgAFg0Wt=tMhHyuFZoC#SIsOF*@uJxwosUG@mvG=Sh~r%(_KibENK)2@gg1| zlTm#Mh!HdcX&?zmpcR!$`56Oj`~ptGH+P*K)!+Q+j7-KBQv-`t-+DqGF7NWn2%>Q}Cb4Z;6)NlF(k}%*6L?>LJ&M-it zND!dBNNhm@1wsXqcHFKe4K4qpq95qGK!6hMw}G8?$>UW(s-)bv2)OzIXS{BpR(M$v zgekIxqY3VAPO%%Tvgs}Rb;z5F2ldB`2gs3bOea?G2%H3T)bvd9L|Vh60euHK?Pb&# zg$|pW?Nhg|=PBR5We4i zJ!5EBD6?~>7UTUC<}-E}{1Q=UV;fcKr{BL%d$W-asENV%hDNl1-X8iE*NhF&*r_*t zI)ROE`>6C}N5FU%<`3yj3Wxs<8pl#MZQ8pk@E_IkcXPp#J$l)ebxPH%B#Yl9{u17Z z%8tn;G%pjfPI&KoLaijc&_Ow2VpKD!-jB)|!&!xFYwdaiQR0q{peI$+pkC76e#fHJTlG4M}4EhYvGbdxBw5{HOl3*_!c3;hrvZNd!nBKNdzO*4w{Oa9>KTJ~`*>R?s~v>$2Y z5W>;iEjExQz^2;doI`IhK{kfox=KD>2UvWFnT(mIPFDK{gXpc9YGa+|iz;->nAC}! zdP|&kXa3E$WWzyFvzY_Gvd))OYuxQvsoiOAV>4+Qy)_gZW*r6+!%*W@b>p>tap2sw z(|E(Z=xt#f(f2*RS32T$1rJx1jVD-w^OyIA{qHmWzAQYuM+p6!@~Sf9VM^IbV9s3d zmcr;9^>rzwN1(tMn4H|va|>wuAOcU%q_k(ckrn;t3$SqYW}aH{&Lx_@VV?l?X@{+U z&fqJyL&5d!W`y^#pVv_;KYZU-Sl@Z!1`S)f-~8ab8z$ZC)Eu4X+Q+gW7gK!(o*o}O z9lIrYPm^nl+0ekCZ9C}@~d?`GdAo4F`^?J%KU z`+`-7MoB+G&#FEr^;L632Z@$>uhm`6jKWZ0Fs-bIPn#T9Yp{w#a0g#+VF$n(fG#he z9(RGG;2isi3AlqeCF!-DFzQ%V64Oela5x0F@vIfiSlE3LGJtB5-MaOPyCt%%g7P8% z%+Dk_DeIg_2G;k?FAg|VFNC`Q+5_^1z+wnP5^54?Spg3cAX<2gAnYT4JrWNEhzx?= zs`7bBn-JVZ&9oFKN)pX$m5|jvIG9E2rKwVYB9421?~F{+DDHb}uuSiQ5OhP$%S~>l zA5QR-AMSm(v-cf8?&zmYAXr8G2MA3NLO_+AIEwqA5Ag|r3qUWR`y<0|2Ju@)@R>-Y zfu=cx8VE9n1TodAqP-W@-ax*x&KZM<^{PxUC3`^|y#ur;O)go85ZVF=N0eG6h(J3K zTH}BoXLHGElVih);GS16b~{1PByLe{Jn?LLz1#NHt=Urklv+ohehGuoSMzS1{Ky*H zl=<$~)ngy;I+c?i{u2m(1_m18`V8JCWq?w2_U3hPo^+oZ!hXrfoA#)2+w0k}s${~^ zeBtr*l(q4ow%hob`kDxGcG=wEz7C#r*bdjPCQa}mhUSID@gtqs??I_;dG=fpDbM9| z&tE$g%FQ=jOu>E0bE;v?roG<)l7vrTjBlhL12uMvt~vIevEj%1c@i_2x}k~}zO0)+ zF2(T@UZ~nK%r8h4RKKU@1x6Hvq`#H^OPJ3n5fDaHJV={8#LivB_yNdZ|Gh!8eNXqg z?cm{4Vki3G0XKnZZ`^ruI3G^s%g}jg&UWrCG=EE~OwW~cdG*PHyd#I?R?;ed%dK7w zCIeC>;IVZ38adWK#7^V;i?XeW3zM@(0U*fg8!dG8i{|0jn+MRCotg3WilmFElfzVK z7TCk6xu`*5C~;Fz+P*ZbuVc;~t*o{bja5m@RY`}~$5}qjVN$c+>JtMhEfy^f+S?zs zq*|9N(1n^FI%ECJ#Az5B<_qe>NQvi?wlp?0K$6>ELST7WPf9tmwV?lyxugrjER2^0 zT_jnnhTZ`3L;|TgfmDa`wrWL0@g6`&dQg?n>9!SdOmR&HYbmu4?N(ND${~==J-+(E z;Xze(+CLDKN~&VJLuyvHlI=&bLdl`qLNRrA^fnzf52oj0tIhWfCzKMrb2Hc{WUnQZ zDzXq;gl%98P*ovKZ#b!Jr@f+ zdCYGWof_tL8G}b}VCM$7X@8ziqpT=>W&xNSz8$k>*K06GN+tT}=9(=Gk4MhLRj1@J$DUkiX#PHz%jt^) zOK|Eyop1mD=D|r*EYnR}mrUxfC^qxdf=e(2=5idz2<+#LUoY;OqE>LCwWS|4~`<(&58nD?GYsgA6 zO@-DnxFnR=K_S_>dsAj_7fRX6bo|&c(jmO1N`pI|Q6Zj-w+aRnKa&p|sY;@$3 zX$3dwT@sANq6<>Z#*`&lifkp^DgWIShfE_c4apDVzIRLj@k1%t`{PBK=jRn8W%^~h zA#mM0qj+}oR}kYzv@=Ng#SdCY0S0xJd_7WvK@o+6>Wg1*xtf491Sz&UMFfwF_HN%P zYA%SdIw^V-V0fMbRNutxEI+axs~ylo1bSOg7t#u$^WT|KzltEr%ixMRtVhv{&TL34 zdQ_DH@)hzq!cn<;H?SKX%QQGVmhI?qf^$dJKW{cMQtl1dL51|`90B9i)Y|@6W8!@s zLZ5DA81Lv~oFHZ_6N)K4*;gt9n>J1t%BjqUinml$98%&g7B?+u9=$N4oCjIe!PSn< z^ov>hFkMR#2h+meuM}&zUx2f*g!akvd8jlm|C;q2FX2LrrDFf|TWs<4?V7=rjtd>k z$nV62@ys%-FFE(S3>JR$d+v12`Kr`0yj}P2yy)yp|iq*zegZ_d1zjQa7WY}m+-SW_hrWJ%M{+1W=qTD8sI;9 zKOq;A`upx^q-aQ7wn|3*QIJ}Y8svvh8d0E&YZNJ5!1_AN-9eeHN;xcRQQDFmmUUAV znO<(<^agh~Io}J~zI-lq@tivf8NR6wC=}C@5a)oWxi4zv!7}G@AWiXJt8*LUG4?#r z^ua1brS({vq6hdlyZsbsm2$~RGb0C4E3#dv09QA;yV4G4gh@w}ilK*PL6)>i9M%(? zrqni=)PVhIZHdcJa*JE@mRqw9Lv8dHo`a>yq%>W7v^YgorHN1Y9dTPf3%;i3R0h=k zcV9H~@DbEaJZE;)!EHPF6v}(dx29*fDoZNv%31FX2aYox-ir9vPDO1C?-@>rHcDK0 z&)l`Jx-Bvp&KSD2lMh=uzftt3fTB)8Kar~=JyJM@$qZhx8I_sqo##obL(KCd{qDRV^W_waS4ZP0r)rx=OE#fZeYz(gU~wV>#sR*fS|9kL)c zS>>&#mbD-sdtuR1Aqghj$X(l)o@G@eF{Kdmd(7`dt+s@liJ{TkLc!r0W3Zf%y-?U6bAQu|WGY&LqW8$u(b*i(!|EAT5QauC^F z4VbA1W1O&HDT63Dk>wfZx)EAi4umB%3IdvHwpq3%623r%2dznlvL{q=Su_Bl4FIuF znn3uFz_5t7gl0K(Fh9c!2npl;J>W~qB)w%pGBqpH{k}CA9q~>-4Fc5gJ8t))J_nk{ zXk@3GrJvRnF$zBrtca{2+k&Wt`-Ieouwil)Ih6JY30!!5f;=BP0)z;u29csrnvW0x zdVFZ}RREKve}iYyL&)KEe*l_{2bPlDaQbk3yU@c$#o$gEq(OgfS@G1Oj0IR&+y+_~ z(pW7Ck})28FtVt4@}c~r)4=RS%p}3%@m%cVqdxUpw1=yU6s|N!lf(399i2JbLhFuC z)v;i_b5@ih+Yv(s$kZcswjS)gVGC=Y92ab#`h26xYiBjlH{ETha05ee@d$=$c;7oH zzwm8t+rAs_8!c5Mf?nSstIK8f5Ae2EKF&LHS&AOCpxbfT@MKiod7pW>{6ZFa;#0ep zW)#z7u)NZZhX!<=9;t_;c%dDG%0}ic#bmo}{-NjCBYi7{yI$(vxN|=Kx-h$oxMb{E z?%aGS#r|XFlSqyBE|xkcSKHnuEz^3i4!fWOYToy0gcl#}ODH~j-FfW23F8HRH^R1k z^>+5*#a~Z-9Ow@W9ymwjUQU;C?=Q;P(X^lQ$LFfK zl`LLsIY*Z4^G{3Y$Asviwl{_q91*h&aKv@9CSnX{Kn<5Od`CttcFZGvg?xu6Gqz># zPL7wzYCaX*A-(<#IhBm^TTG>lt>gksyBRB1aXd8bgt1yMcgtyW4)zO3I6s7f{EuA; z#6Q1e;^oM+)8DQ<0iRRwWi@HbFh96r^qqH)s4VHfPc-7qeWru|g64Y{^r{4V^NEPT zr`!w?vnsFo#h(I;sR<=Rwev?hAcY(}^=+Mb890QeVowO{{{4?N8MNIYb~v2*EcRSa zGd|;Bw78vRF9WSX$jr9NMA@!Nx?+9lubB2#b5_k!n3*AOJ?--rPot$$+aC`uYZZ19 z(tR1Sy;KP0u%yPMs3-#w&XwlU;Y%+A14V9o1BlOc;ZklAg63>QQ0<)g|lbw<6f%6KGgBcCoviuwR zk#xK)oozX<$a9R@zN%oPWL_Ho2={n)r*A9y%*N3KmAYwyR|=-iE*i4Gz6kK~)n~U>ESZcfO~LWnRLiw_seR$C}+rGkoa12_>;1=99)kk^5JP zzIA5eScO(%k=sr0-a1a(syv{)!4J_qXE28F5u#49K@q|73MKITiKyb|AJI>*`dpyJ z{AT>>1s6_!b2x)MQP)O}whyYnoM1k35C|5hs#`SYzTN#PaMu)Cja~yhOOVK8RSMbX zu&f1^O{kdJ%VhP3n(W{>*UXQrIUX18pLGvtW2i|5NjgVk=yma)$TTo&Bp0O>r4<-X z>gf_ua|)P z=0d^p&6k<7xyILqlYS8jfLJtaH}-eqF9Szt@&ONp-|K@i4iV#xpWePK|j9Y=~P3J2*Ap;8qacged;AQT&tFi)Lh75Ek;SJuY%zhc10lTsn+8L{E;=k9x9&fUVX9ceG00sJxj67z zfqMbU%2X(t(o)l^Pve99{Nx{}T|O;yCBm63y?ns1Mk zb{S9>SoVX0k|z{a=Udx2DK_0RoNj0QC@ArbI5pL$Ilr=suJWb$*@s#~e23{6)6d98 zaYff5=k2wTp_+t^mO>n}{OpBYCPdpP?0KoWSIaGyQG{HE*U*7jUkkcN+WCu|7tPDr zn>0M~ur7;?Z_0j}`v!Q;a85p{i9tJ*-xz*o5OddFZYCi3{h8t|3x_xrrMSYII830M zYY}nfAWZmBG=I(VKxiZ*=gxJXsi;Wrg5^_tEn{~yIW1*Z@z@6fpHC}lOs{A@_g0ko z@M=;2r@-f`BXuQK>R<1D3VQ|tHJx(V*vq`AWN_u&Q!O>`y-s?K3yh-ahcyb`D6P+F zb({ms@jSm18J}MVa{J^QmVLepI=!_a0QF<<$-iqk`Y%UcM|u*e`wQQnxuxp+)`-ER zdSEY~p}#dPe5b*zn!{_PFK2bebgU*!ZCQmh{O|RvTMJ$`c3*GhUNLf!e0M$jM&bAm z=2S@DvtezjTF2(uZz|e%U=(WM=m@e;bJJ#~wgHd6SZb;BmA%D)`9eU>+?DdswvAj5 zP;o9MzH84Nq%3J3JimBg>g+9TE3qp^lq)%PFFuO3KVCe!Z|TeFBiWP?pZy05d~BQ8 zgwa>sVx1@7M`~rCX|n(N5ARXeTriHfe6`8vVjgV%;lo|`>S=t+T*CX|$6p6aIK&@v zOXmAJE=OLFD?>^B6ku83oGoWq;|0W4CbcmyDSGg=DjT~2!4a_U|xJRuRi`dtna5l<4N5X zqvnUTX787yd`|8gM6Xhsc(OD5crD5ue%UcPPV18nQLvLsQ4+Fw<(ZF;jWL6_{4<2w zMbG{CQ$Sr^E2Snq!f)1%=TIG-cydvEYGt_ko^*R&rPmilFo5Xe$)M)HI!ATZ4X5|| zFtPH)dct6sc7wH6P8E@>$9vo{X;{Zw(jG5l+m!)#bv>udiRZ2j#EUvFR>!dxFVJic zQ>XPiW^gIR-Z1>PMrs0@q?>Niwn!W;WN(}JDbPF1M)NFvXA9@B6F=a0f)BYtoJ55N z%GCqCx9*Nv@$=eP-$1#p*EuVJ!ORqFR|}GB{eWbP9-+Muugi= zHs)DNhtL8;GO*thH3z;?!V8dIxW;`O!BaQ}FP%OgDu-_{=v{i(t~1@F=SMq!D0RHJ zk%o<1X`tj63q@PjEuN^Fb35!)`5H^|d4FJ>cfShKgSo+U=;9OC5|@d)K11T7XidYi zf-bL8LF>*l4uYGrvQF8qk4h)L_$+MAl1dxFoXc>NG`XDI@|k5`rcE+3 z5V12E#7Bn6<|mXXz@F_Ye}UgNGMG~WZLG+k$e^IuF26zP)i7Qhrx9LSvO4Q0>?ULwPwvFl>>fn?E*iB(;a%Yst5#Ai~Y zfkw16PIv&Uq8QXqfd*u53^x!9KX8c#<%$S@MmC7XE3lYWCX^exi9tLe zZ{fdFyb3)4v$74!2oKx!HLGo+rl3WJsXl^0WjO1Oo^{7lY3jf@)*z)Qob_BIl&|3E z{pdYXpQBF+D_khLY$y6U>2)0J$vCK~6qKJfEr}npTPL>PL?~bWvK~jGag)N?`2I$T z%X{qlFYifu$miw*ngqAgP_2Q>Cd|$j{GbN}{a|~vynQ=jSyE6^E(x_UkE}q4f6l_4fW6NPmr|P=CQNSum#fYg`?Js><#= zlvGfbeQ!O391CXiH{k#bwaC+>GyI_yDZr4ymye0V0i+UxkCB!}UVy<>S`mvh=V2`6 z52pWe2o-mW{;~6_fIK%55go)nNFN0%<0dG?_UzHifd3LA<3GMh?6O`_qgca!vD?Tz zDsSfWxZQ}wC=_OH^)ha^!65YVp2XLC=S)liQi_E)xIBta9#8w{s0_>HCB3D@<%PCy zZ4S%PS${GsG9Zd7n{7|?p+UdQQI3?;qR86#3>)|S`77y@c+?VZEPJr=8L99!N;Uz< z=2SZ^o56r)aG^Bt>(=w012cWkOWLO%&wpygr}ysTDmP9uFRggu-s}_qrosJ?g3D`d zLMqg0fl>Zv+!Y<=F#F`f_8;Y*#*^NzT> z^3nS*)~|}Uw0(i3S^P`wDbh+{It0a4?;CzzMD9&u(n^Edz5HZA-qkn{@Nhn_r(F-+Qvn~rDu&$kZGmH-ndolBkl;FdVE>W*;0Lh zdm#8R)qb_O(o3D<|DLB;~+CKG+yFU?#I6&khULec`5W$Acrn; zt&^LlTW7m%rIIJzzabPnI6wGsn;ZNGmmPh$dHV6!lZXpavm^aJ_5+LstNiFPsP&!? z_^;?nYW;Kir$GOGUiZMjy!lEfE9Wf+tKDCp&W@I2VbKGv{)!xGfB*aht6|?y0coxI z7FCT{N8xBQMQ!#;dzf+Rx4O~SZR@TWm8Yye)(N{c;3t=TtL{1stG*0tN;ei&3PT3e z&Gr5Pp$=R_54YDsEyXtX-GsQ5WP9_H`cG$i7V$*JO8A1C9~2lP`73T#ImW5*6%a_z zr`wd(MJ$iDvo*B}`;~6bZ_~~iDdd#R{UExM>l#yY`iYw?&%4wUd0C(D&V7DA5}U$I zcv~9sW;w8w2re|lMfivB7)&k)THe@~rOkW8>%I^xM`^qkD36|lSr7c=*he!THuG2p z`-llI?%uyq=ODc=)vY{BYA(fTAgFAM;ZvtT&Z}l(#nd!&#<^o|;e5){;do*}DRn5! zpmn6Wop|xOOV!Mt?tR%ka%gA6GG`d+Zs;#1>wEc??@I_J{>|nF-GA2+N8DFVtOP$^ z-~RTVcNev4mo%!qyHuCa>8zrEm^fpx1F@nI1vnDmTC!~VHMT1d9VlZge0bTkJX-Q_ z?4y++^6xJGcT1CoA)bmVDj9IDGF84pgMNDXgibrmr_h<&Xjqs&{&c3%_{*}|LS$VS zXIo^AJv#?fmA_u{NdKWdUiS$E(mtIcPDK6@ttFq%Evs$t<+z2_(PV3GOhh(CU1i=G zP5ZH=Hi^C9(ro;d96&y|ERP7=>U`U;Fa9gzZ5Nu4m1FT$yBH(6cq5T`qxDRaqE#^% zZ4*qn$t@c4gTcIhpFh8WqSxm;NPEY=!eC6K@`UGu7kwT$k9`O8=^0~S8P}Ni%(=S| zdHn=0-q}NZ%dq)LL?+$kc}+Ki?SsCk^v(d%okOLcvmCCpeY&f!*)d9i7ZKQs02z)^cj^Zmx~U%ie#ISNxwMfw+{AeqJKWuTnngeS9sSp;FWOg!i&qWL9YeQNTN%X8+rf zEu+Cc|43w^;zilA-Z2)ymk@f0$N}gn18xaJW-#nP>$oc%8GjKH+s-ZP*ZkeNQviI| z_QZoN#AU>Q%|8`do(jlIpjSx+q1N{8JFf!qWGqe(IReAvFEj0RFg-Ag{I|iu2LaiO zz;WCN#q6E;V;XH=-8)rx!e|@I{AN2W7MvEgTn^%eF2cxQhhR0ZT3GEltX9uW-ulT& z$ndm*6$#1TNuC4$5zaIc7CDqLg+)>;tQKTmB}wz2tZL23{A5jjy0<3Fp!1>E^{xZl zy&!{2w}Gi5J>*{|xAeO?TZBF;E(OzsKNktRv`5HcSQfRmZpEr4hrOYtnD;037IBG6 zy0u)hHIxD49$f70UVJYlfXNtu2(|s*neZnApk2RpN2LU+Uhh zim=0C$A-xihp$-yJ8ILXn;^L#!AzfW3k-q_;M%h?4vTofWP$S-+w86`7x{s1NP*1! zy2it|DEmg4*e9QEq+Q?ML~Ku}jE-RkRga5Rt?< z*}U!sKx#R$cBm`^c&Y-F!IK5#E#mZ^~GN zr2P@kAxeZ^cbx6Qw4ZEWKgmNHw&0={Eiv`K`Hp4NkxmDgB^1qpDFT=Q!JI36OCS&o zbHEhmZ)6Ea&f|p1vD+Nz{wH)o2{3Og4Ejq#tsMCIdXvoC_A@5e*ggFaybfY&N&x}Xbg6~P|gas*w zRKziMe+W+CuL}PmPPGsm7qEa9v4F6WK$1W{Nx&vQj*oPq70($Uf$Kwf+Qc`MO~J%B z86LDtAf&XC_qG;%ym+7+*)Bj*Z+=We=qmA_^!GNWJpt>9|I^yF#zb*N;ZX>W1TrlA zCMks$eRl&GN`DEVf0U*3zb_%EQ()RFpQcSsrE4ENGSt53SVNZUAGkr4eY- zVv|)Y1W^1T5AA97sR4ScM`hG{CIy+!@}2pd(cl29R}1 zXaLqzWP{PynN^sOs%XlEC2fE$j@W%cb3ud1#%;8!BH>}c&|iQO@MvErkO-vmDuy@= zZmb9_e6pioY@TUYPJg7aH)}w6ufgr}b>mFEn7Dr-V`{JM zrQ!z!UJ4~K?%|X$9S~L}wuV)oTCNpublY2&y{#k5Z^vylRocG~`%*F8F+FK9CM<~w zHMSO(?HEO|SmdJ6CqKz3)ED;Fj8;663Xg-(O$4?l2HEOtm?#RjskJisiK4Q)uuPlA ztc{c#H1!y%Gn!}8W@zbe`6+p|(63^7iBA@jwWU8kEHPaL3--0rA{O_Wt6n^$J!DJ)rK!hNS)tFhV1*&GNq>jX#K>k%igN>n zz7IpWCeVGqpc2IFdKvCTLo$vecXSYr+= zrLjicjNMOj&rdU)6_F*#=2W>wRl#C=XOh`2`&r0M?o_1HX=_D^7sh^SJI$HQQ5v@-j9v_+Q(NPMCLUoVom9I=F z;}D`RrdqXM2okMmF1o6+2Uc`X$<)5Ak=+|KlDoax1)1y@646Bw*)bYC=eRecL#tHx z)oZbsGnU?1qA|yPclQBI24UFlj@B{DexLQbG~s?dW*#nZ9^A(GU~>H5c;xzK#33TV z4CFa{;J|6UZ~Klb(9?`b2$BLb8CD{?O0QjTs`F)4xCau6(@gNB z>z*x<5$Le{Ck~o1b!D{OB!}OJ1%}H<&rEow-K5Vs6%)L`G9%&t-f&#<_Ssm?rD<0G{(SJdSs-qdlAH1zdr1#;Se26SI!Wnez@4jifUDzw-1S4LKLcA~ z>GWWQ5A7g^DOn;LJQS99)s^_tpAt@?BQYdKQNnrF$9pbYOHwDeEk!pxO7qJ+r*>zw z-P)DnM;~-|)(+VfeB1ndQ&-lGz+>T8{Cf_o@-fAxpNXzB`P-=VZm)A7GZj=kagwwl zNiQ0+i0Ql|`;S?kc8B%vJv$M7`6%v<-|ZXGJ`Vl8ZOGKMrm|<~YSQd9J>baaLwalU z^A4*e$xo8~vcuW=9du1R49gs#$T$KwB+SXW*6$6$K%Fyab;$D zVqGjjCus;g$*njN6%Fa(bC7DNZ6Dx71G{!u!{m6*=YI$dudQ#I_=xl6Ai5abbk6bINh9 zE>Lih+3Jq+Sx$gN(fzxmMAzL{4s8e$UGHBsexjnW<0M9p6;JBkr8g;!=eU?nLEz0O zI4nBSpU3=IGcXf?)O?+j62~*Pr%iSN`5DbclR3b3z!Z45D!=X?>qY*rO%3>ImF;0r zwJNI@%W;WX+o)|c?&VkH0{*>!E0JT{K2#nY?`|^H&Yt~A-a40kci%1T1CP7&@?Y9# zuX_JDrOeZf6$0Rue}8ywy{oc$wycR=>8ug%%*!vg&+c!2q7-|B*!Sy3?R>`Y-}n9j DhaTQ~ From 6747477e2f68c14d9ca699699fab5fedc85ab97a Mon Sep 17 00:00:00 2001 From: sebsteinig Date: Fri, 13 Sep 2024 11:55:13 +0100 Subject: [PATCH 36/39] added UI URL environment variable --- .../workflows/frontend-ui-docker-build.yml | 2 +- air-quality-ui/Dockerfile | 1 + air-quality-ui/README.md | 1 + air-quality-ui/jest.config.ts | 1 + .../src/components/globe/SurfaceLayer.tsx | 2 -- .../src/components/globe/useDataTextures.tsx | 25 ++++++------------- compose.yaml | 1 + 7 files changed, 13 insertions(+), 20 deletions(-) diff --git a/.github/workflows/frontend-ui-docker-build.yml b/.github/workflows/frontend-ui-docker-build.yml index 0e6e1b95..11737b79 100644 --- a/.github/workflows/frontend-ui-docker-build.yml +++ b/.github/workflows/frontend-ui-docker-build.yml @@ -21,7 +21,7 @@ jobs: - name: build run: | cd air-quality-ui - docker build . -t ghcr.io/${REPO}/vairify-frontend:latest --build-arg VITE_AIR_QUALITY_API_URL=${{ vars.VAIRIFY_API_URL }} + docker build . -t ghcr.io/${REPO}/vairify-frontend:latest --build-arg VITE_AIR_QUALITY_API_URL=${{ vars.VAIRIFY_API_URL }} --build-arg VITE_AIR_QUALITY_UI_URL=${{ vars.VAIRIFY_UI_URL }} - name: publish run: | docker push ghcr.io/${REPO}/vairify-frontend:latest diff --git a/air-quality-ui/Dockerfile b/air-quality-ui/Dockerfile index 9caf8958..2c3f19ad 100644 --- a/air-quality-ui/Dockerfile +++ b/air-quality-ui/Dockerfile @@ -12,6 +12,7 @@ CMD ["npm", "run", "dev"] FROM development AS build ARG VITE_AIR_QUALITY_API_URL +ARG VITE_AIR_QUALITY_UI_URL RUN npm run build FROM nginx:alpine diff --git a/air-quality-ui/README.md b/air-quality-ui/README.md index 8008ad29..7da45b4a 100644 --- a/air-quality-ui/README.md +++ b/air-quality-ui/README.md @@ -10,6 +10,7 @@ From within air-quality-ui: ### Create .env file with content ``` VITE_AIR_QUALITY_API_URL=http://localhost:8000 +VITE_AIR_QUALITY_UI_URL=http://localhost:5173 ``` ### Start diff --git a/air-quality-ui/jest.config.ts b/air-quality-ui/jest.config.ts index 10ae8bd0..293a4d62 100644 --- a/air-quality-ui/jest.config.ts +++ b/air-quality-ui/jest.config.ts @@ -19,6 +19,7 @@ export default { metaObjectReplacement: { env: { VITE_AIR_QUALITY_API_URL: testUrl, + VITE_AIR_QUALITY_UI_URL: testUrl, }, }, }, diff --git a/air-quality-ui/src/components/globe/SurfaceLayer.tsx b/air-quality-ui/src/components/globe/SurfaceLayer.tsx index f825b2a3..0f22ab48 100644 --- a/air-quality-ui/src/components/globe/SurfaceLayer.tsx +++ b/air-quality-ui/src/components/globe/SurfaceLayer.tsx @@ -14,8 +14,6 @@ import vertexShader from './shaders/surfaceVert.glsl' import { useDataTextures } from './useDataTextures' import { useForecastContext } from '../../context' -// const API_URL = import.meta.env.VITE_AIR_QUALITY_API_URL - const shaderUniforms = { uSphereWrapAmount: { value: 0.0 }, uFrameWeight: { value: 0.5 }, diff --git a/air-quality-ui/src/components/globe/useDataTextures.tsx b/air-quality-ui/src/components/globe/useDataTextures.tsx index 8b25ca83..5013844b 100644 --- a/air-quality-ui/src/components/globe/useDataTextures.tsx +++ b/air-quality-ui/src/components/globe/useDataTextures.tsx @@ -1,29 +1,17 @@ import { useCallback, useRef } from 'react' import * as THREE from 'three' -// const API_URL = import.meta.env.VITE_AIR_QUALITY_API_URL +const UI_URL = import.meta.env.VITE_AIR_QUALITY_UI_URL const generateImageUrls = ( forecastBaseDate: string, selectedVariable: string, ): string[] => { return [ - `http://localhost:5173/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_1_of_3.webp`, - `http://localhost:5173/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_2_of_3.webp`, - `http://localhost:5173/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_3_of_3.webp`, + `${UI_URL}/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_1_of_3.webp`, + `${UI_URL}/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_2_of_3.webp`, + `${UI_URL}/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_3_of_3.webp`, ] - - // const imageUrls = [ - // `http://64.225.143.231/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_1_of_3.webp`, - // `http://64.225.143.231/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_2_of_3.webp`, - // `http://64.225.143.231/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_3_of_3.webp`, - // ]; - - // const imageUrls = [ - // `/volume/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_1_of_3.webp`, - // `/volume/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_2_of_3.webp`, - // `/volume/data_textures/${forecastBaseDate}/${selectedVariable}_${forecastBaseDate}_CAMS_global.chunk_3_of_3.webp`, - // ]; } const createCanvasTextureFromMultipleImages = async ( @@ -59,7 +47,10 @@ const createCanvasTextureFromMultipleImages = async ( const img = new Image() img.crossOrigin = 'Anonymous' img.onload = onLoadImage - img.onerror = (error) => reject(error) + img.onerror = (error) => { + console.error(`Failed to load image: ${url}`, error) + reject(new Error(`Failed to load image: ${url}`)) + } img.src = url images.push(img) }) diff --git a/compose.yaml b/compose.yaml index 92376ebf..849d2197 100644 --- a/compose.yaml +++ b/compose.yaml @@ -75,6 +75,7 @@ services: target: development environment: - VITE_AIR_QUALITY_API_URL=${VITE_AIR_QUALITY_API_URL} + - VITE_AIR_QUALITY_UI_URL=${VITE_AIR_QUALITY_UI_URL} volumes: - ./air-quality-ui/:/app/ - nodemodules:/app/node_modules From e6a3de4a571b2d4210edd0efed2258c4311f20e5 Mon Sep 17 00:00:00 2001 From: sebsteinig Date: Fri, 13 Sep 2024 12:42:43 +0100 Subject: [PATCH 37/39] fixed texture updates --- .../src/components/globe/SurfaceLayer.tsx | 13 +++++++++---- .../src/components/globe/useDataTextures.tsx | 3 +++ 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/air-quality-ui/src/components/globe/SurfaceLayer.tsx b/air-quality-ui/src/components/globe/SurfaceLayer.tsx index 0f22ab48..500fc9b7 100644 --- a/air-quality-ui/src/components/globe/SurfaceLayer.tsx +++ b/air-quality-ui/src/components/globe/SurfaceLayer.tsx @@ -42,6 +42,11 @@ const SurfaceLayer = memo( forwardRef( ({ isFilterNearest, isTimeInterpolation, selectedVariable }, ref) => { const surface_layer_ref = useRef(null) + const isFilterNearestRef = useRef(isFilterNearest) + + useEffect(() => { + isFilterNearestRef.current = isFilterNearest + }, [isFilterNearest]) const lsm = useTexture('/NaturalEarthCoastline2.jpg') lsm.minFilter = THREE.NearestFilter @@ -109,14 +114,14 @@ const SurfaceLayer = memo( useEffect(() => { fetchAndUpdateTextures( - 0, - 1, + windowIndexRef.current, + windowIndexRef.current + 1, 'reset', - isFilterNearest ? 'nearest' : 'linear', + isFilterNearestRef.current ? 'nearest' : 'linear', true, materialRef, ) - }, [selectedVariable, fetchAndUpdateTextures, isFilterNearest]) + }, [selectedVariable, fetchAndUpdateTextures]) // Handle the tick function to externally control weight and sphere wrapping const tick = (sliderValue: number) => { diff --git a/air-quality-ui/src/components/globe/useDataTextures.tsx b/air-quality-ui/src/components/globe/useDataTextures.tsx index 5013844b..c34a58be 100644 --- a/air-quality-ui/src/components/globe/useDataTextures.tsx +++ b/air-quality-ui/src/components/globe/useDataTextures.tsx @@ -113,6 +113,8 @@ export const useDataTextures = ( fullImageCanvasRef.current = fullCanvas if (materialRef.current) { + console.log('fetchAndUpdateTextures', mode, filter) + let thisCanvasTexture, nextCanvasTexture if (mode === 'forward') { @@ -161,6 +163,7 @@ export const useDataTextures = ( const updateTextureFilter = useCallback( (filter: string, materialRef: React.RefObject) => { + console.log('updateTextureFilter', filter) if (materialRef.current) { materialRef.current.uniforms.thisDataTexture.value.magFilter = filter === 'nearest' ? THREE.NearestFilter : THREE.LinearFilter From 47b0309dd63263f4f0f756e70690c6113c0ee42c Mon Sep 17 00:00:00 2001 From: sebsteinig Date: Fri, 13 Sep 2024 13:09:02 +0100 Subject: [PATCH 38/39] increased Firefox compatibility --- .../src/components/globe/CameraSettings.tsx | 2 - .../src/components/globe/Controls.module.css | 7 +- .../src/components/globe/Controls.tsx | 16 ++-- .../src/components/globe/SurfaceLayer.tsx | 12 +-- air-quality-ui/src/components/globe/World.tsx | 6 +- .../src/components/globe/useDataTextures.tsx | 92 ++++++++++++------- 6 files changed, 74 insertions(+), 61 deletions(-) diff --git a/air-quality-ui/src/components/globe/CameraSettings.tsx b/air-quality-ui/src/components/globe/CameraSettings.tsx index 196a3b94..cffee6c7 100644 --- a/air-quality-ui/src/components/globe/CameraSettings.tsx +++ b/air-quality-ui/src/components/globe/CameraSettings.tsx @@ -1,4 +1,3 @@ -// CameraSettings.tsx import { CameraControls } from '@react-three/drei' import React, { useEffect } from 'react' import * as THREE from 'three' @@ -21,7 +20,6 @@ const CameraSettings: React.FC = ({ const controls = cameraControlsRef.current if (globeState) { - // Globe settings controls.minDistance = 1.2 controls.maxDistance = 1.6 controls.minPolarAngle = 0 diff --git a/air-quality-ui/src/components/globe/Controls.module.css b/air-quality-ui/src/components/globe/Controls.module.css index 86962589..03173df0 100644 --- a/air-quality-ui/src/components/globe/Controls.module.css +++ b/air-quality-ui/src/components/globe/Controls.module.css @@ -1,4 +1,3 @@ -/* Controls.module.css */ .controlsContainer { display: flex; justify-content: center; @@ -20,12 +19,12 @@ cursor: pointer; margin: 5px; padding: 10px; - background-color: lightgray; /* Default background color */ + background-color: lightgray; } .controlButtonActive { - background-color: blue; /* Active background color */ - color: white; /* Icon color when active */ + background-color: blue; + color: white; } .sliderContainer { diff --git a/air-quality-ui/src/components/globe/Controls.tsx b/air-quality-ui/src/components/globe/Controls.tsx index 0efb9ba1..a8236a3b 100644 --- a/air-quality-ui/src/components/globe/Controls.tsx +++ b/air-quality-ui/src/components/globe/Controls.tsx @@ -69,7 +69,7 @@ const Controls: React.FC = ({ if (numForecastTimeStepsRef.current !== newNumForecastTimeSteps) { numForecastTimeStepsRef.current = newNumForecastTimeSteps - forceUpdate() // This will trigger a re-render + forceUpdate() } }, [forecastDetails.maxForecastDate, forecastDetails.forecastBaseDate]) @@ -246,26 +246,26 @@ const styles: { [key: string]: CSSProperties } = { display: 'flex', justifyContent: 'center', alignItems: 'center', - gap: '10px', // Consistent gap between all controls + gap: '10px', padding: '10px', backgroundColor: '#f4f4f4', borderTop: '1px solid #ccc', }, controlButton: { - width: '50px', // Make the buttons consistent in size + width: '50px', height: '50px', display: 'flex', justifyContent: 'center', alignItems: 'center', border: 'none', - borderRadius: '10%', // Consistent round button shape + borderRadius: '10%', cursor: 'pointer', - margin: '5px', // Add consistent margin around each button - padding: '10px', // Add padding for more consistent button sizing + margin: '5px', + padding: '10px', }, sliderContainer: { display: 'flex', - flexDirection: 'column', // Make sure this is typed correctly + flexDirection: 'column', alignItems: 'center', }, slider: { @@ -278,7 +278,7 @@ const styles: { [key: string]: CSSProperties } = { borderRadius: '5px', border: '1px solid lightgray', padding: '5px', - margin: '5px', // Add margin to match the buttons + margin: '5px', cursor: 'pointer', }, activeIcon: { diff --git a/air-quality-ui/src/components/globe/SurfaceLayer.tsx b/air-quality-ui/src/components/globe/SurfaceLayer.tsx index 500fc9b7..07f8cc36 100644 --- a/air-quality-ui/src/components/globe/SurfaceLayer.tsx +++ b/air-quality-ui/src/components/globe/SurfaceLayer.tsx @@ -1,12 +1,6 @@ import { useTexture } from '@react-three/drei' import { gsap } from 'gsap' -import { - forwardRef, - memo, - useEffect, - useImperativeHandle, - useRef, // Import useEffect -} from 'react' +import { forwardRef, memo, useEffect, useImperativeHandle, useRef } from 'react' import * as THREE from 'three' import fragmentShader from './shaders/surfaceFrag.glsl' @@ -36,8 +30,6 @@ export type SurfaceLayerRef = { changeTimeInterpolation: (timeInterpolationState: boolean) => void } -// const geometry = - const SurfaceLayer = memo( forwardRef( ({ isFilterNearest, isTimeInterpolation, selectedVariable }, ref) => { @@ -123,7 +115,6 @@ const SurfaceLayer = memo( ) }, [selectedVariable, fetchAndUpdateTextures]) - // Handle the tick function to externally control weight and sphere wrapping const tick = (sliderValue: number) => { if (materialRef.current) { if (windowIndexRef.current != Math.floor(sliderValue)) { @@ -176,7 +167,6 @@ const SurfaceLayer = memo( const changeTimeInterpolation = (timeInterpolationState: boolean) => { if (materialRef.current) { - // console.log('change time', timeInterpolationState) materialRef.current.uniforms.uTimeInterpolation.value = timeInterpolationState } diff --git a/air-quality-ui/src/components/globe/World.tsx b/air-quality-ui/src/components/globe/World.tsx index f48ba9b6..312a298b 100644 --- a/air-quality-ui/src/components/globe/World.tsx +++ b/air-quality-ui/src/components/globe/World.tsx @@ -1,10 +1,9 @@ -// World.tsx import { CameraControls } from '@react-three/drei' import { Canvas } from '@react-three/fiber' import { CSSProperties, useRef, useState } from 'react' -import CameraSettings from './CameraSettings' // Import the CameraSettings component -import ControlsHandler from './ControlsHandler' // Import the ControlsHandler component +import CameraSettings from './CameraSettings' +import ControlsHandler from './ControlsHandler' import LocationMarker, { LocationMarkerRef } from './LocationMarker' import { SurfaceLayer, SurfaceLayerRef } from './SurfaceLayer' import { @@ -98,7 +97,6 @@ const World = ({ )} - {/* */} => { +): Promise => { return new Promise((resolve, reject) => { const images: HTMLImageElement[] = [] let imagesLoaded = 0 + const canvases: HTMLCanvasElement[] = [] const onLoadImage = () => { imagesLoaded++ if (imagesLoaded === imageUrls.length) { - const canvas = document.createElement('canvas') - const context = canvas.getContext('2d') - - if (context) { - const singleImageWidth = images[0].width - const singleImageHeight = images[0].height - canvas.width = singleImageWidth * imageUrls.length - canvas.height = singleImageHeight - images.forEach((img, index) => { - context.drawImage(img, index * singleImageWidth, 0) + try { + images.forEach((img) => { + const canvas = document.createElement('canvas') + const context = canvas.getContext('2d') + + if (context) { + canvas.width = img.width + canvas.height = img.height + context.drawImage(img, 0, 0) + canvases.push(canvas) + } else { + throw new Error('Failed to get canvas context') + } }) - resolve(canvas) - } else { - reject(new Error('Failed to get canvas context')) + resolve(canvases) + } catch (error) { + reject(error) } } } @@ -58,18 +62,44 @@ const createCanvasTextureFromMultipleImages = async ( } const createCanvasTextureFromCanvas = ( - canvas: HTMLCanvasElement, + canvas: HTMLCanvasElement[], index: number, filter: string, ): THREE.CanvasTexture => { - const context = canvas.getContext('2d') + let canvasIndex: number + let frameIndex: number + if (index < 16) { + canvasIndex = 0 + frameIndex = index + } else if (index < 32) { + canvasIndex = 1 + frameIndex = index - 16 + } else if (index < 48) { + canvasIndex = 2 + frameIndex = index - 32 + } else { + canvasIndex = 0 + frameIndex = 0 + } + + const context = canvas[canvasIndex].getContext('2d') if (context) { const textureCanvas = document.createElement('canvas') const textureContext = textureCanvas.getContext('2d') textureCanvas.width = 900 textureCanvas.height = 450 - textureContext?.drawImage(canvas, index * 900, 0, 900, 450, 0, 0, 900, 450) + textureContext?.drawImage( + canvas[canvasIndex], + frameIndex * 900, + 0, + 900, + 450, + 0, + 0, + 900, + 450, + ) const texture = new THREE.CanvasTexture(textureCanvas) texture.wrapS = texture.wrapT = THREE.RepeatWrapping @@ -89,10 +119,9 @@ export const useDataTextures = ( forecastBaseDate: string, selectedVariable: string, ) => { - const fullImageCanvasRef = useRef(null) + const canvasesRef = useRef(null) const imageUrls = generateImageUrls(forecastBaseDate, selectedVariable) - console.log(imageUrls) const fetchAndUpdateTextures = useCallback( async ( @@ -103,23 +132,22 @@ export const useDataTextures = ( newVariable: boolean, materialRef: React.RefObject, ) => { - if (newVariable && fullImageCanvasRef.current) { - fullImageCanvasRef.current = null + if (newVariable && canvasesRef.current) { + canvasesRef.current = null } try { - const fullCanvas = - fullImageCanvasRef.current || - (await createCanvasTextureFromMultipleImages(imageUrls)) - fullImageCanvasRef.current = fullCanvas + const canvases = + canvasesRef.current || + (await createCanvasTexturesFromImages(imageUrls)) - if (materialRef.current) { - console.log('fetchAndUpdateTextures', mode, filter) + canvasesRef.current = canvases + if (materialRef.current) { let thisCanvasTexture, nextCanvasTexture if (mode === 'forward') { nextCanvasTexture = createCanvasTextureFromCanvas( - fullCanvas, + canvases, nextFrame, filter, ) @@ -129,7 +157,7 @@ export const useDataTextures = ( nextCanvasTexture } else if (mode === 'backward') { thisCanvasTexture = createCanvasTextureFromCanvas( - fullCanvas, + canvases, // Using the correct canvas for the frame thisFrame, filter, ) @@ -139,12 +167,12 @@ export const useDataTextures = ( thisCanvasTexture } else if (mode === 'reset') { thisCanvasTexture = createCanvasTextureFromCanvas( - fullCanvas, + canvases, thisFrame, filter, ) nextCanvasTexture = createCanvasTextureFromCanvas( - fullCanvas, + canvases, nextFrame, filter, ) From 87cc5b3ab42cba244bbe50dfc8ed486e31463027 Mon Sep 17 00:00:00 2001 From: sebsteinig Date: Fri, 13 Sep 2024 13:51:43 +0100 Subject: [PATCH 39/39] remove debugging log statements --- air-quality-ui/public/all_colormaps.png | Bin 1436 -> 0 bytes .../src/components/globe/CameraSettings.tsx | 2 -- .../src/components/globe/SurfaceLayer.tsx | 1 - .../src/components/globe/useDataTextures.tsx | 4 ++-- 4 files changed, 2 insertions(+), 5 deletions(-) delete mode 100644 air-quality-ui/public/all_colormaps.png diff --git a/air-quality-ui/public/all_colormaps.png b/air-quality-ui/public/all_colormaps.png deleted file mode 100644 index ea79254290bda2f44b11b2f5841f16013be9793e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1436 zcmV;N1!MY&P)V>bE;TMPEFfrfbZ~PzFE4FjbZ~5MbZlv2E^l&Y zFDf=4MF0Q*32;bRa{vGjVE_ORVF9Q=r)dBH1qn$+K~#90RgKGT+|~hxze670L~_U( zX-0NzNsg6xks@x;tb#6zZoBRi^d-gyT%y?CLLf8 z31@AFsqRSg4?N3m*p)Zjs+!xmWhWbCJW3orFq)Q^Qu5D0@HkR@camY;BQXt|$-GC@@x8<0_L5J#E7Dx!^*LhPA}4Di9M6&MubBs*)#%_&F1c{XZJ$;q z4AMt+wZI*rY%dv=VbjgT zwZQQmwCB+K7G>~+E}yXvA&)*>vU>lT@87+pes^H^ZsKii^G3|P9}O~{cO)hvw3eK? z6Sm{xdk!jc_^=YB8+dZM;Npir5w3lbjm=lfCD&=p({CJ}{_ucr&#(CHfx>m^4w?JET#-+3p4lW$J6Yjf)gY4MbJv&A+J=2aFX=_q3BE^7h zX^bUMw#3*T+6Hag$f{FJbx%fTh>{;EgHIfj9sBixohrCf19!?}rvmP}fPLdr zG!k7~$OhcnU{^MxwwN1%-1R>*^cj7hGxP&P=R$Q#SOv&x!?GH=tTk<8XgWjP87gHc zyP2xjpHYTN%~Z;v9zm{^gK1pm(nn_@bEcUxfzDlqEMPcJbh)4@ZK_66wvxQF$p?$$ zWXNYtHjj9-!qzQ9H^`UK6@^%kyAj7Y9e7IMDv8@W$iYQU9@2PN zGQbLaTHzyG=Z_5bB{wGz$u|>qs<0OWK{yeHGeJ1xhu}p9FVy(qL>LVuQOD+_;S0ax z$`xEV2@l2%>tchjufI38|A4@~h`Rhj#IB@8RSHZ q9Bl3 = ({ }) => { useEffect(() => { if (cameraControlsRef.current) { - console.log('render camera settings') - console.log(globeState) const controls = cameraControlsRef.current if (globeState) { diff --git a/air-quality-ui/src/components/globe/SurfaceLayer.tsx b/air-quality-ui/src/components/globe/SurfaceLayer.tsx index 07f8cc36..d3a199bf 100644 --- a/air-quality-ui/src/components/globe/SurfaceLayer.tsx +++ b/air-quality-ui/src/components/globe/SurfaceLayer.tsx @@ -91,7 +91,6 @@ const SurfaceLayer = memo( ? 6 : undefined materialRef.current.uniforms.uVariableIndex.value = variableIndex - console.log(variableIndex) const windowIndexRef = useRef(0) diff --git a/air-quality-ui/src/components/globe/useDataTextures.tsx b/air-quality-ui/src/components/globe/useDataTextures.tsx index de1b4eff..c9c6a860 100644 --- a/air-quality-ui/src/components/globe/useDataTextures.tsx +++ b/air-quality-ui/src/components/globe/useDataTextures.tsx @@ -52,8 +52,8 @@ const createCanvasTexturesFromImages = async ( img.crossOrigin = 'Anonymous' img.onload = onLoadImage img.onerror = (error) => { - console.error(`Failed to load image: ${url}`, error) - reject(new Error(`Failed to load image: ${url}`)) + console.error(`Failed to load data texture: ${url}`, error) + reject(new Error(`Failed to load data texture: ${url}`)) } img.src = url images.push(img)