├── .env.docker ├── client ├── src │ ├── img │ │ └── F1.jpg │ ├── components │ │ ├── Progress.jsx │ │ ├── Modal.jsx │ │ ├── Result.jsx │ │ ├── Race.jsx │ │ └── NavBar.jsx │ ├── css │ │ ├── App.css │ │ ├── Modal.css │ │ ├── Bookmarks.css │ │ ├── NavBar.css │ │ ├── Races.css │ │ ├── index.css │ │ ├── Race.css │ │ └── Progress.css │ ├── main.jsx │ ├── App.jsx │ ├── pages │ │ ├── Bookmarks.jsx │ │ ├── Race.jsx │ │ └── Races.jsx │ ├── context │ │ └── BookmarkContext.jsx │ └── services │ │ ├── notifications.js │ │ └── races.js └── index.html ├── server ├── components │ └── races │ │ ├── index.js │ │ ├── router.js │ │ └── store.js ├── index.js ├── app.js ├── redis.js └── services │ └── wikipedia.js ├── .dockerignore ├── .env.example ├── vite.config.js ├── .gitignore ├── compose.yml ├── package.json ├── Dockerfile ├── README.md ├── assets ├── circuit_images.json └── driver_images.json └── bun.lock /.env.docker: -------------------------------------------------------------------------------- 1 | REDIS_URL="redis://redis:6379" 2 | 3 | -------------------------------------------------------------------------------- /client/src/img/F1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redis-developer/demo-redis-bigquery/main/client/src/img/F1.jpg -------------------------------------------------------------------------------- /server/components/races/index.js: -------------------------------------------------------------------------------- 1 | export * from "./router.js"; 2 | export { initialize } from "./store.js"; 3 | -------------------------------------------------------------------------------- /.dockerignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | .env 3 | .env.* 4 | .gitignore 5 | compose.yml 6 | Dockerfile 7 | README.md 8 | build/ 9 | dist/ 10 | -------------------------------------------------------------------------------- /client/src/components/Progress.jsx: -------------------------------------------------------------------------------- 1 | import "../css/Progress.css"; 2 | 3 | export default function Progress() { 4 | return ; 5 | } 6 | -------------------------------------------------------------------------------- /client/src/css/App.css: -------------------------------------------------------------------------------- 1 | .main-content { 2 | flex: 1; 3 | padding: 2rem; 4 | box-sizing: border-box; 5 | width: 100%; 6 | display: flex; 7 | flex-direction: column; 8 | } 9 | -------------------------------------------------------------------------------- /server/index.js: -------------------------------------------------------------------------------- 1 | import "dotenv/config"; 2 | import app, { initialize } from "./app.js"; 3 | 4 | const port = process.env.PORT ?? 3000; 5 | 6 | app.listen(process.env.PORT ?? 3000, async () => { 7 | console.log(`Server listening on port ${port}`); 8 | 9 | await initialize(); 10 | }); 11 | -------------------------------------------------------------------------------- /client/src/main.jsx: -------------------------------------------------------------------------------- 1 | import { createRoot } from "react-dom/client"; 2 | import { BrowserRouter } from "react-router-dom"; 3 | import "./css/index.css"; 4 | import App from "./App.jsx"; 5 | 6 | createRoot(document.getElementById("root")).render( 7 | 8 | 9 | , 10 | ); 11 | -------------------------------------------------------------------------------- /client/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Redis + BigQuery 7 | 8 | 9 |
10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.env.example: -------------------------------------------------------------------------------- 1 | REDIS_URL="redis://localhost:6379" 2 | # Google Cloud Credentials 3 | GOOGLE_APPLICATION_CREDENTIALS={"account":"","client_id":".apps.googleusercontent.com","client_secret":"","quota_project_id":"","refresh_token":"","type":"authorized_user","universe_domain":"googleapis.com"} 4 | GOOGLE_CLOUD_PROJECT_ID= 5 | -------------------------------------------------------------------------------- /vite.config.js: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "vite"; 2 | import react from "@vitejs/plugin-react-swc"; 3 | 4 | // https://vite.dev/config/ 5 | export default defineConfig({ 6 | plugins: [react()], 7 | root: process.cwd() + "/client", 8 | server: { 9 | proxy: { 10 | "/api": { 11 | target: process.env.BACKEND_URL || "http://localhost:3000", 12 | changeOrigin: true, 13 | secure: false, 14 | }, 15 | }, 16 | }, 17 | }); 18 | -------------------------------------------------------------------------------- /client/src/components/Modal.jsx: -------------------------------------------------------------------------------- 1 | import { useEffect, useRef } from "react"; 2 | import "../css/Modal.css"; 3 | 4 | function Modal({ openModal, closeModal, children }) { 5 | const ref = useRef(); 6 | 7 | useEffect(() => { 8 | if (openModal) { 9 | ref.current?.showModal(); 10 | } else { 11 | ref.current?.close(); 12 | } 13 | }, [openModal]); 14 | 15 | return ( 16 | 17 | {children} 18 | 19 | 20 | ); 21 | } 22 | 23 | export default Modal; 24 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | node_modules 5 | dist 6 | .vscode 7 | 8 | # env files (can opt-in for commiting if needed) 9 | .env* 10 | !.env.example 11 | !.env.docker 12 | 13 | /.pnp 14 | .pnp.* 15 | .yarn/* 16 | !.yarn/patches 17 | !.yarn/plugins 18 | !.yarn/releases 19 | !.yarn/versions 20 | 21 | # testing 22 | /coverage 23 | 24 | # production 25 | /build 26 | 27 | # misc 28 | .DS_Store 29 | *.pem 30 | 31 | # debug 32 | npm-debug.log* 33 | yarn-debug.log* 34 | yarn-error.log* 35 | 36 | -------------------------------------------------------------------------------- /server/app.js: -------------------------------------------------------------------------------- 1 | import path from "path"; 2 | import express from "express"; 3 | import cors from "cors"; 4 | import * as races from "./components/races/index.js"; 5 | 6 | export async function initialize() { 7 | await races.initialize(); 8 | } 9 | 10 | const app = express(); 11 | 12 | app.use(express.static("client/")); 13 | app.use(cors()); 14 | app.use("/api/races", races.router); 15 | 16 | app.get("/*", (_, res) => { 17 | res.sendFile(path.join(__dirname, "../client/", "index.html"), (err) => { 18 | if (err) { 19 | console.log(err); 20 | } 21 | }); 22 | }); 23 | 24 | export default app; 25 | -------------------------------------------------------------------------------- /compose.yml: -------------------------------------------------------------------------------- 1 | name: "demo-redis-biquery" 2 | services: 3 | redis: 4 | container_name: demo-redis-bigquery-redis 5 | image: "redis:8.0-M02" 6 | ports: 7 | - 6379:6379 8 | deploy: 9 | replicas: 1 10 | restart_policy: 11 | condition: on-failure 12 | volumes: 13 | - redis-data:/data 14 | 15 | app: 16 | container_name: demo-redis-bigquery-app 17 | build: 18 | context: ./ 19 | command: bun dev 20 | ports: 21 | - "${PORT-8080}:${PORT-8080}" 22 | environment: 23 | PORT: ${PORT-8080} 24 | env_file: 25 | - ./.env 26 | - ./.env.docker 27 | restart: always 28 | depends_on: 29 | - redis 30 | 31 | volumes: 32 | redis-data: 33 | -------------------------------------------------------------------------------- /client/src/css/Modal.css: -------------------------------------------------------------------------------- 1 | dialog[open] { 2 | position: absolute; 3 | height: 65%; 4 | width: 65%; 5 | margin: auto; 6 | padding: 2rem; 7 | top: 0; 8 | left: 0; 9 | bottom: 0; 10 | right: 0; 11 | color: rgba(255, 255, 255, 0.87); 12 | background-color: #242424; 13 | z-index: 999; 14 | 15 | display: flex; 16 | 17 | > div { 18 | padding: 0rem 2rem; 19 | } 20 | 21 | pre { 22 | padding: 1rem; 23 | } 24 | 25 | button { 26 | position: absolute; 27 | top: 0; 28 | right: 0; 29 | 30 | padding: 0.5rem 1rem; 31 | color: #fff; 32 | border: 1px solid #dcff1e; 33 | border-radius: 2px; 34 | } 35 | 36 | &::backdrop { 37 | background: rgba(0, 0, 0, 0.5); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /client/src/App.jsx: -------------------------------------------------------------------------------- 1 | import "./css/App.css"; 2 | import Races from "./pages/Races.jsx"; 3 | import Bookmarks from "./pages/Bookmarks.jsx"; 4 | import Race from "./pages/Race.jsx"; 5 | import { Routes, Route } from "react-router-dom"; 6 | import { ContextProvider } from "./context/BookmarkContext.jsx"; 7 | import NavBar from "./components/NavBar.jsx"; 8 | 9 | function App() { 10 | return ( 11 | 12 | 13 |
14 | 15 | } /> 16 | } /> 17 | } /> 18 | 19 |
20 |
21 | ); 22 | } 23 | 24 | export default App; 25 | -------------------------------------------------------------------------------- /client/src/pages/Bookmarks.jsx: -------------------------------------------------------------------------------- 1 | import "../css/Bookmarks.css"; 2 | import { useBookmarkContext } from "../context/BookmarkContext"; 3 | import Race from "../components/Race.jsx"; 4 | 5 | function Bookmarks() { 6 | const { bookmarks } = useBookmarkContext(); 7 | 8 | if (bookmarks) { 9 | return ( 10 |
11 |

Your Bookmarks

12 |
13 | {bookmarks.map((race) => ( 14 | 15 | ))} 16 |
17 |
18 | ); 19 | } 20 | 21 | return ( 22 |
23 |

No bookmarks

24 |

Start bookmarking races to list them here.

25 |
26 | ); 27 | } 28 | 29 | export default Bookmarks; 30 | -------------------------------------------------------------------------------- /client/src/components/Result.jsx: -------------------------------------------------------------------------------- 1 | import "../css/Race.css"; 2 | import { Link } from "react-router-dom"; 3 | 4 | function Result({ result }) { 5 | return ( 6 | 7 |
8 |
9 | {`${result.driver_forename} 13 |
14 |
15 |

16 | {result.driver_forename} {result.driver_surname} 17 |

18 |

{result.time}

19 |
20 | Position: {result.position} 21 |
22 | Constructor: {result.constructor_name} 23 |
24 | Laps: {result.laps} 25 |
26 |
27 | 28 | ); 29 | } 30 | 31 | export default Result; 32 | -------------------------------------------------------------------------------- /client/src/css/Bookmarks.css: -------------------------------------------------------------------------------- 1 | .bookmarks { 2 | padding: 2rem; 3 | width: 100%; 4 | box-sizing: border-box; 5 | } 6 | 7 | .bookmarks h2 { 8 | margin-bottom: 2rem; 9 | text-align: center; 10 | font-size: 2.5rem; 11 | color: #ffffff; 12 | text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3); 13 | } 14 | 15 | .bookmarks-empty { 16 | text-align: center; 17 | padding: 4rem 2rem; 18 | background-color: rgba(255, 255, 255, 0.05); 19 | border-radius: 12px; 20 | margin: 2rem auto; 21 | max-width: 600px; 22 | } 23 | 24 | .bookmarks-empty h2 { 25 | margin-bottom: 1rem; 26 | font-size: 2rem; 27 | color: #e50914; 28 | } 29 | 30 | .bookmarks-empty p { 31 | color: #999; 32 | font-size: 1.2rem; 33 | line-height: 1.6; 34 | } 35 | 36 | .bookmark-grid { 37 | display: grid; 38 | grid-template-columns: repeat(auto-fit, minmax(300px, 1rem)); 39 | gap: 1.5rem; 40 | padding: 1rem; 41 | width: 100%; 42 | box-sizing: border-box; 43 | } 44 | -------------------------------------------------------------------------------- /server/redis.js: -------------------------------------------------------------------------------- 1 | import { createClient } from "redis"; 2 | 3 | if (!process.env.REDIS_URL) { 4 | console.error("REDIS_URL not set"); 5 | } 6 | 7 | let client = null; 8 | 9 | /** 10 | * @param {import("redis").RedisClientOptions} [options] 11 | * 12 | * @returns {Promise>} 13 | */ 14 | export async function getClient(options) { 15 | options = Object.assign( 16 | {}, 17 | { 18 | url: process.env.REDIS_URL, 19 | }, 20 | options, 21 | ); 22 | 23 | if (client && client.options?.url === options.url) { 24 | return client; 25 | } 26 | 27 | client = createClient(options); 28 | 29 | client 30 | .on("error", (err) => { 31 | console.error("Redis Client Error", err); 32 | void refreshClient(); 33 | }) 34 | .connect(); 35 | 36 | return client; 37 | } 38 | 39 | async function refreshClient() { 40 | if (client) { 41 | await client.disconnect(); 42 | client = null; 43 | } 44 | 45 | client = await getClient(); 46 | } 47 | -------------------------------------------------------------------------------- /client/src/css/NavBar.css: -------------------------------------------------------------------------------- 1 | .navbar { 2 | background-color: #163341; 3 | padding: 1rem 2rem; 4 | display: flex; 5 | justify-content: space-between; 6 | align-items: center; 7 | box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); 8 | } 9 | 10 | .navbar-brand { 11 | font-size: 1.5rem; 12 | font-weight: bold; 13 | } 14 | 15 | .navbar-links { 16 | display: flex; 17 | gap: 2rem; 18 | } 19 | 20 | .timer { 21 | color: #fff; 22 | } 23 | 24 | .nav-button { 25 | color: #fff; 26 | border: 1px solid #dcff1e; 27 | border-radius: 2px; 28 | } 29 | 30 | .nav-link { 31 | font-size: 1rem; 32 | padding: 0.5rem 1rem; 33 | border-radius: 4px; 34 | transition: background-color 0.2s; 35 | } 36 | 37 | .nav-link:hover { 38 | background-color: rgba(255, 255, 255, 0.1); 39 | } 40 | 41 | @media (max-width: 768px) { 42 | .navbar { 43 | padding: 1rem; 44 | } 45 | 46 | .navbar-brand { 47 | font-size: 1.2rem; 48 | } 49 | 50 | .navbar-links { 51 | gap: 1rem; 52 | } 53 | 54 | .nav-link { 55 | padding: 0.5rem; 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "redis-bigquery", 3 | "private": true, 4 | "version": "0.0.0", 5 | "type": "module", 6 | "engines": { 7 | "node": ">=22" 8 | }, 9 | "scripts": { 10 | "dev": "run-p dev:*", 11 | "dev:client": "bunx --bun vite", 12 | "dev:server": "bun --watch server/index.js", 13 | "format": "prettier . --write", 14 | "start": "bunx --bun vite build && bun server/index.js", 15 | "lint": "eslint .", 16 | "preview": "vite preview" 17 | }, 18 | "dependencies": { 19 | "@google-cloud/bigquery": "^7.9.3", 20 | "cors": "^2.8.5", 21 | "dotenv": "^16.4.7", 22 | "express": "^4.21.2", 23 | "jsdom": "^26.0.0", 24 | "react": "^19.1.0", 25 | "react-dom": "^19.1.0", 26 | "react-router-dom": "^7.4.1", 27 | "react-tates": "^0.2.0", 28 | "redis": "^4.7.0" 29 | }, 30 | "devDependencies": { 31 | "@types/react": "^19.0.12", 32 | "@types/react-dom": "^19.0.4", 33 | "@vitejs/plugin-react-swc": "^3.8.1", 34 | "globals": "^16.0.0", 35 | "npm-run-all": "^4.1.5", 36 | "prettier": "^3.5.3", 37 | "vite": "^6.2.3" 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /server/components/races/router.js: -------------------------------------------------------------------------------- 1 | import express from "express"; 2 | import { byYear, count, delAll, one, populate } from "./store"; 3 | 4 | export const router = express.Router(); 5 | 6 | router.get("/year/:year", async (req, res) => { 7 | const start = performance.now(); 8 | const data = await byYear(req.params.year); 9 | const end = performance.now(); 10 | 11 | res.json({ 12 | ms: end - start, 13 | data, 14 | }); 15 | }); 16 | 17 | router.get("/count", async (_, res) => { 18 | res.json(await count()); 19 | }); 20 | 21 | router.get("/clear", async (_, res) => { 22 | await delAll(); 23 | 24 | res.sendStatus(200); 25 | }); 26 | 27 | router.get("/cache", async (_, res) => { 28 | const start = performance.now(); 29 | await populate(); 30 | const end = performance.now(); 31 | 32 | res.json({ 33 | ms: end - start, 34 | }); 35 | }); 36 | 37 | router.get("/:raceId", async (req, res) => { 38 | const start = performance.now(); 39 | const data = await one(req.params.raceId); 40 | const end = performance.now(); 41 | 42 | res.json({ 43 | ms: end - start, 44 | data, 45 | }); 46 | }); 47 | -------------------------------------------------------------------------------- /client/src/css/Races.css: -------------------------------------------------------------------------------- 1 | .home { 2 | padding: 2rem 0; 3 | width: 100%; 4 | box-sizing: border-box; 5 | } 6 | 7 | .search-form { 8 | max-width: 600px; 9 | margin: 0 auto 2rem; 10 | display: flex; 11 | gap: 1rem; 12 | padding: 0 1rem; 13 | box-sizing: border-box; 14 | } 15 | 16 | .search-input { 17 | flex: 1; 18 | padding: 0.75rem 1rem; 19 | border: none; 20 | border-radius: 4px; 21 | background-color: #333; 22 | color: white; 23 | font-size: 1rem; 24 | } 25 | 26 | .search-btn { 27 | padding: 0.75rem 1.5rem; 28 | background-color: #e50914; 29 | color: white; 30 | border-radius: 4px; 31 | font-weight: 500; 32 | transition: background-color 0.2s; 33 | white-space: nowrap; 34 | } 35 | 36 | .search-btn:hover { 37 | background-color: #f40612; 38 | } 39 | 40 | @media (max-width: 639px) { 41 | .home { 42 | padding: 1rem 0; 43 | } 44 | 45 | .search-form { 46 | margin-bottom: 1rem; 47 | } 48 | } 49 | 50 | .loading { 51 | text-align: center; 52 | } 53 | 54 | .race-grid { 55 | display: grid; 56 | grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); 57 | gap: 1.5rem; 58 | padding: 1rem; 59 | width: 100%; 60 | box-sizing: border-box; 61 | } 62 | 63 | .driver-grid { 64 | display: grid; 65 | grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); 66 | gap: 1.5rem; 67 | padding: 1rem; 68 | width: 100%; 69 | /* height: 100px; */ 70 | box-sizing: border-box; 71 | } 72 | -------------------------------------------------------------------------------- /client/src/pages/Race.jsx: -------------------------------------------------------------------------------- 1 | import Result from "../components/Result.jsx"; 2 | import "../css/Race.css"; 3 | import { useParams } from "react-router-dom"; 4 | import { hooks } from "../services/races.js"; 5 | import { hooks as notifications } from "../services/notifications.js"; 6 | import Progress from "../components/Progress.jsx"; 7 | 8 | function Race() { 9 | const { raceId } = useParams(); 10 | const timerRunning = notifications.useTimerRunning(); 11 | const race = hooks.useRace({ actionArgs: [raceId] }); 12 | 13 | return ( 14 |
15 | {timerRunning ? ( 16 |
17 | 18 |
19 | ) : ( 20 | race && ( 21 |
22 |
23 |

{race.name}

24 |

25 |
26 | 27 | {race.circuit_name} 28 | 29 |
30 | {race.circuit_location}, {race.circuit_country} 31 |
32 | {race.date.value} 33 |

34 |
35 |
36 | {race.results.map((result) => ( 37 | 38 | ))} 39 |
40 |
41 | ) 42 | )} 43 |
44 | ); 45 | } 46 | 47 | export default Race; 48 | -------------------------------------------------------------------------------- /client/src/components/Race.jsx: -------------------------------------------------------------------------------- 1 | import "../css/Race.css"; 2 | import { useBookmarkContext } from "../context/BookmarkContext"; 3 | import { Link } from "react-router-dom"; 4 | 5 | function Race({ race }) { 6 | const { changeRace, isBookmark, addToBookmarks, removeFromBookmarks } = 7 | useBookmarkContext(); 8 | const bookmark = isBookmark(race.race_id); 9 | 10 | function onBookmark(e) { 11 | e.preventDefault(); 12 | if (bookmark) removeFromBookmarks(race.race_id); 13 | else addToBookmarks(race); 14 | } 15 | 16 | function onCardClick() { 17 | changeRace(race.race_id); 18 | } 19 | 20 | return ( 21 | 22 |
23 |
24 | {race.name} 25 |
26 | 32 |
33 |
34 |
35 |

{race.name}

36 |

{race.date.value}

37 |

38 | {race.circuit_location}, {race.circuit_country} 39 |

40 |

41 | 42 | Winner: {race.winner.driver_forename} {race.winner.driver_surname} 43 | 44 |

45 |
46 |
47 | 48 | ); 49 | } 50 | 51 | export default Race; 52 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | # use the official Bun image 2 | # see all versions at https://hub.docker.com/r/oven/bun/tags 3 | FROM oven/bun:1.2-alpine AS base 4 | WORKDIR /usr/src/app 5 | 6 | # install dependencies into temp directory 7 | # this will cache them and speed up future builds 8 | FROM base AS install 9 | RUN mkdir -p /temp/dev 10 | COPY package.json bun.lock /temp/dev/ 11 | RUN cd /temp/dev && bun install --frozen-lockfile 12 | 13 | # install with --production (exclude devDependencies) 14 | RUN mkdir -p /temp/prod 15 | COPY package.json bun.lock /temp/prod/ 16 | RUN cd /temp/prod && bun install --frozen-lockfile --production 17 | 18 | # copy node_modules from temp directory 19 | # then copy all (non-ignored) project files into the image 20 | FROM base AS dev 21 | COPY --from=install /temp/dev/node_modules node_modules 22 | COPY . . 23 | 24 | # copy node_modules from temp directory 25 | # then copy all (non-ignored) project files into the image 26 | FROM base AS prerelease 27 | COPY --from=install /temp/dev/node_modules node_modules 28 | COPY . . 29 | ENV NODE_ENV=production 30 | RUN bunx --bun vite build --emptyOutDir --outDir ../build/client 31 | RUN bun build --target=bun server/index.js --outdir build/server 32 | 33 | # copy production dependencies and source code into final image 34 | FROM base AS release 35 | COPY --from=install /temp/prod/node_modules node_modules 36 | COPY --from=prerelease /usr/src/app/build/server/ server/ 37 | COPY --from=prerelease /usr/src/app/build/client client/ 38 | COPY --from=prerelease /usr/src/app/assets/ assets/ 39 | COPY --from=prerelease /usr/src/app/package.json . 40 | 41 | # run the app 42 | USER bun 43 | ENV PORT 8080 44 | EXPOSE ${PORT} 45 | ENTRYPOINT [ "bun", "server/index.js" ] 46 | -------------------------------------------------------------------------------- /client/src/context/BookmarkContext.jsx: -------------------------------------------------------------------------------- 1 | import { createContext, useState, useContext, useEffect } from "react"; 2 | 3 | const BookmarkContext = createContext(); 4 | 5 | export const useBookmarkContext = () => useContext(BookmarkContext); 6 | 7 | export const ContextProvider = ({ children }) => { 8 | const [bookmarks, setBookmarks] = useState([]); 9 | const [selectedRace, setRace] = useState(""); 10 | 11 | useEffect(() => { 12 | const storedBookmarks = localStorage.getItem("bookmarks"); 13 | if (storedBookmarks) setBookmarks(JSON.parse(storedBookmarks)); 14 | }, []); 15 | 16 | useEffect(() => { 17 | localStorage.setItem("bookmarks", JSON.stringify(bookmarks)); 18 | }, [bookmarks]); 19 | 20 | // Initialize from local storage if available 21 | useEffect(() => { 22 | const storedRace = localStorage.getItem("race"); 23 | if (storedRace) setRace(storedRace); 24 | }, []); 25 | 26 | // Effect to update local storage when the string changes 27 | useEffect(() => { 28 | localStorage.setItem("race", selectedRace); 29 | }, [selectedRace]); 30 | 31 | const addToBookmarks = (race) => { 32 | setBookmarks((prev) => [...prev, race]); 33 | }; 34 | 35 | const removeFromBookmarks = (raceId) => { 36 | setBookmarks((prev) => prev.filter((race) => race.id !== raceId)); 37 | }; 38 | 39 | const isBookmark = (raceId) => { 40 | return bookmarks.some((race) => race.id === raceId); 41 | }; 42 | 43 | // Function to update the string 44 | const changeRace = (raceId) => { 45 | setRace(raceId); 46 | }; 47 | 48 | const value = { 49 | bookmarks, 50 | selectedRace, 51 | addToBookmarks, 52 | removeFromBookmarks, 53 | isBookmark, 54 | changeRace, 55 | }; 56 | 57 | return ( 58 | 59 | {children} 60 | 61 | ); 62 | }; 63 | -------------------------------------------------------------------------------- /client/src/css/index.css: -------------------------------------------------------------------------------- 1 | @import url("https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@400;500;600;700&display=swap"); 2 | 3 | :root { 4 | font-family: 5 | "Space Grotesk", Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; 6 | line-height: 1.5; 7 | font-weight: 400; 8 | 9 | color-scheme: light dark; 10 | color: rgba(255, 255, 255, 0.87); 11 | background-color: #242424; 12 | 13 | font-synthesis: none; 14 | text-rendering: optimizeLegibility; 15 | -webkit-font-smoothing: antialiased; 16 | -moz-osx-font-smoothing: grayscale; 17 | } 18 | 19 | * { 20 | margin: 0; 21 | padding: 0; 22 | box-sizing: border-box; 23 | } 24 | 25 | html, 26 | body { 27 | overflow-x: hidden; 28 | } 29 | 30 | body { 31 | margin: 0; 32 | width: 100%; 33 | min-height: 100vh; 34 | position: relative; 35 | } 36 | 37 | #root { 38 | width: 100%; 39 | min-height: 100vh; 40 | display: flex; 41 | flex-direction: column; 42 | } 43 | 44 | a { 45 | font-weight: 500; 46 | color: #dcff1e; 47 | text-decoration: inherit; 48 | } 49 | a:hover { 50 | color: #f1ffa5; 51 | } 52 | 53 | h1 { 54 | font-size: 3.2em; 55 | line-height: 1.1; 56 | } 57 | 58 | button { 59 | border-radius: 8px; 60 | border: 1px solid transparent; 61 | padding: 0.6em 1.2em; 62 | font-size: 1em; 63 | font-weight: 500; 64 | font-family: inherit; 65 | background-color: #1a1a1a; 66 | cursor: pointer; 67 | transition: border-color 0.25s; 68 | } 69 | button:hover { 70 | border-color: #646cff; 71 | } 72 | button:focus, 73 | button:focus-visible { 74 | outline: 4px auto -webkit-focus-ring-color; 75 | } 76 | 77 | /*@media (prefers-color-scheme: light) {*/ 78 | /* :root {*/ 79 | /* color: #213547;*/ 80 | /* background-color: #ffffff;*/ 81 | /* }*/ 82 | /* a:hover {*/ 83 | /* color: #747bff;*/ 84 | /* }*/ 85 | /* button {*/ 86 | /* background-color: #f9f9f9;*/ 87 | /* }*/ 88 | /*}*/ 89 | -------------------------------------------------------------------------------- /client/src/services/notifications.js: -------------------------------------------------------------------------------- 1 | import * as tates from "tates"; 2 | import { createStateHook } from "react-tates"; 3 | 4 | /** 5 | * @typedef {Object} Notification 6 | * @property {string | string[] | ArrayLike } text 7 | * @property {string} label? 8 | * @property {'warning' | 'danger' | 'success' | 'info'} severity? 9 | * 10 | * @typedef {Object} NotificationState 11 | * @property {Notification | null} notification 12 | * @property {number} loadTime 13 | * @property {boolean} timerRunning 14 | */ 15 | 16 | const tate = /** @type {tates.State} */ tates.createState(); 17 | const { state } = tate; 18 | 19 | export const actions = { 20 | /** 21 | * @param { Notification | null } Notification 22 | */ 23 | notify(notification = null) { 24 | state.notification = notification; 25 | }, 26 | 27 | loadTime(time) { 28 | state.loadTime = time; 29 | }, 30 | 31 | startTimer() { 32 | state.loadTime = 0; 33 | state.timerRunning = true; 34 | }, 35 | 36 | stopTimer() { 37 | state.timerRunning = false; 38 | }, 39 | 40 | /** 41 | * @param {unknown} e 42 | */ 43 | handleError(e) { 44 | console.error(e); 45 | let errorMessage = "Unknown error ocurred"; 46 | if (utils.isErrorLike(e)) { 47 | errorMessage = e.message; 48 | } 49 | 50 | actions.notify({ 51 | text: errorMessage, 52 | severity: "danger", 53 | }); 54 | }, 55 | }; 56 | 57 | /** 58 | * Lets you know when there is a new global notification 59 | */ 60 | export const hooks = { 61 | useNotification: createStateHook({ 62 | tate, 63 | property: "notifcation", 64 | initialValue: /** @type {Notification | null} */ (null), 65 | }), 66 | 67 | useLoadTime: createStateHook({ 68 | tate, 69 | property: "loadTime", 70 | initialValue: 0, 71 | }), 72 | 73 | useTimerRunning: createStateHook({ 74 | tate, 75 | property: "timerRunning", 76 | initialValue: 0, 77 | }), 78 | }; 79 | -------------------------------------------------------------------------------- /client/src/pages/Races.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { useSearchParams } from "react-router-dom"; 3 | import Race from "../components/Race.jsx"; 4 | import { actions, hooks } from "../services/races.js"; 5 | import { hooks as notifications } from "../services/notifications.js"; 6 | import "../css/Races.css"; 7 | import Progress from "../components/Progress.jsx"; 8 | 9 | function queryToNumber(query) { 10 | if (typeof query !== "string" && typeof query !== "number") { 11 | return; 12 | } 13 | 14 | if (typeof query === "string") { 15 | query = query.trim(); 16 | } 17 | 18 | query = Number(query); 19 | 20 | if (!isFinite(query)) { 21 | return; 22 | } 23 | 24 | return query; 25 | } 26 | 27 | function Races() { 28 | const [params, setParams] = useSearchParams({ year: "2024" }); 29 | const queryYear = queryToNumber(params.get("year")); 30 | const timerRunning = notifications.useTimerRunning(); 31 | const races = hooks.useRacesByYear({ 32 | actionArgs: queryYear ? [queryYear] : undefined, 33 | }); 34 | 35 | //Load Race year data on search 36 | async function handleSearch(e) { 37 | e.preventDefault(); 38 | 39 | if (timerRunning) { 40 | return; 41 | } 42 | 43 | const search = e.target.search.value; 44 | const year = queryToNumber(search); 45 | 46 | if (year) { 47 | await actions.byYear(year); 48 | setParams({ year }); 49 | } 50 | } 51 | 52 | return ( 53 |
54 |
55 | 64 | 67 |
68 | 69 | {timerRunning ? ( 70 |
71 | 72 |
73 | ) : ( 74 |
75 | {races.map((race) => ( 76 | 77 | ))} 78 |
79 | )} 80 |
81 | ); 82 | } 83 | 84 | export default Races; 85 | -------------------------------------------------------------------------------- /client/src/components/NavBar.jsx: -------------------------------------------------------------------------------- 1 | import { Link } from "react-router-dom"; 2 | import "../css/NavBar.css"; 3 | import * as racesService from "../services/races.js"; 4 | import * as notificationService from "../services/notifications.js"; 5 | import Progress from "./Progress.jsx"; 6 | import { useState } from "react"; 7 | import Modal from "./Modal.jsx"; 8 | 9 | function NavBar() { 10 | const [modal, setModal] = useState(false); 11 | const count = racesService.hooks.useCount(); 12 | const queries = racesService.hooks.useQueries(); 13 | const loadTime = notificationService.hooks.useLoadTime(); 14 | const timerRunning = notificationService.hooks.useTimerRunning(); 15 | 16 | function handleCacheButtonClick(ev) { 17 | ev.preventDefault(); 18 | 19 | if (count > 0) { 20 | racesService.actions.clear(); 21 | } else { 22 | racesService.actions.cache(); 23 | } 24 | } 25 | 26 | function formatTime(milliseconds) { 27 | const seconds = Math.floor((milliseconds % 60000) / 1000); 28 | const ms = Math.floor(milliseconds % 1000); 29 | 30 | return `${seconds}${String(ms).padStart(3, "0")} ms`; 31 | } 32 | 33 | return ( 34 | 72 | ); 73 | } 74 | 75 | export default NavBar; 76 | -------------------------------------------------------------------------------- /client/src/css/Race.css: -------------------------------------------------------------------------------- 1 | input { 2 | outline: none; 3 | } 4 | 5 | input[type="number"] { 6 | -moz-appearance: textfield; 7 | appearance: textfield; 8 | } 9 | 10 | input:invalid { 11 | border: 1px solid #ff4438; 12 | } 13 | 14 | .race { 15 | position: relative; 16 | border-radius: 8px; 17 | overflow: hidden; 18 | background-color: #1a1a1a; 19 | transition: transform 0.2s; 20 | height: 90%; 21 | display: flex; 22 | flex-direction: column; 23 | } 24 | 25 | .race:hover { 26 | transform: translateY(-5px); 27 | } 28 | 29 | .driver-img, 30 | .race-img { 31 | position: relative; 32 | width: 100%; 33 | height: 70%; 34 | 35 | img { 36 | /* aspect-ratio: 2/3; */ 37 | max-width: 100%; 38 | max-height: 100%; 39 | width: auto; 40 | height: auto; 41 | object-fit: cover; 42 | } 43 | } 44 | 45 | .race-img { 46 | background-color: #163341; 47 | } 48 | 49 | .race-overlay { 50 | position: absolute; 51 | top: 0; 52 | left: 0; 53 | right: 0; 54 | bottom: 0; 55 | background: linear-gradient( 56 | to bottom, 57 | rgba(0, 0, 0, 0.1), 58 | rgba(0, 0, 0, 0.8) 59 | ); 60 | opacity: 0; 61 | transition: opacity 0.2s; 62 | display: flex; 63 | flex-direction: column; 64 | justify-content: flex-end; 65 | padding: 1rem; 66 | } 67 | 68 | .race:hover .race-overlay { 69 | opacity: 1; 70 | } 71 | 72 | .bookmark-btn { 73 | position: absolute; 74 | top: 1rem; 75 | right: 1rem; 76 | color: white; 77 | font-size: 1.5rem; 78 | padding: 0.5rem; 79 | background-color: rgba(0, 0, 0, 0.5); 80 | border-radius: 50%; 81 | width: 40px; 82 | height: 40px; 83 | display: flex; 84 | align-items: center; 85 | justify-content: center; 86 | transition: background-color 0.2s; 87 | } 88 | 89 | .bookmark-btn:hover { 90 | background-color: rgba(0, 0, 0, 0.8); 91 | } 92 | 93 | .bookmark-btn.active { 94 | color: #dcff1e; 95 | } 96 | 97 | .rating-select { 98 | background-color: rgba(0, 0, 0, 0.7); 99 | color: white; 100 | border: none; 101 | padding: 0.5rem; 102 | border-radius: 4px; 103 | cursor: pointer; 104 | margin-top: 0.5rem; 105 | } 106 | 107 | .race-info { 108 | padding: 1rem; 109 | flex: 1; 110 | display: flex; 111 | flex-direction: column; 112 | gap: 0.5rem; 113 | } 114 | 115 | .race-info h3 { 116 | font-size: 1rem; 117 | margin: 0; 118 | } 119 | 120 | .race-info p { 121 | color: #999; 122 | font-size: 0.9rem; 123 | } 124 | 125 | .user-rating { 126 | color: #ffd700; 127 | font-size: 0.9rem; 128 | margin-top: auto; 129 | } 130 | 131 | @media (max-width: 768px) { 132 | .race { 133 | font-size: 0.9rem; 134 | } 135 | 136 | .race-info { 137 | padding: 0.75rem; 138 | } 139 | 140 | .bookmark-btn { 141 | width: 32px; 142 | height: 32px; 143 | font-size: 1.2rem; 144 | } 145 | } 146 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | This demo uses Redis as a frontend cache for BigQuery. It demonstrates how to 2 | apply the cache prefetching strategy and use Redis for JSON storage and search. 3 | The app is written in Express and React with vite. 4 | 5 | ## Requirements 6 | 7 | - [gcloud 8 | credentials](https://cloud.google.com/docs/authentication/set-up-adc-local-dev-environment) 9 | - [BigQuery](https://cloud.google.com/bigquery) setup with the [Formula One](https://www.kaggle.com/datasets/rohanrao/formula-1-world-championship-1950-2020) dataset loaded 10 | - [bun](https://bun.sh/) 11 | - [docker](https://www.docker.com/) 12 | - Optional 13 | 14 | ## Getting started 15 | 16 | Copy and edit the `.env` file: 17 | 18 | ```bash 19 | cp .env.example .env 20 | ``` 21 | 22 | Your `.env` file should contain the connection string you copied from Redis Cloud. It also has the Google Cloud credentials for connecting to BigQuery. 23 | 24 | 1. Copy the JSON from the generated `application_default_credentials.json` into your `.env` file using the `GOOGLE_APPLICATION_CREDENTIALS` variable 25 | 2. Set the `GOOGLE_CLOUD_PROJECT_ID` environment variable in your `.env` file to the associated gcloud project you want to use. 26 | 27 | Your `.env.docker` file will overwrite the REDIS_URL to use the appropriate docker internal URLs. Here is 28 | an example: 29 | 30 | ```bash 31 | REDIS_URL="redis://redis:6379" 32 | ``` 33 | 34 | Next, spin up docker containers: 35 | 36 | ```bash 37 | docker compose up -d --build 38 | ``` 39 | 40 | You should have a server running on `http://localhost:` where the port is set in your `.env` file (default is 8080). 41 | 42 | Visit the localhost url to see your site. 43 | 44 | ## Running locally outside docker 45 | 46 | To run the development server outside of docker: 47 | 48 | ```bash 49 | bun install 50 | # then 51 | bun dev 52 | ``` 53 | 54 | ## Other Scripts 55 | 56 | Formatting code: 57 | 58 | ```bash 59 | bun format 60 | ``` 61 | 62 | ## Connecting to Redis Cloud 63 | 64 | If you don't yet have a database setup in Redis Cloud [get started here for free](https://redis.io/try-free/). 65 | 66 | To connect to a Redis Cloud database, log into the console and find the following: 67 | 68 | 1. The `public endpoint` (looks like `redis-#####.c###.us-east-1-#.ec2.redns.redis-cloud.com:#####`) 69 | 1. Your `username` (`default` is the default username, otherwise find the one you setup) 70 | 1. Your `password` (either setup through Data Access Control, or available in the `Security` section of the database 71 | page. 72 | 73 | Combine the above values into a connection string and put it in your `.env` and `.env.docker` accordingly. It should 74 | look something like the following: 75 | 76 | ```bash 77 | REDIS_URL="redis://default:@redis-#####.c###.us-west-2-#.ec2.redns.redis-cloud.com:#####" 78 | ``` 79 | 80 | ## Learn more 81 | 82 | To learn more about Redis, take a look at the following resources: 83 | 84 | - [Redis Documentation](https://redis.io/docs/latest/) - learn about Redis products, features, and commands. 85 | - [Learn Redis](https://redis.io/learn/) - read tutorials, quick starts, and how-to guides for Redis. 86 | -------------------------------------------------------------------------------- /client/src/css/Progress.css: -------------------------------------------------------------------------------- 1 | .circular-progress { 2 | -webkit-appearance: none; 3 | -moz-appearance: none; 4 | appearance: none; 5 | box-sizing: border-box; 6 | border: none; 7 | border-radius: 50%; 8 | padding: 0.25rem; 9 | width: 2rem; 10 | height: 2rem; 11 | color: #dcff1e; 12 | background-color: transparent; 13 | overflow: hidden; 14 | vertical-align: middle; 15 | } 16 | 17 | .circular-progress::-webkit-progress-bar { 18 | background-color: transparent; 19 | } 20 | 21 | /* Indeterminate */ 22 | .circular-progress:indeterminate { 23 | -webkit-mask-image: 24 | linear-gradient(transparent 50%, black 50%), 25 | linear-gradient(to right, transparent 50%, black 50%); 26 | mask-image: 27 | linear-gradient(transparent 50%, black 50%), 28 | linear-gradient(to right, transparent 50%, black 50%); 29 | animation: circular-progress 6s infinite cubic-bezier(0.3, 0.6, 1, 1); 30 | } 31 | 32 | :-ms-lang(x), 33 | .circular-progress:indeterminate { 34 | animation: none; 35 | } 36 | 37 | .circular-progress:indeterminate::before, 38 | .circular-progress:indeterminate::-webkit-progress-value { 39 | content: ""; 40 | display: block; 41 | box-sizing: border-box; 42 | margin-bottom: 0.25em; 43 | border: solid 0.25em transparent; 44 | border-top-color: currentColor; 45 | border-radius: 50%; 46 | width: 100% !important; 47 | height: 100%; 48 | background-color: transparent; 49 | animation: pure-material-progress-circular-pseudo 0.75s infinite linear 50 | alternate; 51 | } 52 | 53 | .circular-progress:indeterminate::-moz-progress-bar { 54 | box-sizing: border-box; 55 | border: solid 0.25em transparent; 56 | border-top-color: currentColor; 57 | border-radius: 50%; 58 | width: 100%; 59 | height: 100%; 60 | background-color: transparent; 61 | animation: pure-material-progress-circular-pseudo 0.75s infinite linear 62 | alternate; 63 | } 64 | 65 | .circular-progress:indeterminate::-ms-fill { 66 | animation-name: -ms-ring; 67 | } 68 | 69 | @keyframes circular-progress { 70 | 0% { 71 | transform: rotate(0deg); 72 | } 73 | 12.5% { 74 | transform: rotate(180deg); 75 | animation-timing-function: linear; 76 | } 77 | 25% { 78 | transform: rotate(630deg); 79 | } 80 | 37.5% { 81 | transform: rotate(810deg); 82 | animation-timing-function: linear; 83 | } 84 | 50% { 85 | transform: rotate(1260deg); 86 | } 87 | 62.5% { 88 | transform: rotate(1440deg); 89 | animation-timing-function: linear; 90 | } 91 | 75% { 92 | transform: rotate(1890deg); 93 | } 94 | 87.5% { 95 | transform: rotate(2070deg); 96 | animation-timing-function: linear; 97 | } 98 | 100% { 99 | transform: rotate(2520deg); 100 | } 101 | } 102 | 103 | @keyframes pure-material-progress-circular-pseudo { 104 | 0% { 105 | transform: rotate(-30deg); 106 | } 107 | 29.4% { 108 | border-left-color: transparent; 109 | } 110 | 29.41% { 111 | border-left-color: currentColor; 112 | } 113 | 64.7% { 114 | border-bottom-color: transparent; 115 | } 116 | 64.71% { 117 | border-bottom-color: currentColor; 118 | } 119 | 100% { 120 | border-left-color: currentColor; 121 | border-bottom-color: currentColor; 122 | transform: rotate(225deg); 123 | } 124 | } 125 | -------------------------------------------------------------------------------- /server/services/wikipedia.js: -------------------------------------------------------------------------------- 1 | import fs from "fs/promises"; 2 | import path from "path"; 3 | const jsdom = require("jsdom"); 4 | const { JSDOM } = jsdom; 5 | 6 | const circuitsFilePath = path.resolve("assets/circuit_images.json"); 7 | const driversFilePath = path.resolve("assets/driver_images.json"); 8 | const query = 9 | "https://en.wikipedia.org/w/api.php?action=query&prop=pageimages&format=json&piprop=original&titles="; 10 | const titleRegex = /[^\/]*$/g; 11 | 12 | export async function findImageUrl(url, type) { 13 | if (typeof url !== "string") { 14 | return; 15 | } 16 | 17 | try { 18 | let existingImage; 19 | 20 | if (type === "circuit") { 21 | existingImage = await findCircuitImageFromFile(url); 22 | } else if (type === "driver") { 23 | existingImage = await findDriverImageFromFile(url); 24 | } 25 | 26 | if (typeof existingImage === "string") { 27 | return existingImage; 28 | } 29 | 30 | const urlResponse = await fetch(url, { 31 | method: "GET", 32 | }); 33 | 34 | if (!urlResponse.ok) { 35 | return; 36 | } 37 | 38 | const dom = new JSDOM(await urlResponse.text()); 39 | const h1 = dom.window.document.querySelector("h1")?.textContent; 40 | const responseUrl = urlResponse.url ?? url; 41 | const [title] = h1 ? [h1] : (responseUrl.match(titleRegex) ?? []); 42 | 43 | if (!title) { 44 | return; 45 | } 46 | const result = await fetch(`${query}${title}`); 47 | 48 | if (!result.ok) { 49 | return; 50 | } 51 | 52 | const data = await result.json(); 53 | const pages = data.query.pages; 54 | 55 | for (let article of Object.values(pages)) { 56 | if (typeof article.original?.source === "string") { 57 | if (type === "circuit") { 58 | await saveCircuitImage(url, article.original.source); 59 | } else if (type === "driver") { 60 | await saveDriverImage(url, article.original.source); 61 | } 62 | return article.original.source; 63 | } else { 64 | if (type === "circuit") { 65 | await saveCircuitImage(url, ""); 66 | } else if (type === "driver") { 67 | await saveDriverImage(url, ""); 68 | } 69 | 70 | console.log(`No image found for: ${url}`); 71 | } 72 | } 73 | } catch (e) { 74 | console.log(`Error getting image for: ${url}`); 75 | console.log(e); 76 | } 77 | } 78 | 79 | /** 80 | * Reads or creates the file and returns the data 81 | */ 82 | async function readFile(filePath) { 83 | try { 84 | await fs.access(filePath); 85 | } catch (e) { 86 | await fs.writeFile(filePath, "{}"); 87 | } 88 | 89 | const file = await fs.readFile(filePath); 90 | 91 | return JSON.parse(file); 92 | } 93 | 94 | /** 95 | * Finds images in the circuits file for a given url 96 | * 97 | * @param {string} url 98 | * @returns {Promise} 99 | */ 100 | async function findCircuitImageFromFile(url) { 101 | const data = await readFile(circuitsFilePath); 102 | 103 | return data[url]; 104 | } 105 | 106 | /** 107 | * Saves circuit images to a file 108 | * @param {string} url The circuit wikipedia url 109 | * @param {string} imageUrl The circuit image url 110 | */ 111 | async function saveCircuitImage(url, imageUrl) { 112 | const data = await readFile(circuitsFilePath); 113 | data[url] = imageUrl; 114 | 115 | await fs.writeFile(circuitsFilePath, JSON.stringify(data, null, 2)); 116 | } 117 | 118 | /** Finds images in the drivers file for a given url 119 | * 120 | * @param {string} url 121 | * @returns {Promise} 122 | */ 123 | async function findDriverImageFromFile(url) { 124 | const data = await readFile(driversFilePath); 125 | 126 | return data[url]; 127 | } 128 | 129 | /** 130 | * Saves drivers images to a file 131 | * @param {string} url The driver wikipedia url 132 | * @param {string} imageUrl The driver image url 133 | */ 134 | async function saveDriverImage(url, imageUrl) { 135 | const data = await readFile(driversFilePath); 136 | data[url] = imageUrl; 137 | 138 | await fs.writeFile(driversFilePath, JSON.stringify(data, null, 2)); 139 | } 140 | -------------------------------------------------------------------------------- /server/components/races/store.js: -------------------------------------------------------------------------------- 1 | import { BigQuery } from "@google-cloud/bigquery"; 2 | import { getClient } from "../../redis"; 3 | import { SchemaFieldTypes } from "redis"; 4 | import { findImageUrl } from "../../services/wikipedia"; 5 | 6 | /** 7 | * @typedef {Object} RaceResult 8 | * @property {number} result_id 9 | * @property {number} race_id 10 | * @property {number} driver_id 11 | * @property {number} constructor_id 12 | * @property {number} position 13 | * @property {string} time 14 | * @property {number} laps 15 | * @property {string} driver_forename 16 | * @property {string} driver_surname 17 | * @property {string} driver_url 18 | * @property {string} constructor_name 19 | * 20 | * @typedef {Object} Race 21 | * @property {number} race_id 22 | * @property {number} year 23 | * @property {number} round 24 | * @property {number} circuit_id 25 | * @property {string} name 26 | * @property {string} date 27 | * @property {string} time 28 | * @property {string} url 29 | * @property {string} circuit_name 30 | * @property {string} circuit_location 31 | * @property {string} circuit_country 32 | * @property {string} circuit_url 33 | * @property {string} circuit_image 34 | * @property {RaceResult[]} results 35 | * @property {RaceResult} winner 36 | * 37 | * @typedef {Object} RaceDocument 38 | * @property {string} id 39 | * @property {Race} value 40 | * 41 | * @typedef {Object} Races 42 | * @property {number} total 43 | * @property {RaceDocument} documents 44 | */ 45 | 46 | const bq = new BigQuery({ 47 | credentials: JSON.parse(process.env.GOOGLE_APPLICATION_CREDENTIALS), 48 | projectId: process.env.GOOGLE_CLOUD_PROJECT_ID, 49 | }); 50 | const RACES_INDEX = "races-idx"; 51 | const RACES_PREFIX = "races:"; 52 | const QUERIES = { 53 | RACES: `SELECT 54 | r.raceId AS race_id, 55 | r.year AS year, 56 | r.round AS round, 57 | r.circuitId AS circuit_id, 58 | r.name AS name, 59 | r.date AS date, 60 | r.time AS time, 61 | r.url AS url, 62 | c.name AS circuit_name, 63 | c.location AS circuit_location, 64 | c.country AS circuit_country, 65 | c.url AS circuit_url, 66 | FROM 67 | f1.races r 68 | JOIN 69 | f1.circuits c 70 | ON c.circuitId = r.circuitId 71 | ORDER BY r.date desc`, 72 | RESULTS: `SELECT 73 | re.resultId AS result_id, 74 | re.raceId AS race_id, 75 | re.driverId AS driver_id, 76 | re.constructorId AS constructor_id, 77 | re.position AS position, 78 | re.time AS time, 79 | re.laps AS laps, 80 | d.forename AS driver_forename, 81 | d.surname AS driver_surname, 82 | d.url AS driver_url, 83 | c.name AS constructor_name 84 | FROM 85 | f1.results re 86 | JOIN 87 | f1.drivers d 88 | ON 89 | d.driverId = re.driverId 90 | JOIN 91 | f1.constructors c 92 | ON 93 | c.constructorId = re.constructorId 94 | WHERE 95 | re.position IS NOT NULL 96 | ORDER BY re.raceId ASC, re.position ASC`, 97 | }; 98 | 99 | async function haveIndex() { 100 | const redis = await getClient(); 101 | const indexes = await redis.ft._list(); 102 | 103 | return indexes.some((index) => { 104 | return index === RACES_INDEX; 105 | }); 106 | } 107 | 108 | export async function createdIndexIfNotExists() { 109 | const redis = await getClient(); 110 | 111 | if (!(await haveIndex())) { 112 | await redis.ft.create( 113 | RACES_INDEX, 114 | { 115 | "$.race_id": { 116 | AS: "race_id", 117 | type: SchemaFieldTypes.NUMERIC, 118 | }, 119 | "$.year": { 120 | AS: "year", 121 | type: SchemaFieldTypes.NUMERIC, 122 | }, 123 | }, 124 | { 125 | ON: "JSON", 126 | PREFIX: RACES_PREFIX, 127 | }, 128 | ); 129 | } 130 | } 131 | 132 | export async function dropIndex() { 133 | const redis = await getClient(); 134 | 135 | if (await haveIndex()) { 136 | await redis.ft.dropIndex(RACES_INDEX); 137 | } 138 | } 139 | 140 | export async function initialize() { 141 | await createdIndexIfNotExists(); 142 | } 143 | 144 | export async function getRaceKeys() { 145 | const redis = await getClient(); 146 | 147 | return redis.keys(`${RACES_PREFIX}*`); 148 | } 149 | 150 | export async function delAll() { 151 | const redis = await getClient(); 152 | 153 | const keys = await getRaceKeys(); 154 | 155 | if (keys.length > 0) { 156 | await redis.del(keys); 157 | } 158 | } 159 | 160 | export async function count() { 161 | const keys = await getRaceKeys(); 162 | 163 | return keys.length; 164 | } 165 | 166 | export async function populate() { 167 | await delAll(); 168 | const redis = await getClient(); 169 | const [races] = /** @type [Race[]] */ (await bq.query(QUERIES.RACES)); 170 | const [results] = /** @type [RaceResult[]] */ ( 171 | await bq.query(QUERIES.RESULTS) 172 | ); 173 | const circuitsUrls = {}; 174 | 175 | for (let race of races) { 176 | let imageUrls = circuitsUrls[race.circuit_url]; 177 | 178 | if (!Array.isArray(imageUrls)) { 179 | imageUrls = circuitsUrls[race.circuit_url] = []; 180 | } 181 | 182 | imageUrls.push(race); 183 | 184 | race.results = results.filter((result) => result.race_id === race.race_id); 185 | race.winner = race.results.find((result) => result.position === 1); 186 | } 187 | 188 | for (let result of results) { 189 | let image = await findImageUrl(result.driver_url, "driver"); 190 | result.driver_image = image ?? ""; 191 | } 192 | 193 | for (let circuitUrl of Object.keys(circuitsUrls)) { 194 | let image = await findImageUrl(circuitUrl, "circuit"); 195 | for (let race of circuitsUrls[circuitUrl]) { 196 | race.circuit_image = image ?? ""; 197 | } 198 | } 199 | 200 | await redis.json.mSet( 201 | races.map((race) => { 202 | return { 203 | key: `${RACES_PREFIX}${race.race_id}`, 204 | path: "$", 205 | value: race, 206 | }; 207 | }), 208 | ); 209 | } 210 | 211 | export async function byYear(year) { 212 | const total = await count(); 213 | 214 | if (total <= 0) { 215 | await populate(); 216 | } 217 | 218 | const redis = await getClient(); 219 | 220 | return /** @type {Promise} */ redis.ft.search( 221 | RACES_INDEX, 222 | `@year==${year}`, 223 | { 224 | DIALECT: 2, 225 | LIMIT: { from: 0, size: 9999 }, 226 | }, 227 | ); 228 | } 229 | 230 | export async function one(raceId) { 231 | const total = await count(); 232 | 233 | if (total <= 0) { 234 | await populate(); 235 | } 236 | 237 | const redis = await getClient(); 238 | 239 | return /** @type Promise */ ( 240 | redis.json.get(`${RACES_PREFIX}${raceId}`) 241 | ); 242 | } 243 | -------------------------------------------------------------------------------- /client/src/services/races.js: -------------------------------------------------------------------------------- 1 | import * as tates from "tates"; 2 | 3 | import { actions as notifications } from "./notifications"; 4 | import { createStateHook } from "react-tates"; 5 | 6 | /** 7 | * @typedef {Object} RaceResult 8 | * @property {number} result_id 9 | * @property {number} race_id 10 | * @property {number} driver_id 11 | * @property {number} constructor_id 12 | * @property {number} position 13 | * @property {string} time 14 | * @property {number} laps 15 | * @property {string} driver_forename 16 | * @property {string} driver_surname 17 | * @property {string} driver_url 18 | * @property {string} constructor_name 19 | * 20 | * @typedef {Object} Race 21 | * @property {number} race_id 22 | * @property {number} year 23 | * @property {number} round 24 | * @property {number} circuit_id 25 | * @property {string} name 26 | * @property {{ value: string }} date 27 | * @property {string} time 28 | * @property {string} url 29 | * @property {string} circuit_name 30 | * @property {string} circuit_location 31 | * @property {string} circuit_country 32 | * @property {string} circuit_url 33 | * @property {string} circuit_image 34 | * @property {RaceResult[]} results 35 | * @property {RaceResult} winner 36 | * 37 | * @typedef {Object} RaceDocument 38 | * @property {string} id 39 | * @property {Race} value 40 | * 41 | * @typedef {Object} Races 42 | * @property {number} total 43 | * @property {RaceDocument} documents 44 | * 45 | * @typedef {Object} RacesState 46 | * @property {Race[]} races 47 | * @property {number} year 48 | * @property {number} raceId 49 | * @property {Race} race 50 | * @property {{ sql: string; redis: string; }} queries 51 | * @property {number} count 52 | * 53 | * @typedef {Object} RacesResponse 54 | * @property {number} ms 55 | * @property {Races} data 56 | * 57 | * @typedef {Object} RaceResponse 58 | * @property {number} ms 59 | * @property {Race} data 60 | * 61 | * @typedef {Object} CacheResponse 62 | * @property {number} ms 63 | */ 64 | 65 | const tate = /** @type {tates.State} */ (tates.createState()); 66 | const { state } = tate; 67 | const racesSql = `SELECT Row_number() OVER(ORDER BY races.date DESC) AS id, 68 | races.race_id, 69 | races.year, 70 | Format_date('%b-%d-%Y', races.date) AS date, 71 | races.name, 72 | circuits.location AS circuit_location, 73 | circuits.country AS circuit_country, 74 | drivers.forename AS winner_forename, 75 | drivers.surname AS winner_surname, 76 | FROM f1.drivers AS drivers 77 | JOIN f1.results AS results 78 | ON drivers.driverid = results.driverid 79 | JOIN f1.races AS races 80 | ON races.raceid = results.raceid 81 | JOIN f1.circuits AS circuits 82 | ON races.circuitid = circuits.circuitid 83 | WHERE results.position = 1 84 | AND races.year = $year;`; 85 | const racesRedis = `FT.SEARCH races-idx "@year==$year" DIALECT 2`; 86 | const raceSql = `SELECT Row_number() OVER(ORDER BY results.position ASC) AS id, 87 | results.position, 88 | Format_date('%b-%d-%Y', races.date) AS date, 89 | races.name AS name, 90 | circuits.name AS circuit_name, 91 | circuits.location AS circuit_location, 92 | circuits.country AS circuit_country, 93 | drivers.forename AS driver_forename, 94 | drivers.surname AS driver_surname, 95 | results.laps, 96 | results.time, 97 | constructors.name AS constructor, 98 | drivers.url AS driver_url, 99 | circuits.url AS circuit_url 100 | FROM f1.results AS results 101 | JOIN f1.races AS races 102 | ON results.raceid = races.raceid 103 | JOIN f1.drivers AS drivers 104 | ON results.driverid = drivers.driverid 105 | JOIN f1.circuits AS circuits 106 | ON races.circuitid = circuits.circuitid 107 | JOIN f1.constructors AS constructors 108 | ON results.constructorid = constructors.constructorid 109 | WHERE races.raceid = $raceid 110 | AND results.position IS NOT NULL`; 111 | const raceRedis = `JSON.GET races:$raceId`; 112 | 113 | export const actions = { 114 | /** 115 | * @param {number} year 116 | */ 117 | async byYear(year = 2024) { 118 | notifications.startTimer(); 119 | 120 | const response = await fetch(`/api/races/year/${year}`); 121 | const racesResults = /** @type RacesResponse */ (await response.json()); 122 | 123 | notifications.stopTimer(); 124 | notifications.loadTime(racesResults.ms); 125 | 126 | state.year = year; 127 | state.queries = { 128 | sql: racesSql.replace("$year", year), 129 | redis: racesRedis.replace("$year", year), 130 | }; 131 | state.races = racesResults.data.documents.map((doc) => doc.value); 132 | actions.count(); 133 | }, 134 | 135 | /** 136 | * @param {number} raceId 137 | */ 138 | async one(raceId) { 139 | if (!raceId) { 140 | return; 141 | } 142 | 143 | notifications.startTimer(); 144 | 145 | const response = await fetch(`/api/races/${raceId}`); 146 | const raceResponse = /** @type RaceResponse */ (await response.json()); 147 | 148 | notifications.stopTimer(); 149 | notifications.loadTime(raceResponse.ms); 150 | 151 | state.raceId = raceId; 152 | state.queries = { 153 | sql: raceSql.replace("$raceId", raceId), 154 | redis: raceRedis.replace("$raceId", raceId), 155 | }; 156 | state.race = raceResponse.data; 157 | actions.count(); 158 | }, 159 | 160 | async count() { 161 | const response = await fetch(`/api/races/count`); 162 | const total = /** @type number */ (await response.json()); 163 | 164 | state.count = total; 165 | }, 166 | 167 | async clear() { 168 | await fetch(`/api/races/clear`); 169 | 170 | state.count = 0; 171 | state.races = []; 172 | state.race = null; 173 | }, 174 | 175 | async cache() { 176 | notifications.startTimer(); 177 | 178 | const response = await fetch(`/api/races/cache`); 179 | const { ms } = /** @type CacheResponse */ (await response.json()); 180 | 181 | notifications.stopTimer(); 182 | 183 | await actions.byYear(state.year); 184 | await actions.one(state.raceId); 185 | await actions.count(); 186 | 187 | setTimeout(() => { 188 | notifications.loadTime(ms); 189 | }, 200); 190 | }, 191 | }; 192 | 193 | export const hooks = { 194 | useRacesByYear: createStateHook({ 195 | tate, 196 | action: actions.byYear, 197 | property: "races", 198 | initialValue: /** @type {Race[]} */ ([]), 199 | }), 200 | 201 | useRace: createStateHook({ 202 | tate, 203 | action: actions.one, 204 | property: "race", 205 | initialValue: /** @type {Race | null} */ (null), 206 | }), 207 | 208 | useCount: createStateHook({ 209 | tate, 210 | action: actions.count, 211 | property: "count", 212 | initialValue: 0, 213 | }), 214 | 215 | useQueries: createStateHook({ 216 | tate, 217 | action: actions.count, 218 | property: "queries", 219 | initialValue: { sql: "", redis: "" }, 220 | }), 221 | }; 222 | -------------------------------------------------------------------------------- /assets/circuit_images.json: -------------------------------------------------------------------------------- 1 | { 2 | "http://en.wikipedia.org/wiki/Yas_Marina_Circuit": "https://upload.wikimedia.org/wikipedia/commons/b/b0/Yas_Marina_Circuit.png", 3 | "http://en.wikipedia.org/wiki/Losail_International_Circuit": "https://upload.wikimedia.org/wikipedia/commons/c/c7/Lusail_International_Circuit_2023.svg", 4 | "https://en.wikipedia.org/wiki/Las_Vegas_Grand_Prix#Circuit": "https://upload.wikimedia.org/wikipedia/commons/4/43/2023_Las_Vegas_street_circuit.svg", 5 | "http://en.wikipedia.org/wiki/Aut%C3%B3dromo_Jos%C3%A9_Carlos_Pace": "https://upload.wikimedia.org/wikipedia/commons/c/cf/Aut%C3%B3dromo_Jos%C3%A9_Carlos_Pace_%28AKA_Interlagos%29_track_map.svg", 6 | "http://en.wikipedia.org/wiki/Aut%C3%B3dromo_Hermanos_Rodr%C3%ADguez": "https://upload.wikimedia.org/wikipedia/commons/3/36/Aut%C3%B3dromo_Hermanos_Rodr%C3%ADguez_2015.svg", 7 | "http://en.wikipedia.org/wiki/Circuit_of_the_Americas": "https://upload.wikimedia.org/wikipedia/commons/a/a5/Austin_circuit.svg", 8 | "http://en.wikipedia.org/wiki/Marina_Bay_Street_Circuit": "https://upload.wikimedia.org/wikipedia/commons/8/8b/Marina_Bay_circuit_2023.svg", 9 | "http://en.wikipedia.org/wiki/Baku_City_Circuit": "https://upload.wikimedia.org/wikipedia/commons/f/f1/Baku_Formula_One_circuit_map.svg", 10 | "http://en.wikipedia.org/wiki/Autodromo_Nazionale_Monza": "https://upload.wikimedia.org/wikipedia/commons/f/f8/Monza_track_map.svg", 11 | "http://en.wikipedia.org/wiki/Circuit_Zandvoort": "https://upload.wikimedia.org/wikipedia/commons/7/78/Zandvoort_Circuit.png", 12 | "http://en.wikipedia.org/wiki/Circuit_de_Spa-Francorchamps": "https://upload.wikimedia.org/wikipedia/commons/5/54/Spa-Francorchamps_of_Belgium.svg", 13 | "http://en.wikipedia.org/wiki/Hungaroring": "https://upload.wikimedia.org/wikipedia/commons/9/91/Hungaroring.svg", 14 | "http://en.wikipedia.org/wiki/Silverstone_Circuit": "https://upload.wikimedia.org/wikipedia/commons/b/bd/Silverstone_Circuit_2020.png", 15 | "http://en.wikipedia.org/wiki/Red_Bull_Ring": "https://upload.wikimedia.org/wikipedia/commons/4/4e/Spielberg_bare_map_numbers_contextless_2021_corner_names.svg", 16 | "http://en.wikipedia.org/wiki/Circuit_de_Barcelona-Catalunya": "https://upload.wikimedia.org/wikipedia/commons/8/87/Circuit_de_Catalunya_moto_2021.svg", 17 | "http://en.wikipedia.org/wiki/Circuit_Gilles_Villeneuve": "https://upload.wikimedia.org/wikipedia/commons/f/f9/%C3%8Ele_Notre-Dame_%28Circuit_Gilles_Villeneuve%29.svg", 18 | "http://en.wikipedia.org/wiki/Circuit_de_Monaco": "https://upload.wikimedia.org/wikipedia/commons/3/36/Monte_Carlo_Formula_1_track_map.svg", 19 | "http://en.wikipedia.org/wiki/Autodromo_Enzo_e_Dino_Ferrari": "https://upload.wikimedia.org/wikipedia/commons/2/22/Imola_2009.svg", 20 | "http://en.wikipedia.org/wiki/Miami_International_Autodrome": "https://upload.wikimedia.org/wikipedia/commons/4/49/Hard_Rock_Stadium_Circuit_2022.svg", 21 | "http://en.wikipedia.org/wiki/Shanghai_International_Circuit": "https://upload.wikimedia.org/wikipedia/commons/1/14/Shanghai_International_Racing_Circuit_track_map.svg", 22 | "http://en.wikipedia.org/wiki/Suzuka_Circuit": "https://upload.wikimedia.org/wikipedia/commons/e/ec/Suzuka_circuit_map--2005.svg", 23 | "http://en.wikipedia.org/wiki/Melbourne_Grand_Prix_Circuit": "https://upload.wikimedia.org/wikipedia/commons/0/0a/Albert_Park_Circuit_2021.svg", 24 | "http://en.wikipedia.org/wiki/Jeddah_Street_Circuit": "https://upload.wikimedia.org/wikipedia/commons/4/4c/Jeddah_Street_Circuit_2021.svg", 25 | "http://en.wikipedia.org/wiki/Bahrain_International_Circuit": "https://upload.wikimedia.org/wikipedia/commons/2/29/Bahrain_International_Circuit--Grand_Prix_Layout.svg", 26 | "http://en.wikipedia.org/wiki/Paul_Ricard_Circuit": "https://upload.wikimedia.org/wikipedia/commons/3/3c/Le_Castellet_2019_all_layouts.svg", 27 | "http://en.wikipedia.org/wiki/Istanbul_Park": "https://upload.wikimedia.org/wikipedia/commons/5/5d/Istanbul_park.svg", 28 | "http://en.wikipedia.org/wiki/Sochi_Autodrom": "https://upload.wikimedia.org/wikipedia/commons/d/d3/Circuit_Sochi.svg", 29 | "http://en.wikipedia.org/wiki/Algarve_International_Circuit": "https://upload.wikimedia.org/wikipedia/commons/0/0a/Aut%C3%B3dromo_do_Algarve_F1_Sectors.svg", 30 | "http://en.wikipedia.org/wiki/N%C3%BCrburgring": "https://upload.wikimedia.org/wikipedia/commons/8/8d/Nurburgringcircuits.jpg", 31 | "http://en.wikipedia.org/wiki/Mugello_Circuit": "https://upload.wikimedia.org/wikipedia/commons/3/38/Mugello_Racing_Circuit_track_map_15_turns.svg", 32 | "http://en.wikipedia.org/wiki/Hockenheimring": "https://upload.wikimedia.org/wikipedia/commons/e/e5/Hockenheim2012.svg", 33 | "http://en.wikipedia.org/wiki/Sepang_International_Circuit": "https://upload.wikimedia.org/wikipedia/commons/6/67/Sepang.svg", 34 | "http://en.wikipedia.org/wiki/Buddh_International_Circuit": "https://upload.wikimedia.org/wikipedia/commons/4/44/Buddh_International_Circuit.svg", 35 | "http://en.wikipedia.org/wiki/Korean_International_Circuit": "https://upload.wikimedia.org/wikipedia/commons/2/29/Korea_international_circuit_v3.svg", 36 | "http://en.wikipedia.org/wiki/Valencia_Street_Circuit": "https://upload.wikimedia.org/wikipedia/commons/f/fd/Circuit_Valencia_street.svg", 37 | "http://en.wikipedia.org/wiki/Fuji_Speedway": "https://upload.wikimedia.org/wikipedia/commons/2/2c/Fuji.svg", 38 | "http://en.wikipedia.org/wiki/Circuit_de_Nevers_Magny-Cours": "https://upload.wikimedia.org/wikipedia/commons/8/87/Circuit_de_Nevers_Magny-Cours.svg", 39 | "http://en.wikipedia.org/wiki/Indianapolis_Motor_Speedway": "https://upload.wikimedia.org/wikipedia/commons/2/29/Indianapolis-motor-speedway-1848561.jpg", 40 | "http://en.wikipedia.org/wiki/Aut%C3%B3dromo_Oscar_Alfredo_G%C3%A1lvez": "https://upload.wikimedia.org/wikipedia/commons/c/c6/Aut%C3%B3dromo_Oscar_y_Juan_G%C3%A1lvez_Circuito_N%C2%B0_6_por_Senna.svg", 41 | "http://en.wikipedia.org/wiki/Circuito_Permanente_de_Jerez": "https://upload.wikimedia.org/wikipedia/commons/a/aa/Circuito_de_Jerez_v2.svg", 42 | "http://en.wikipedia.org/wiki/Aut%C3%B3dromo_do_Estoril": "https://upload.wikimedia.org/wikipedia/commons/3/39/Estoril_track_map.svg", 43 | "http://en.wikipedia.org/wiki/Adelaide_Street_Circuit": "https://upload.wikimedia.org/wikipedia/commons/a/aa/Adelaide_%28short_route%29.svg", 44 | "http://en.wikipedia.org/wiki/TI_Circuit": "https://upload.wikimedia.org/wikipedia/commons/b/b4/Circuit_TI_%28Aida%29.png", 45 | "http://en.wikipedia.org/wiki/Donington_Park": "https://upload.wikimedia.org/wikipedia/commons/0/07/Donington_circuit.svg", 46 | "http://en.wikipedia.org/wiki/Kyalami": "https://upload.wikimedia.org/wikipedia/commons/9/92/Kyalami_16.png", 47 | "http://en.wikipedia.org/wiki/Phoenix_street_circuit": "https://upload.wikimedia.org/wikipedia/commons/5/53/Phoenix_Grand_Prix_Route_-_1989%2C_1990.svg", 48 | "http://en.wikipedia.org/wiki/Aut%C3%B3dromo_Internacional_Nelson_Piquet": "https://upload.wikimedia.org/wikipedia/commons/f/f6/Jacarepagu%C3%A1-short_circuit.png", 49 | "http://en.wikipedia.org/wiki/Detroit_street_circuit": "https://upload.wikimedia.org/wikipedia/commons/d/df/TrackMap_Detroit-2023.png", 50 | "http://en.wikipedia.org/wiki/Brands_Hatch": "https://upload.wikimedia.org/wikipedia/commons/c/c5/Logo_Brands_Hatch_Circuit.svg", 51 | "http://en.wikipedia.org/wiki/Fair_Park": "https://upload.wikimedia.org/wikipedia/commons/a/a5/Dallas_Fair_Park_Esplanade.jpg", 52 | "http://en.wikipedia.org/wiki/Dijon-Prenois": "https://upload.wikimedia.org/wikipedia/commons/d/de/Dijon-Prenois_Circuit.svg", 53 | "http://en.wikipedia.org/wiki/Zolder": "https://upload.wikimedia.org/wikipedia/commons/e/e2/Zolder.svg", 54 | "http://en.wikipedia.org/wiki/Long_Beach,_California": "https://upload.wikimedia.org/wikipedia/commons/c/c8/Long_beach3_%28cropped%29.jpg", 55 | "http://en.wikipedia.org/wiki/Las_Vegas_Street_Circuit": "https://upload.wikimedia.org/wikipedia/commons/4/43/2023_Las_Vegas_street_circuit.svg", 56 | "http://en.wikipedia.org/wiki/Circuito_Permanente_Del_Jarama": "https://upload.wikimedia.org/wikipedia/commons/5/5c/Circuito_Permanente_del_Jarama.svg", 57 | "http://en.wikipedia.org/wiki/Watkins_Glen_International": "https://upload.wikimedia.org/wikipedia/commons/6/6a/Watkins_Glen_International_Long_Circuit_2024.svg", 58 | "http://en.wikipedia.org/wiki/Scandinavian_Raceway": "https://upload.wikimedia.org/wikipedia/commons/4/4c/Scandinavian_Raceway.svg", 59 | "http://en.wikipedia.org/wiki/Mosport": "https://upload.wikimedia.org/wikipedia/commons/5/51/Mosport-CTMP.svg", 60 | "http://en.wikipedia.org/wiki/Montju%C3%AFc_circuit": "https://upload.wikimedia.org/wikipedia/commons/b/b7/Montju%C3%AFc_circuit.svg", 61 | "http://en.wikipedia.org/wiki/Nivelles-Baulers": "https://upload.wikimedia.org/wikipedia/commons/0/0f/Circuit_Nivelles-Baulers.png", 62 | "http://en.wikipedia.org/wiki/Charade_Circuit": "https://upload.wikimedia.org/wikipedia/commons/c/ce/Circuit_Charade_1958_1988.png", 63 | "http://en.wikipedia.org/wiki/Circuit_Mont-Tremblant": "https://upload.wikimedia.org/wikipedia/commons/8/8d/Circuit_Mont-Tremblant_Track_Map.svg", 64 | "http://en.wikipedia.org/wiki/Rouen-Les-Essarts": "https://upload.wikimedia.org/wikipedia/commons/8/82/Rouen-Les-Essarts.svg", 65 | "http://en.wikipedia.org/wiki/Circuit_de_la_Sarthe#Bugatti_Circuit": "https://upload.wikimedia.org/wikipedia/commons/3/35/Circuit_de_la_Sarthe_v2.png", 66 | "http://en.wikipedia.org/wiki/Reims-Gueux": "https://upload.wikimedia.org/wikipedia/commons/f/fa/Circuit-Reims-1954.png", 67 | "http://en.wikipedia.org/wiki/Prince_George_Circuit": "https://upload.wikimedia.org/wikipedia/commons/2/2d/Prince_George_Circuit.svg", 68 | "http://en.wikipedia.org/wiki/Zeltweg_Airfield": "https://upload.wikimedia.org/wikipedia/commons/4/4f/Zeltweg_Airfield_Fliegerhorst_Hinterstoisser_04.jpg", 69 | "http://en.wikipedia.org/wiki/Aintree_Motor_Racing_Circuit": "https://upload.wikimedia.org/wikipedia/commons/3/35/Circuit_Aintree.svg", 70 | "http://en.wikipedia.org/wiki/Riverside_International_Raceway": "https://upload.wikimedia.org/wikipedia/commons/5/50/Riverside_International_Raceway_1980_and_1967.svg", 71 | "http://en.wikipedia.org/wiki/Circuito_da_Boavista": "https://upload.wikimedia.org/wikipedia/commons/2/24/Boavista2.png", 72 | "http://en.wikipedia.org/wiki/Sebring_Raceway": "https://upload.wikimedia.org/wikipedia/commons/4/45/Sebring_International_Raceway.svg", 73 | "http://en.wikipedia.org/wiki/Monsanto_Park_Circuit": "https://upload.wikimedia.org/wikipedia/commons/d/de/Circuit_Monsanto.png", 74 | "http://en.wikipedia.org/wiki/AVUS": "https://upload.wikimedia.org/wikipedia/commons/6/6d/Circuit_AVUS.svg", 75 | "http://en.wikipedia.org/wiki/Ain-Diab_Circuit": "https://upload.wikimedia.org/wikipedia/commons/a/a4/Ain-Diab.svg", 76 | "http://en.wikipedia.org/wiki/Pescara_Circuit": "https://upload.wikimedia.org/wikipedia/commons/d/d9/Circuito_di_Pescara.png", 77 | "http://en.wikipedia.org/wiki/Pedralbes_Circuit": "https://upload.wikimedia.org/wikipedia/commons/5/59/Circuit_Pedralbes.png", 78 | "http://en.wikipedia.org/wiki/Circuit_Bremgarten": "https://upload.wikimedia.org/wikipedia/commons/e/e7/Circuit_Bremgarten.svg" 79 | } 80 | -------------------------------------------------------------------------------- /assets/driver_images.json: -------------------------------------------------------------------------------- 1 | { 2 | "http://en.wikipedia.org/wiki/Jenson_Button": "https://upload.wikimedia.org/wikipedia/commons/0/0c/Jenson_Button_2024_WEC_Fuji.jpg", 3 | "http://en.wikipedia.org/wiki/Rubens_Barrichello": "https://upload.wikimedia.org/wikipedia/commons/a/ae/Rubinho.jpg", 4 | "http://en.wikipedia.org/wiki/Jarno_Trulli": "https://upload.wikimedia.org/wikipedia/commons/a/a7/Jarno-Trulli-2014-cropped.jpg", 5 | "http://en.wikipedia.org/wiki/Timo_Glock": "https://upload.wikimedia.org/wikipedia/commons/7/73/Timo_Glock_%28cropped%29.JPG", 6 | "http://en.wikipedia.org/wiki/Fernando_Alonso": "https://upload.wikimedia.org/wikipedia/commons/9/97/Alonso-68_%2824710447098%29.jpg", 7 | "http://en.wikipedia.org/wiki/Nico_Rosberg": "https://upload.wikimedia.org/wikipedia/commons/3/31/Nico_Rosberg_2016.jpg", 8 | "http://en.wikipedia.org/wiki/S%C3%A9bastien_Buemi": "https://upload.wikimedia.org/wikipedia/commons/0/05/Ryo_Hirakawa%2C_Brendon_Hartley_%26_Sebastien_Buemi_take_the_podium_for_2nd_in_Hypercar_at_the_2023_Le_Mans_%2853468554280%29_%28cropped%29.jpg", 9 | "http://en.wikipedia.org/wiki/S%C3%A9bastien_Bourdais": "https://upload.wikimedia.org/wikipedia/commons/4/40/Sebastien_Bourdais_in_2021_%2851221641988%29_%28cropped%29.jpg", 10 | "http://en.wikipedia.org/wiki/Adrian_Sutil": "https://upload.wikimedia.org/wikipedia/commons/e/e4/Adrian_Sutil.jpg", 11 | "http://en.wikipedia.org/wiki/Nick_Heidfeld": "https://upload.wikimedia.org/wikipedia/commons/2/2c/Nick_Heidfeld_Goodwood_Festival_of_Speed_2019_%2848242681251%29.jpg", 12 | "http://en.wikipedia.org/wiki/Giancarlo_Fisichella": "https://upload.wikimedia.org/wikipedia/commons/e/e2/Giancarlo_Fisichella_2012_WEC_Fuji.jpg", 13 | "http://en.wikipedia.org/wiki/Mark_Webber_(racing_driver)": "https://upload.wikimedia.org/wikipedia/commons/e/e3/Mark_Webber_2017_United_States_GP_%28cropped%29.jpg", 14 | "http://en.wikipedia.org/wiki/Sebastian_Vettel": "https://upload.wikimedia.org/wikipedia/commons/c/c9/Sebastian_Vettel_2012_Bahrain_GP.jpg", 15 | "http://en.wikipedia.org/wiki/Robert_Kubica": "https://upload.wikimedia.org/wikipedia/commons/7/7b/Robert_Kubica_at_Monza_2023.jpg", 16 | "http://en.wikipedia.org/wiki/Kimi_R%C3%A4ikk%C3%B6nen": "https://upload.wikimedia.org/wikipedia/commons/f/ff/F12019_Schloss_Gabelhofen_%2822%29_%28cropped%29.jpg", 17 | "http://en.wikipedia.org/wiki/Lewis_Hamilton": "https://upload.wikimedia.org/wikipedia/commons/a/ac/Lewis_Hamilton_2022_S%C3%A3o_Paulo_Grand_Prix_%2852498120773%29_%28cropped%29.jpg", 18 | "http://en.wikipedia.org/wiki/Felipe_Massa": "https://upload.wikimedia.org/wikipedia/commons/e/e7/Felipe_Massa.jpg", 19 | "http://en.wikipedia.org/wiki/Kazuki_Nakajima": "https://upload.wikimedia.org/wikipedia/commons/b/bc/Kazuki_Nakajima_2012_WEC_Fuji_%28cropped%29.jpg", 20 | "http://en.wikipedia.org/wiki/Nelson_Piquet,_Jr.": "https://upload.wikimedia.org/wikipedia/commons/a/a5/Nelson_Piquet_Jr._2021.jpg", 21 | "http://en.wikipedia.org/wiki/Heikki_Kovalainen": "https://upload.wikimedia.org/wikipedia/commons/2/29/Effect_20190609_091716.jpg", 22 | "http://en.wikipedia.org/wiki/Jaime_Alguersuari": "https://upload.wikimedia.org/wikipedia/commons/8/84/Jaime_Alguersuari_Canada_2010_cropped.jpg", 23 | "http://en.wikipedia.org/wiki/Romain_Grosjean": "https://upload.wikimedia.org/wikipedia/commons/5/58/Grosjean_at_2024_Chevrolet_Detroit_Grand_Prix.jpg", 24 | "http://en.wikipedia.org/wiki/Luca_Badoer": "https://upload.wikimedia.org/wikipedia/commons/9/98/Luca_Badoer_2021_%28cropped%29.jpg", 25 | "http://en.wikipedia.org/wiki/Vitantonio_Liuzzi": "https://upload.wikimedia.org/wikipedia/commons/0/01/Vitantonio_Liuzzi_2011_Malaysia.jpg", 26 | "http://en.wikipedia.org/wiki/Kamui_Kobayashi": "https://upload.wikimedia.org/wikipedia/commons/4/4f/Kamui_Kobayashi_2024_WEC_Fuji_2.jpg", 27 | "http://en.wikipedia.org/wiki/David_Coulthard": "https://upload.wikimedia.org/wikipedia/commons/b/bc/David_Coulthard_Champions_for_Charity_2022_%28cropped%29.jpg", 28 | "http://en.wikipedia.org/wiki/Anthony_Davidson": "https://upload.wikimedia.org/wikipedia/commons/7/7f/Anthony_Davidson_Goodwood_Festival_of_Speed_2019_%2848242774922%29.jpg", 29 | "http://en.wikipedia.org/wiki/Takuma_Sato": "https://upload.wikimedia.org/wikipedia/commons/d/d1/Takuma_Sato_%282021%29.jpg", 30 | "http://en.wikipedia.org/wiki/Ralf_Schumacher": "https://upload.wikimedia.org/wikipedia/commons/d/d1/Ralf_Schumacher%2C_2016.png", 31 | "http://en.wikipedia.org/wiki/Alexander_Wurz": "https://upload.wikimedia.org/wikipedia/commons/e/ef/Alexander_Wurz_-_2016_24_Hours_of_Le_Mans_-_Pit_Walk_%28cropped%29.jpg", 32 | "http://en.wikipedia.org/wiki/Scott_Speed": "https://upload.wikimedia.org/wikipedia/commons/c/c7/Scott_Speed_Sonoma_2024.jpg", 33 | "http://en.wikipedia.org/wiki/Christijan_Albers": "https://upload.wikimedia.org/wikipedia/commons/0/04/Christijan_Albers_2006_%28cropped%29.JPG", 34 | "http://en.wikipedia.org/wiki/Sakon_Yamamoto": "https://upload.wikimedia.org/wikipedia/commons/9/98/Sakon_Yamamoto_2010_Motorsport_Japan.jpg", 35 | "http://en.wikipedia.org/wiki/Michael_Schumacher": "https://upload.wikimedia.org/wikipedia/commons/f/ff/Michael_Schumacher_%28Ferrari%29_-_GP_d%27Italia_1998.jpg", 36 | "http://en.wikipedia.org/wiki/Juan_Pablo_Montoya": "https://upload.wikimedia.org/wikipedia/commons/9/9a/Juan_Pablo_Montoya_at_2021_Indianapolis_500_%2851222252077%29_%28cropped%29.jpg", 37 | "http://en.wikipedia.org/wiki/Christian_Klien": "https://upload.wikimedia.org/wikipedia/commons/9/97/Christian_Klien_%2813994163352%29_%28cropped%29.jpg", 38 | "http://en.wikipedia.org/wiki/Tiago_Monteiro": "https://upload.wikimedia.org/wikipedia/commons/8/88/Tiago_monteiro_spafrancorchamps2014.JPG", 39 | "http://en.wikipedia.org/wiki/Jacques_Villeneuve": "https://upload.wikimedia.org/wikipedia/commons/9/9c/Jacques_Villeneuve_August_2011.jpg", 40 | "http://en.wikipedia.org/wiki/Yuji_Ide": "https://upload.wikimedia.org/wikipedia/commons/9/90/Yuji_Ide_2010_Super_GT_Fuji_400km.jpg", 41 | "http://en.wikipedia.org/wiki/Franck_Montagny": "https://upload.wikimedia.org/wikipedia/commons/a/a9/Franck_Montagny_Le_Mans_drivers_parade_2011_crop.jpg", 42 | "http://en.wikipedia.org/wiki/Pedro_de_la_Rosa": "https://upload.wikimedia.org/wikipedia/commons/f/fe/Pedro_de_la_Rosa_2010_Malaysia.jpg", 43 | "http://en.wikipedia.org/wiki/Robert_Doornbos": "https://upload.wikimedia.org/wikipedia/commons/4/42/Robert_Doornbos_-_Red_Bull_Racing.jpg", 44 | "http://en.wikipedia.org/wiki/Narain_Karthikeyan": "https://upload.wikimedia.org/wikipedia/commons/a/a6/Narain_Karthikeyan_2011_Malaysia2.jpg", 45 | "http://en.wikipedia.org/wiki/Patrick_Friesacher": "https://upload.wikimedia.org/wikipedia/commons/2/26/Patrick_Friesacher.jpg", 46 | "http://en.wikipedia.org/wiki/Ant%C3%B4nio_Pizzonia": "https://upload.wikimedia.org/wikipedia/commons/d/d6/Fale_F1_Monza_2004_13.jpg", 47 | "http://en.wikipedia.org/wiki/Cristiano_da_Matta": "https://upload.wikimedia.org/wikipedia/commons/a/a7/Cdmlb06.jpg", 48 | "http://en.wikipedia.org/wiki/Olivier_Panis": "https://upload.wikimedia.org/wikipedia/commons/e/e1/Olivier_Panis_%28cropped%29.jpg", 49 | "http://en.wikipedia.org/wiki/Giorgio_Pantano": "https://upload.wikimedia.org/wikipedia/commons/7/7d/Giorgio_pantano_brandshatch2014.JPG", 50 | "http://en.wikipedia.org/wiki/Gianmaria_Bruni": "https://upload.wikimedia.org/wikipedia/commons/d/db/Gianmaria_Bruni_2012_WEC_Fuji.jpg", 51 | "http://en.wikipedia.org/wiki/Zsolt_Baumgartner": "https://upload.wikimedia.org/wikipedia/commons/e/e3/ChampCar_2007_Baumgartner.jpg", 52 | "http://en.wikipedia.org/wiki/Marc_Gen%C3%A9": "https://upload.wikimedia.org/wikipedia/commons/6/61/Marc_Gene_2007_Montjuic.jpg", 53 | "http://en.wikipedia.org/wiki/Ricardo_Zonta": "https://upload.wikimedia.org/wikipedia/commons/9/97/Ricardo_Zonta_2007_Curitiba.jpg", 54 | "http://en.wikipedia.org/wiki/Heinz-Harald_Frentzen": "https://upload.wikimedia.org/wikipedia/commons/8/8a/Heinz-Harald_Frentzen_a_%28cropped%29.jpg", 55 | "http://en.wikipedia.org/wiki/Jos_Verstappen": "https://upload.wikimedia.org/wikipedia/commons/b/b9/Jos_Verstappen%2C_2006.jpg", 56 | "http://en.wikipedia.org/wiki/Ralph_Firman": "https://upload.wikimedia.org/wikipedia/commons/8/82/Ralph_Firman_2008_Super_GT.jpg", 57 | "http://en.wikipedia.org/wiki/Justin_Wilson_(racing_driver)": "https://upload.wikimedia.org/wikipedia/commons/2/2b/Justin_Wilson_2013.jpg", 58 | "http://en.wikipedia.org/wiki/Nicolas_Kiesa": "https://upload.wikimedia.org/wikipedia/commons/6/62/Nicolas_kiesa_lemans2006.jpg", 59 | "http://en.wikipedia.org/wiki/Eddie_Irvine": "https://upload.wikimedia.org/wikipedia/commons/e/eb/Eddie_Irvine_after_the_1999_Australian_Grand_Prix.jpg", 60 | "http://en.wikipedia.org/wiki/Mika_Salo": "https://upload.wikimedia.org/wikipedia/commons/c/c7/Mika_Salo_Le_Mans_2009_cropped.jpg", 61 | "http://en.wikipedia.org/wiki/Alex_Yoong": "https://upload.wikimedia.org/wikipedia/commons/6/69/AlexYoong_0028_%28cropped%29.jpg", 62 | "http://en.wikipedia.org/wiki/Allan_McNish": "https://upload.wikimedia.org/wikipedia/commons/8/87/Allan_Mcnish.jpg", 63 | "http://en.wikipedia.org/wiki/Enrique_Bernoldi": "https://upload.wikimedia.org/wikipedia/commons/f/f7/Enrique_Bernoldi_2007_Curitiba.jpg", 64 | "http://en.wikipedia.org/wiki/Luciano_Burti": "https://upload.wikimedia.org/wikipedia/commons/8/86/Luciano_Burti_2006_Curitiba.jpg", 65 | "http://en.wikipedia.org/wiki/Jean_Alesi": "https://upload.wikimedia.org/wikipedia/commons/c/c7/Jean_Alesi%2C_GIMS_2019%2C_Le_Grand-Saconnex_%28GIMS0047%29.jpg", 66 | "http://en.wikipedia.org/wiki/Mika_H%C3%A4kkinen": "https://upload.wikimedia.org/wikipedia/commons/a/a6/Mika_H%C3%A4kkinen_Champions_for_Charity_2016-07-27.jpg", 67 | "http://en.wikipedia.org/wiki/Gast%C3%B3n_Mazzacane": "https://upload.wikimedia.org/wikipedia/commons/0/01/Gaston_Mazzacane_2018_%28cropped%29.png", 68 | "http://en.wikipedia.org/wiki/Tarso_Marques": "https://upload.wikimedia.org/wikipedia/commons/c/cc/Tarso_Marques_2007_Curitiba.jpg", 69 | "http://en.wikipedia.org/wiki/Tom%C3%A1%C5%A1_Enge": "https://upload.wikimedia.org/wikipedia/commons/5/5c/2021_Barum_Czech_Rally_Zl%C3%ADn_-_Tom%C3%A1%C5%A1_Enge.jpg", 70 | "http://en.wikipedia.org/wiki/Pedro_Diniz": "https://upload.wikimedia.org/wikipedia/commons/1/11/Fazenda_da_Toca_foto_kiko_ferrite_02295_-_Pedro_Paulo_Diniz_%28cropped%29.jpg", 71 | "http://en.wikipedia.org/wiki/Johnny_Herbert": "https://upload.wikimedia.org/wikipedia/commons/b/bf/Johnny_Herbert_%2831729263593%29.jpg", 72 | "http://en.wikipedia.org/wiki/Toranosuke_Takagi": "https://upload.wikimedia.org/wikipedia/commons/f/f2/Toranosuke_Takagi_2008_Super_GT.jpg", 73 | "http://en.wikipedia.org/wiki/Damon_Hill": "https://upload.wikimedia.org/wikipedia/commons/2/2c/Minister_for_Sport_Hugh_Robertson_at_launch_of_GREAT_campaign%2C_Australia_%286841281192%29_%28cropped%29.jpg", 74 | "http://en.wikipedia.org/wiki/Alex_Zanardi": "https://upload.wikimedia.org/wikipedia/commons/3/36/Alex_Zanardi_%28cropped%29.JPG", 75 | "http://en.wikipedia.org/wiki/Jan_Magnussen": "https://upload.wikimedia.org/wikipedia/commons/0/03/Jan_Magnussen_%2837535519996%29_%28cropped%29.jpg", 76 | "http://en.wikipedia.org/wiki/Shinji_Nakano": "https://upload.wikimedia.org/wikipedia/commons/4/4d/Shinji_Nakano_2009_Japan.jpg", 77 | "http://en.wikipedia.org/wiki/Ricardo_Rosset": "https://upload.wikimedia.org/wikipedia/commons/f/fc/Ricarad_Rosset_Thruxton.jpg", 78 | "http://en.wikipedia.org/wiki/Esteban_Tuero": "https://upload.wikimedia.org/wikipedia/commons/b/b6/Esteban_Tuero_2017_%28cropped%29.jpg", 79 | "http://en.wikipedia.org/wiki/Gerhard_Berger": "https://upload.wikimedia.org/wikipedia/commons/c/c9/Gerhard_Berger_1991USA_%28cropped%29.jpg", 80 | "http://en.wikipedia.org/wiki/Nicola_Larini": "https://upload.wikimedia.org/wikipedia/commons/6/6d/Nicola_Larini_2006_Curitiba.jpg", 81 | "http://en.wikipedia.org/wiki/Ukyo_Katayama": "https://upload.wikimedia.org/wikipedia/commons/6/6e/Ukyo_Katayama_2008.jpg", 82 | "http://en.wikipedia.org/wiki/Gianni_Morbidelli": "https://upload.wikimedia.org/wikipedia/commons/1/16/Gianni_morbidelli_spafrancorchamps2014.JPG", 83 | "http://en.wikipedia.org/wiki/Pedro_Lamy": "https://upload.wikimedia.org/wikipedia/commons/7/7f/Pedro_Lamy_Le_Mans_drivers_parade_2011_crop.jpg", 84 | "http://en.wikipedia.org/wiki/Martin_Brundle": "https://upload.wikimedia.org/wikipedia/commons/3/36/Martin_Brundle_2021_%2851591210921%29_%28cropped%29.jpg", 85 | "http://en.wikipedia.org/wiki/Andrea_Montermini": "https://upload.wikimedia.org/wikipedia/commons/1/19/Andrea_montermini_brandshatch2014.JPG", 86 | "http://en.wikipedia.org/wiki/Giovanni_Lavaggi": "https://upload.wikimedia.org/wikipedia/commons/c/cc/Lavaggi_LS1_Spa_2009.JPG", 87 | "http://en.wikipedia.org/wiki/Mark_Blundell": "https://upload.wikimedia.org/wikipedia/commons/9/99/Mark_Blundell_portrait_2011_%28cropped%29.jpg", 88 | "http://en.wikipedia.org/wiki/Aguri_Suzuki": "https://upload.wikimedia.org/wikipedia/commons/7/7d/Aguri_Suzuki_2008_Super_GT.jpg", 89 | "http://en.wikipedia.org/wiki/Nigel_Mansell": "https://upload.wikimedia.org/wikipedia/commons/e/e4/Nigel_Mansell_-_Mexican_Grand_Prix_01_%28cropped%29.jpeg", 90 | "http://en.wikipedia.org/wiki/Pierluigi_Martini": "https://upload.wikimedia.org/wikipedia/commons/5/58/Pierluigi_Martini_in_2016.jpg", 91 | "http://en.wikipedia.org/wiki/Karl_Wendlinger": "https://upload.wikimedia.org/wikipedia/commons/e/ef/GTS_class_winners_%2810th_overall%29_-_Karl_Wendlinger_-_Chrysler_Viper_GTS-R_-_on_the_podium_at_the_1999_Le_Mans_%2851897678180%29_%28cropped%29.jpg", 92 | "http://en.wikipedia.org/wiki/Jean-Christophe_Boullion": "https://upload.wikimedia.org/wikipedia/commons/6/69/Jean-Christophe_Boullion_2007_Mil_Milhas_Brasil.jpg", 93 | "http://en.wikipedia.org/wiki/Roberto_Moreno": "https://upload.wikimedia.org/wikipedia/commons/f/f4/Roberto_Bud_suite_97.tif", 94 | "http://en.wikipedia.org/wiki/Bertrand_Gachot": "https://upload.wikimedia.org/wikipedia/commons/0/08/Bertrand_Gachot_-_1991_US_GP.jpg", 95 | "http://en.wikipedia.org/wiki/Massimiliano_Papis": "https://upload.wikimedia.org/wikipedia/commons/c/cb/Max_papis_%2830129892652%29_%28cropped%29.jpg", 96 | "http://en.wikipedia.org/wiki/Gabriele_Tarquini": "https://upload.wikimedia.org/wikipedia/commons/9/9a/Gabriele_tarquini_spafrancorchamps2014.JPG", 97 | "http://en.wikipedia.org/wiki/Jean-Denis_Deletraz": "https://upload.wikimedia.org/wikipedia/commons/d/da/Jean-Denis_D%C3%A9l%C3%A9traz_-_Le_Mans_2012.JPG", 98 | "http://en.wikipedia.org/wiki/%C3%89rik_Comas": "https://upload.wikimedia.org/wikipedia/commons/d/d2/Comas_lm2005.jpg", 99 | "http://en.wikipedia.org/wiki/David_Brabham": "https://upload.wikimedia.org/wikipedia/commons/6/62/David_Brabham_2012_%287321981998%29_%28cropped%29.jpg", 100 | "http://en.wikipedia.org/wiki/Christian_Fittipaldi": "https://upload.wikimedia.org/wikipedia/commons/f/f9/Christian_Fittipaldi_2006_Curitiba.jpg", 101 | "http://en.wikipedia.org/wiki/Andrea_de_Cesaris": "https://upload.wikimedia.org/wikipedia/commons/2/22/Andrea_De_Cesaris_1982.jpg", 102 | "http://en.wikipedia.org/wiki/Michele_Alboreto": "https://upload.wikimedia.org/wikipedia/commons/7/76/SCA_0029_MICHELE_ALBORETO_-_Ferrari_F_1-87_-_1987_neg._125_10x15_R_%28cropped%29.JPG", 103 | "http://en.wikipedia.org/wiki/Jyrki_J%C3%A4rvilehto": "https://upload.wikimedia.org/wikipedia/commons/3/3f/JJ_Lehto_%28Petit_Le_Mans%2C_2004%29.jpg", 104 | "http://en.wikipedia.org/wiki/Olivier_Beretta": "https://upload.wikimedia.org/wikipedia/commons/6/6a/Olivier_Beretta_2012_WEC_Fuji.jpg", 105 | "http://en.wikipedia.org/wiki/Jean-Marc_Gounon": "https://upload.wikimedia.org/wikipedia/commons/e/ea/Jean-Marc_Gounon_%282015%29.JPG", 106 | "http://en.wikipedia.org/wiki/Yannick_Dalmas": "https://upload.wikimedia.org/wikipedia/commons/2/2c/Yannick_DALMAS.JPG", 107 | "http://en.wikipedia.org/wiki/Franck_Lagorce": "https://upload.wikimedia.org/wikipedia/commons/9/9c/Franck_Lagorce_-_Mondial_de_l%27Automobile_de_Paris_2016_-_003.jpg", 108 | "http://en.wikipedia.org/wiki/Alain_Prost": "https://upload.wikimedia.org/wikipedia/commons/7/74/Festival_automobile_international_2015_-_Photocall_-_065_%28cropped3%29.jpg", 109 | "http://en.wikipedia.org/wiki/Ayrton_Senna": "https://upload.wikimedia.org/wikipedia/commons/6/65/Ayrton_Senna_9_%28cropped%29.jpg", 110 | "http://en.wikipedia.org/wiki/Derek_Warwick": "https://upload.wikimedia.org/wikipedia/commons/4/47/Derek_Warwick_Silverstone_2014.JPG", 111 | "http://en.wikipedia.org/wiki/Philippe_Alliot": "https://upload.wikimedia.org/wikipedia/commons/f/f0/Philippe_Alliot_1990_United_States.jpg", 112 | "http://en.wikipedia.org/wiki/Riccardo_Patrese": "https://upload.wikimedia.org/wikipedia/commons/3/3e/Riccardo_Patrese_in_the_paddock_before_the_1993_British_Grand_Prix_%2833686653515%29_%28Cropped%29.jpg", 113 | "http://en.wikipedia.org/wiki/Michael_Andretti": "https://upload.wikimedia.org/wikipedia/commons/0/07/Michael_Andretti_%2853785910028%29_%28cropped%29.jpg", 114 | "http://en.wikipedia.org/wiki/Thierry_Boutsen": "https://upload.wikimedia.org/wikipedia/commons/2/20/Thierry_Boutsen_1993.jpg", 115 | "http://en.wikipedia.org/wiki/Toshio_Suzuki_(driver)": "https://upload.wikimedia.org/wikipedia/commons/e/eb/Toyota_GT-One_-_Ukyou_Katayama%2C_Keiichi_Tsuchiya_%26_Toshio_Suzuki_heads_towards_Dunlop_Bridge_at_the_1999_Le_Mans_%2851890094535%29.jpg", 116 | "http://en.wikipedia.org/wiki/Maur%C3%ADcio_Gugelmin": "https://upload.wikimedia.org/wikipedia/commons/e/ea/Gugelmin_%28cropped%29.jpg", 117 | "http://en.wikipedia.org/wiki/Eric_van_de_Poele": "https://upload.wikimedia.org/wikipedia/commons/c/ca/Eric_van_de_Poele_2008.jpg", 118 | "http://en.wikipedia.org/wiki/Ivan_Capelli": "https://upload.wikimedia.org/wikipedia/commons/1/1c/Capelli_1991_%28cropped%29.jpg", 119 | "http://en.wikipedia.org/wiki/Paul_Belmondo": "https://upload.wikimedia.org/wikipedia/commons/e/e1/Paul_Belmondo_par_Claude_Truong-Ngoc_juillet_2013.jpg", 120 | "http://en.wikipedia.org/wiki/Olivier_Grouillard": "https://upload.wikimedia.org/wikipedia/commons/a/af/Andy_Wallace_%26_Olivier_Grouillard_on_the_podium_at_the_Norwich_Union_Empire_Trophy%2C_Silverstone_4_Hrs_1995_%2849890621322%29_%28cropped%29.jpg", 121 | "http://en.wikipedia.org/wiki/Jan_Lammers": "https://upload.wikimedia.org/wikipedia/commons/4/4e/Jan_Lammers_LeMans24_2017.jpg", 122 | "http://en.wikipedia.org/wiki/Nelson_Piquet": "https://upload.wikimedia.org/wikipedia/commons/5/5b/Cerimonia_de_entrega_da_medalha_Bras%C3%ADlia_60_anos_-_16.jpg", 123 | "http://en.wikipedia.org/wiki/Satoru_Nakajima": "https://upload.wikimedia.org/wikipedia/commons/8/8b/Satoru_Nakajima_2008_Motorsport_Japan_%28cropped%29.jpg", 124 | "http://en.wikipedia.org/wiki/Emanuele_Pirro": "https://upload.wikimedia.org/wikipedia/commons/1/1b/Emanuele_Pirro_2012_WEC_Fuji_2.jpg", 125 | "http://en.wikipedia.org/wiki/Alex_Caffi": "https://upload.wikimedia.org/wikipedia/commons/0/0f/Alex_Caffi_1991_%28cropped%29.jpg", 126 | "http://en.wikipedia.org/wiki/Bernd_Schneider_(racecar_driver)": "https://upload.wikimedia.org/wikipedia/commons/1/14/Bernd_Schneider_2007_amk.jpg", 127 | "http://en.wikipedia.org/wiki/Martin_Donnelly_(racing_driver)": "https://upload.wikimedia.org/wikipedia/commons/7/7f/Martin_Donnelly_VW_Scirocco_R-Cup_-_2012.jpg", 128 | "http://en.wikipedia.org/wiki/Norberto_Fontana": "", 129 | "http://en.wikipedia.org/wiki/Domenico_Schiattarella": "", 130 | "http://en.wikipedia.org/wiki/Taki_Inoue": "", 131 | "http://en.wikipedia.org/wiki/%C3%89ric_Bernard": "", 132 | "http://en.wikipedia.org/wiki/Roland_Ratzenberger": "", 133 | "http://en.wikipedia.org/wiki/Philippe_Adams": "", 134 | "http://en.wikipedia.org/wiki/Fabrizio_Barbazza": "", 135 | "http://en.wikipedia.org/wiki/Emanuele_Naspetti": "", 136 | "http://en.wikipedia.org/wiki/Stefano_Modena": "", 137 | "http://en.wikipedia.org/wiki/Julian_Bailey": "", 138 | "http://en.wikipedia.org/wiki/Alessandro_Nannini": "", 139 | "http://en.wikipedia.org/wiki/Paolo_Barilla": "", 140 | "http://en.wikipedia.org/wiki/Gregor_Foitek": "", 141 | "http://en.wikipedia.org/wiki/Nico_H%C3%BClkenberg": "https://upload.wikimedia.org/wikipedia/commons/c/cd/Nico_Hulkenberg_2016_Malaysia.jpg", 142 | "http://en.wikipedia.org/wiki/Karun_Chandhok": "https://upload.wikimedia.org/wikipedia/commons/3/32/Karun_Chandhok_Goodwood_Festival_of_Speed_2019_%2848242680701%29.jpg", 143 | "http://en.wikipedia.org/wiki/Lucas_di_Grassi": "https://upload.wikimedia.org/wikipedia/commons/0/01/TechCrunch_Disrupt_Berlin_2018_%28Day_1%29_08_%28cropped%29.jpg", 144 | "http://en.wikipedia.org/wiki/Bruno_Senna": "https://upload.wikimedia.org/wikipedia/commons/9/9c/Senna_by_United_Autosports_team_04.jpg", 145 | "http://en.wikipedia.org/wiki/Vitaly_Petrov": "https://upload.wikimedia.org/wikipedia/commons/0/00/Vitaly_Petrov_2010_Malaysia_%28cropped%29.jpg", 146 | "http://en.wikipedia.org/wiki/Jonathan_Palmer": "https://upload.wikimedia.org/wikipedia/commons/2/2b/Jonathan_Palmer_Profile.jpg", 147 | "http://en.wikipedia.org/wiki/Christian_Danner": "https://upload.wikimedia.org/wikipedia/commons/f/f6/Christian_Danner_1995_Deutsche_Tourenwagen_Meisterschaft%2C_Donington_Park.jpg", 148 | "http://en.wikipedia.org/wiki/Eddie_Cheever": "https://upload.wikimedia.org/wikipedia/commons/8/87/Eddie_Cheever_Jr_2009_Indy_500_Second_Qual_Day.JPG", 149 | "http://en.wikipedia.org/wiki/Ren%C3%A9_Arnoux": "https://upload.wikimedia.org/wikipedia/commons/6/6f/Rene_Arnoux_WSR2008_HU.png", 150 | "http://en.wikipedia.org/wiki/Stefan_Johansson": "https://upload.wikimedia.org/wikipedia/commons/7/71/Stefan_Johansson3_%285987943266%29_%28cropped%29.jpg", 151 | "http://en.wikipedia.org/wiki/Luis_Perez-Sala": "", 152 | "http://en.wikipedia.org/wiki/Philippe_Streiff": "https://upload.wikimedia.org/wikipedia/commons/c/c7/Festival_automobile_international_2014_-_Photocall_-_019.jpg", 153 | "http://en.wikipedia.org/wiki/Adri%C3%A1n_Campos": "", 154 | "http://en.wikipedia.org/wiki/Oscar_Larrauri": "", 155 | "http://en.wikipedia.org/wiki/Piercarlo_Ghinzani": "https://upload.wikimedia.org/wikipedia/commons/6/6c/1985_European_GP_Piercarlo_Ghinzani_%28cropped%29.jpg", 156 | "http://en.wikipedia.org/wiki/Jean-Louis_Schlesser": "https://upload.wikimedia.org/wikipedia/commons/4/4e/Jean-Louis_Schlesser%2C_2013.JPG", 157 | "http://en.wikipedia.org/wiki/Pascal_Fabre": "", 158 | "http://en.wikipedia.org/wiki/Teo_Fabi": "", 159 | "http://en.wikipedia.org/wiki/Jacques_Laffite": "https://upload.wikimedia.org/wikipedia/commons/d/d3/Jacques_Laffite_2015.jpg", 160 | "http://en.wikipedia.org/wiki/Elio_de_Angelis": "https://upload.wikimedia.org/wikipedia/commons/4/4e/Anefo_932-2371_Elio_de_Angelis_03.07.1982.jpg", 161 | "http://en.wikipedia.org/wiki/Johnny_Dumfries": "", 162 | "http://en.wikipedia.org/wiki/Keke_Rosberg": "https://upload.wikimedia.org/wikipedia/commons/3/3c/Anefo_932-2378_Keke_Rosberg%2C_Zandvoort%2C_03-07-1982_-_Restoration.jpg", 163 | "http://en.wikipedia.org/wiki/Patrick_Tambay": "https://upload.wikimedia.org/wikipedia/commons/d/d1/Zandvoort_circuit_De_striptekenaar_Graton_in_de_pits%2C_NL-HlmNHA_54005237_-_Patrick_Tambay_%28cropped%29.JPG", 164 | "http://en.wikipedia.org/wiki/Marc_Surer": "https://upload.wikimedia.org/wikipedia/commons/3/3e/Marc_Surer_1982.jpg", 165 | "http://en.wikipedia.org/wiki/Alan_Jones_(Formula_1)": "https://upload.wikimedia.org/wikipedia/commons/c/ce/Jones_alan.JPG", 166 | "http://en.wikipedia.org/wiki/Huub_Rothengatter": "https://upload.wikimedia.org/wikipedia/commons/7/72/Huub_Rothengatter_in_1977.jpg", 167 | "http://en.wikipedia.org/wiki/Allen_Berg": "", 168 | "http://en.wikipedia.org/wiki/Manfred_Winkelhock": "", 169 | "http://en.wikipedia.org/wiki/Stefan_Bellof": "https://upload.wikimedia.org/wikipedia/commons/e/e1/Stefan_Bellof_7508-cropped.jpg", 170 | "http://en.wikipedia.org/wiki/Niki_Lauda": "https://upload.wikimedia.org/wikipedia/commons/6/64/Anefo_933-1302_Niki_Lauda_29.10.1984.jpg", 171 | "http://en.wikipedia.org/wiki/John_Watson_(racing_driver)": "https://upload.wikimedia.org/wikipedia/commons/3/3d/Watson_at_1982_Dutch_Grand_Prix_%28cropped%29.jpg", 172 | "http://en.wikipedia.org/wiki/Mauro_Baldi": "https://upload.wikimedia.org/wikipedia/commons/8/80/Mauro_Baldi_1982.jpg", 173 | "http://en.wikipedia.org/wiki/Fran%C3%A7ois_Hesnault": "", 174 | "http://en.wikipedia.org/wiki/Johnny_Cecotto": "https://upload.wikimedia.org/wikipedia/commons/4/44/Johnny_Cecotto_%281978%29.jpg", 175 | "http://en.wikipedia.org/wiki/Corrado_Fabi": "", 176 | "http://en.wikipedia.org/wiki/Jo_Gartner": "", 177 | "http://en.wikipedia.org/wiki/Chico_Serra": "https://upload.wikimedia.org/wikipedia/commons/c/c0/Chico_Serra_2007_Mil_Milhas_Brasil.jpg", 178 | "http://en.wikipedia.org/wiki/Danny_Sullivan": "https://upload.wikimedia.org/wikipedia/commons/1/18/DannySullivanAt2015indy500.JPG", 179 | "http://en.wikipedia.org/wiki/Eliseo_Salazar": "https://upload.wikimedia.org/wikipedia/commons/d/d7/Eliseo_Salazar_%281982%29.jpg", 180 | "http://en.wikipedia.org/wiki/Raul_Boesel": "https://upload.wikimedia.org/wikipedia/commons/9/98/Raul_Boesel_2007_Mil_Milhas_Brasil.jpg", 181 | "http://en.wikipedia.org/wiki/Jean-Pierre_Jarier": "https://upload.wikimedia.org/wikipedia/commons/7/7e/Jean-Pierre_Jarier_en_1976.jpg", 182 | "http://en.wikipedia.org/wiki/Bruno_Giacomelli": "https://upload.wikimedia.org/wikipedia/commons/0/01/Bruno_Giacomelli_1982.jpg", 183 | "http://en.wikipedia.org/wiki/Roberto_Guerrero": "https://upload.wikimedia.org/wikipedia/commons/3/36/Roberto_Guerrero_2010_Indy_500_Practice_Day_7.JPG", 184 | "http://en.wikipedia.org/wiki/Kenny_Acheson": "", 185 | "http://en.wikipedia.org/wiki/Carlos_Reutemann": "https://upload.wikimedia.org/wikipedia/commons/3/3a/Reutemann_1981.jpg", 186 | "http://en.wikipedia.org/wiki/Jochen_Mass": "https://upload.wikimedia.org/wikipedia/commons/3/34/Mass_at_1982_Dutch_Grand_Prix.jpg", 187 | "http://en.wikipedia.org/wiki/Derek_Daly": "https://upload.wikimedia.org/wikipedia/commons/8/82/Derek_Daly_1982.jpg", 188 | "http://en.wikipedia.org/wiki/Slim_Borgudd": "https://upload.wikimedia.org/wikipedia/commons/b/b5/Borgudd-Slim-1994.jpg", 189 | "http://en.wikipedia.org/wiki/Didier_Pironi": "https://upload.wikimedia.org/wikipedia/commons/8/86/Pironi_celebrating_at_1982_Dutch_Grand_Prix_%28cropped%29.jpg", 190 | "http://en.wikipedia.org/wiki/Gilles_Villeneuve": "", 191 | "http://en.wikipedia.org/wiki/Brian_Henton": "https://upload.wikimedia.org/wikipedia/commons/c/c4/Brian_Henton_%281971%29.jpg", 192 | "http://en.wikipedia.org/wiki/Geoff_Lees": "", 193 | "http://en.wikipedia.org/wiki/Mario_Andretti": "https://upload.wikimedia.org/wikipedia/commons/c/c3/Mario_Andretti_Goodwood_Festival_of_Speed_2021_%28cropped%29.jpg", 194 | "http://en.wikipedia.org/wiki/Rupert_Keegan": "https://upload.wikimedia.org/wikipedia/commons/2/22/L18.34.10_-_Formel_1_-_24_-_Hesketh_308E%2C_1977_-_Graham_Williams_-_paddock_-_DSC_0628_Balancer_%2836986883421%29.jpg", 195 | "http://en.wikipedia.org/wiki/Ricardo_Zunino": "https://upload.wikimedia.org/wikipedia/commons/0/02/1980_Argentine_Grand_Prix_Zunino.jpg", 196 | "http://en.wikipedia.org/wiki/Siegfried_Stohr": "https://upload.wikimedia.org/wikipedia/commons/3/30/1981_Argentine_Grand_Prix%2C_Stohr.jpg", 197 | "http://en.wikipedia.org/wiki/Hector_Rebaque": "https://upload.wikimedia.org/wikipedia/commons/d/dc/1981_Argentine_Grand_Prix%2C_Rebaque.jpg", 198 | "http://en.wikipedia.org/wiki/Emerson_Fittipaldi": "https://upload.wikimedia.org/wikipedia/commons/5/5e/Emerson_Fittipaldi_in_2020_%28cropped%29.JPG", 199 | "http://en.wikipedia.org/wiki/Clay_Regazzoni": "https://upload.wikimedia.org/wikipedia/commons/e/e7/Anefo_924-6609_Clay_Reggazoni%2C_Catherine_Blaton%2C_Jacky_Ickx_Zandvoort_18_06_1971_-_Cropped.jpg", 200 | "http://en.wikipedia.org/wiki/Jody_Scheckter": "https://upload.wikimedia.org/wikipedia/commons/d/dc/Jody_Scheckter_during_the_1979_Monaco_Grand_Prix.jpg", 201 | "http://en.wikipedia.org/wiki/Jean-Pierre_Jabouille": "https://upload.wikimedia.org/wikipedia/commons/5/55/JeanPierreJabouille1975.jpg", 202 | "http://en.wikipedia.org/wiki/Patrick_Depailler": "https://upload.wikimedia.org/wikipedia/commons/4/4e/PatrickDepailler-ar.jpg", 203 | "http://en.wikipedia.org/wiki/James_Hunt": "https://upload.wikimedia.org/wikipedia/commons/1/12/J._Hunt_in_1977_%28cropped%29.jpg", 204 | "http://en.wikipedia.org/wiki/Hans_Joachim_Stuck": "https://upload.wikimedia.org/wikipedia/commons/c/cf/HansJoachimStuck2008.jpg", 205 | "http://en.wikipedia.org/wiki/Jacky_Ickx": "https://upload.wikimedia.org/wikipedia/commons/1/19/Jacky_Ickx_Portr%C3%A4t_Mille_Miglia_2018.jpg", 206 | "http://en.wikipedia.org/wiki/Patrick_Gaillard": "", 207 | "http://en.wikipedia.org/wiki/Vittorio_Brambilla": "https://upload.wikimedia.org/wikipedia/commons/7/75/Vittorio_Brambilla.jpg", 208 | "http://en.wikipedia.org/wiki/Ronnie_Peterson": "https://upload.wikimedia.org/wikipedia/commons/e/e2/Peterson_at_1978_Dutch_Grand_Prix.jpg", 209 | "http://en.wikipedia.org/wiki/Brett_Lunger": "", 210 | "http://en.wikipedia.org/wiki/Rolf_Stommelen": "https://upload.wikimedia.org/wikipedia/commons/c/c4/Stommelen%2C_Rolf_am_1972-07-07.jpg", 211 | "http://en.wikipedia.org/wiki/Harald_Ertl": "https://upload.wikimedia.org/wikipedia/commons/f/fa/HaraldErtlZolder1978.jpg", 212 | "http://en.wikipedia.org/wiki/Bobby_Rahal": "https://upload.wikimedia.org/wikipedia/commons/6/69/Bobby_Rahal_%282021%29.jpg", 213 | "http://en.wikipedia.org/wiki/Carlos_Pace": "https://upload.wikimedia.org/wikipedia/commons/d/d1/Carlos_Pace_74_%28cropped%29.jpg", 214 | "http://en.wikipedia.org/wiki/Gunnar_Nilsson": "https://upload.wikimedia.org/wikipedia/commons/1/16/1976-07-10_Gunnar_Nilsson_im_BMW_CSL_%28cropped%29.jpg", 215 | "http://en.wikipedia.org/wiki/Renzo_Zorzi": "", 216 | "http://en.wikipedia.org/wiki/Ingo_Hoffmann": "https://upload.wikimedia.org/wikipedia/commons/b/b3/Ingo_Hoffmann_2007_Curitiba.jpg", 217 | "http://en.wikipedia.org/wiki/Hans_Binder": "https://upload.wikimedia.org/wikipedia/commons/f/f4/1977_Argentine_Grand_Prix_Binder.jpg", 218 | "http://en.wikipedia.org/wiki/Larry_Perkins": "https://upload.wikimedia.org/wikipedia/commons/4/40/1995_Holden_VR_Commodore_Bathurst_winner_%2828249502800%29.jpg", 219 | "http://en.wikipedia.org/wiki/Ian_Scheckter": "https://upload.wikimedia.org/wikipedia/commons/8/85/1977_Argentine_Grand_Prix_Ian_Scheckter.jpg", 220 | "http://en.wikipedia.org/wiki/Patrick_Neve": "", 221 | "http://en.wikipedia.org/wiki/Emilio_de_Villota": "https://upload.wikimedia.org/wikipedia/commons/a/ac/Emilio_de_Villota_%28cropped%29.jpg", 222 | "http://en.wikipedia.org/wiki/David_Purley": "", 223 | "http://en.wikipedia.org/wiki/Arturo_Merzario": "https://upload.wikimedia.org/wikipedia/commons/d/da/Arturo_Merzario_Auto_Zuerich_2024_DSC_6348_%28cropped-2%29.jpg", 224 | "http://en.wikipedia.org/wiki/Jackie_Oliver": "https://upload.wikimedia.org/wikipedia/commons/f/f5/Jackie_Oliver_1969_kl.JPG", 225 | "http://en.wikipedia.org/wiki/Vern_Schuppan": "https://upload.wikimedia.org/wikipedia/commons/3/35/Schholhay_83-98_%281%29.JPG", 226 | "http://en.wikipedia.org/wiki/Alex_Ribeiro": "https://upload.wikimedia.org/wikipedia/commons/b/b3/Alex_Ribeiro.jpg", 227 | "http://en.wikipedia.org/wiki/Ian_Ashley": "https://upload.wikimedia.org/wikipedia/commons/7/7b/Ian_Ashley.jpg", 228 | "http://en.wikipedia.org/wiki/Danny_Ongais": "https://upload.wikimedia.org/wikipedia/commons/f/f5/Ongais%2C_Danny_%281984%29.jpg", 229 | "http://en.wikipedia.org/wiki/Kunimitsu_Takahashi": "https://upload.wikimedia.org/wikipedia/commons/a/a4/Kunimitsu_Takahashi_1963.jpg", 230 | "http://en.wikipedia.org/wiki/Kazuyoshi_Hoshino": "https://upload.wikimedia.org/wikipedia/commons/6/6b/Kazuyoshi_Hoshino_2010_Formula_Nippon_Motegi_%28May%29.jpg", 231 | "http://en.wikipedia.org/wiki/Tom_Pryce": "", 232 | "http://en.wikipedia.org/wiki/Lella_Lombardi": "https://upload.wikimedia.org/wikipedia/commons/0/08/Lella-Garage-Reading-04.jpg", 233 | "http://en.wikipedia.org/wiki/Bob_Evans_(race_driver)": "https://upload.wikimedia.org/wikipedia/commons/a/a3/Monaco_1975_-_Bob_Evans_-_NQ.jpg", 234 | "http://en.wikipedia.org/wiki/Michel_Lecl%C3%A8re": "", 235 | "http://en.wikipedia.org/wiki/Chris_Amon": "https://upload.wikimedia.org/wikipedia/commons/7/7b/AmonChris19730706.jpg", 236 | "http://en.wikipedia.org/wiki/Loris_Kessel": "https://upload.wikimedia.org/wikipedia/commons/0/03/1976_BRDC_International_Trophy%2C_Loris_Kessel.jpg", 237 | "http://en.wikipedia.org/wiki/Guy_Edwards": "", 238 | "http://en.wikipedia.org/wiki/Alessandro_Pesenti-Rossi": "", 239 | "http://en.wikipedia.org/wiki/Henri_Pescarolo": "https://upload.wikimedia.org/wikipedia/commons/3/30/PescaroloHenry1973N%C3%BCrb.jpg", 240 | "http://en.wikipedia.org/wiki/Warwick_Brown": "", 241 | "http://en.wikipedia.org/wiki/Noritake_Takahara": "", 242 | "http://en.wikipedia.org/wiki/Masahiro_Hasemi": "https://upload.wikimedia.org/wikipedia/commons/1/1b/Kojima_KE007_front-right_2013_Yurakucho.jpg", 243 | "http://en.wikipedia.org/wiki/Mark_Donohue": "https://upload.wikimedia.org/wikipedia/commons/a/a0/Mark_Donohue_JPGP_S_75.jpg", 244 | "http://en.wikipedia.org/wiki/Graham_Hill": "https://upload.wikimedia.org/wikipedia/commons/f/fc/Graham_Hill_Bestanddeelnr_924-6564.jpg", 245 | "http://en.wikipedia.org/wiki/Wilson_Fittipaldi": "https://upload.wikimedia.org/wikipedia/commons/a/a9/Wilson_Fittipaldi_J%C3%BAnior_2017.jpg", 246 | "http://en.wikipedia.org/wiki/Guy_Tunmer": "", 247 | "http://en.wikipedia.org/wiki/Eddie_Keizan": "", 248 | "http://en.wikipedia.org/wiki/Dave_Charlton": "", 249 | "http://en.wikipedia.org/wiki/Tony_Brise": "", 250 | "http://en.wikipedia.org/wiki/Torsten_Palm": "", 251 | "http://en.wikipedia.org/wiki/Damien_Magee": "", 252 | "http://en.wikipedia.org/wiki/Gijs_Van_Lennep": "https://upload.wikimedia.org/wikipedia/commons/4/44/Gijs_van_Lennep_%281971%29.jpg", 253 | "http://en.wikipedia.org/wiki/John_Nicholson_(racing_driver)": "", 254 | "http://en.wikipedia.org/wiki/Dave_Morgan_(racing_driver)": "", 255 | "http://en.wikipedia.org/wiki/Jim_Crawford_(driver)": "https://upload.wikimedia.org/wikipedia/commons/2/2c/JimCrawford1988Indy500.JPG", 256 | "http://en.wikipedia.org/wiki/Denny_Hulme": "https://upload.wikimedia.org/wikipedia/commons/9/92/HulmeDenis196508_%28cropped%29.jpg", 257 | "http://en.wikipedia.org/wiki/Mike_Hailwood": "https://upload.wikimedia.org/wikipedia/commons/f/f0/Mike_Hailwood.jpg", 258 | "http://en.wikipedia.org/wiki/Jean-Pierre_Beltoise": "https://upload.wikimedia.org/wikipedia/commons/f/f1/Jean_Pierre_Beltoise_te_Zandvoort_1968.jpg", 259 | "http://en.wikipedia.org/wiki/Howden_Ganley": "https://upload.wikimedia.org/wikipedia/commons/b/b6/HowdenGanleyNZFMR2015.jpg", 260 | "http://en.wikipedia.org/wiki/Richard_Robarts": "", 261 | "http://en.wikipedia.org/wiki/Fran%C3%A7ois_Migault": "", 262 | "http://en.wikipedia.org/wiki/Brian_Redman": "https://upload.wikimedia.org/wikipedia/commons/0/01/Brian_Redman_1969_kl.JPG", 263 | "http://en.wikipedia.org/wiki/Tim_Schenken": "https://upload.wikimedia.org/wikipedia/commons/0/07/Tim_Schenken_1971_Hockenheim.JPG", 264 | "http://en.wikipedia.org/wiki/Teddy_Pilette": "https://upload.wikimedia.org/wikipedia/commons/2/23/TeddyPilette1975.jpg", 265 | "http://en.wikipedia.org/wiki/Tom_Bels%C3%B8": "https://upload.wikimedia.org/wikipedia/commons/3/3f/Tom_Belso_1973_%28JOKAMAL3B08-11%29.tif", 266 | "http://en.wikipedia.org/wiki/Rikky_von_Opel": "", 267 | "http://en.wikipedia.org/wiki/Derek_Bell_(auto_racer)": "https://upload.wikimedia.org/wikipedia/commons/6/6a/Derek_Bell_%282356476570%29.jpg", 268 | "http://en.wikipedia.org/wiki/David_Hobbs_(racing_driver)": "https://upload.wikimedia.org/wikipedia/commons/4/4a/David_Hobbs.jpg", 269 | "http://en.wikipedia.org/wiki/Dieter_Quester": "https://upload.wikimedia.org/wikipedia/commons/9/9b/QuesterDieter1973.jpg", 270 | "http://en.wikipedia.org/wiki/Helmuth_Koinigg": "", 271 | "http://en.wikipedia.org/wiki/Fran%C3%A7ois_Cevert": "https://upload.wikimedia.org/wikipedia/commons/d/d4/Francois_Cevert_1973.jpg", 272 | "http://en.wikipedia.org/wiki/Jackie_Stewart": "https://upload.wikimedia.org/wikipedia/commons/4/4b/Jackie_Stewart_at_the_2014_WEC_Silverstone_round.jpg", 273 | "http://en.wikipedia.org/wiki/Peter_Revson": "https://upload.wikimedia.org/wikipedia/commons/7/7a/Peter_Revson_1973_N%C3%BCrburgring_a_%28cropped%29.jpg", 274 | "http://en.wikipedia.org/wiki/Mike_Beuttler": "https://upload.wikimedia.org/wikipedia/commons/4/40/1972_French_Grand_Prix_Beuttler_%285225615113%29.jpg", 275 | "http://en.wikipedia.org/wiki/Nanni_Galli": "https://upload.wikimedia.org/wikipedia/commons/1/17/Nanni_Galli%2C_Alfa_Romeo_33.3%2C_1971-05-29.jpg", 276 | "http://en.wikipedia.org/wiki/Luiz_Bueno": "https://upload.wikimedia.org/wikipedia/commons/e/eb/Correio_da_Manh%C3%A3_AN_191_%28cropped%29.jpg", 277 | "http://en.wikipedia.org/wiki/George_Follmer": "https://upload.wikimedia.org/wikipedia/commons/3/34/George_Follmer_1973.jpg", 278 | "http://en.wikipedia.org/wiki/Andrea_de_Adamich": "https://upload.wikimedia.org/wikipedia/commons/7/75/Andrea_De_Adamich_-_Alfa_Romeo_Giulia_2000_GTAm_%281972_Monza_4_Hours%29.jpg", 279 | "http://en.wikipedia.org/wiki/Helmut_Marko": "https://upload.wikimedia.org/wikipedia/commons/f/fe/Helmut_Marko_Austrian_GP_2016_%28cropped2%29.jpg", 280 | "http://en.wikipedia.org/wiki/David_Walker_(racing_driver)": "https://upload.wikimedia.org/wikipedia/commons/e/e4/David_Walker_1971_Lotus_56_B_Pratt_Whitney.jpg", 281 | "http://en.wikipedia.org/wiki/John_Love_(racing_driver)": "https://upload.wikimedia.org/wikipedia/commons/b/b6/John_Love_Surtees_TS9_2019_Silverstone_Classic_%2848557776041%29.jpg", 282 | "http://en.wikipedia.org/wiki/Peter_Gethin": "https://upload.wikimedia.org/wikipedia/commons/3/3f/Peter_Gethin%2C_Bestanddeelnr_924-6614_%28cropped2%29.jpg", 283 | "http://en.wikipedia.org/wiki/Reine_Wisell": "https://upload.wikimedia.org/wikipedia/commons/d/d1/Reine_Wisell_1970_N%C3%BCrburgring.JPG", 284 | "http://en.wikipedia.org/wiki/Sam_Posey": "https://upload.wikimedia.org/wikipedia/commons/7/72/Speed_tv_f1_panel_ims_stage_2006_%28cropped%29.jpg", 285 | "http://en.wikipedia.org/wiki/Skip_Barber": "", 286 | "http://en.wikipedia.org/wiki/Pedro_Rodr%C3%ADguez_(racing_driver)": "https://upload.wikimedia.org/wikipedia/commons/6/68/Pedro_Rodr%C3%ADguez_1968_N%C3%BCrburgring-1_%28cropped%29.jpg", 287 | "http://en.wikipedia.org/wiki/John_Surtees": "https://upload.wikimedia.org/wikipedia/commons/c/c3/John_Surtees.JPG", 288 | "http://en.wikipedia.org/wiki/Jo_Siffert": "https://upload.wikimedia.org/wikipedia/commons/7/7e/Siffert%2C_Joseph_1968.jpg", 289 | "http://en.wikipedia.org/wiki/Fran%C3%A7ois_Mazet": "", 290 | "http://en.wikipedia.org/wiki/Vic_Elford": "https://upload.wikimedia.org/wikipedia/commons/f/f8/Vic_Elford_Watkins_Glen_2010_%28cropped%29.jpg", 291 | "http://en.wikipedia.org/wiki/Joakim_Bonnier": "https://upload.wikimedia.org/wikipedia/commons/f/f9/BonnierJo196608.jpg", 292 | "http://en.wikipedia.org/wiki/George_Eaton": "", 293 | "http://en.wikipedia.org/wiki/John_Cannon_(auto_racer)": "https://upload.wikimedia.org/wikipedia/commons/b/b8/BRM_P153.jpg", 294 | "http://en.wikipedia.org/wiki/Jack_Brabham": "https://upload.wikimedia.org/wikipedia/commons/e/e7/BrabhamJack1966B.jpg", 295 | "http://en.wikipedia.org/wiki/John_Miles_(auto_racer)": "https://upload.wikimedia.org/wikipedia/commons/3/39/John_Miles_1970_N%C3%BCrburgring.jpg", 296 | "http://en.wikipedia.org/wiki/Peter_de_Klerk": "", 297 | "http://en.wikipedia.org/wiki/Jochen_Rindt": "https://upload.wikimedia.org/wikipedia/commons/c/cb/Rindt_at_1970_Dutch_Grand_Prix_%282C%29.jpg", 298 | "http://en.wikipedia.org/wiki/Bruce_McLaren": "https://upload.wikimedia.org/wikipedia/commons/a/a0/McLarenBruce.jpg", 299 | "http://en.wikipedia.org/wiki/Johnny_Servoz-Gavin": "", 300 | "http://en.wikipedia.org/wiki/Ignazio_Giunti": "", 301 | "http://en.wikipedia.org/wiki/Dan_Gurney": "https://upload.wikimedia.org/wikipedia/commons/b/b8/Dan_Gurney_%281970%29.jpg", 302 | "http://en.wikipedia.org/wiki/Sam_Tingle": "https://upload.wikimedia.org/wikipedia/commons/b/ba/1965_Sam_Tingle_Formula_1_LDS_Race_Car-1_%2829891690293%29.jpg", 303 | "http://en.wikipedia.org/wiki/Piers_Courage": "https://upload.wikimedia.org/wikipedia/commons/3/32/Piers_Courage_1968_N%C3%BCrburgring.JPG", 304 | "http://en.wikipedia.org/wiki/Richard_Attwood": "https://upload.wikimedia.org/wikipedia/commons/4/4f/Richard_Attwood_1968_kl.JPG", 305 | "http://en.wikipedia.org/wiki/Silvio_Moser": "https://upload.wikimedia.org/wikipedia/commons/1/17/SilvioMoser.jpg", 306 | "http://en.wikipedia.org/wiki/Pete_Lovely": "", 307 | "http://en.wikipedia.org/wiki/Jim_Clark": "https://upload.wikimedia.org/wikipedia/commons/4/4f/Jim_Clark_in_1963_%28cropped%29.JPG", 308 | "http://en.wikipedia.org/wiki/Ludovico_Scarfiotti": "https://upload.wikimedia.org/wikipedia/commons/b/b7/Ludivico_Scarfiotti_1966_N%C3%BCrburgring.jpg", 309 | "http://en.wikipedia.org/wiki/Lucien_Bianchi": "https://upload.wikimedia.org/wikipedia/commons/a/ac/BianciLucien_19680802.jpg", 310 | "http://en.wikipedia.org/wiki/Hubert_Hahne": "https://upload.wikimedia.org/wikipedia/commons/a/ae/Hahne%2C_Hubert_-_1968.jpg", 311 | "http://en.wikipedia.org/wiki/Kurt_Ahrens,_Jr.": "https://upload.wikimedia.org/wikipedia/commons/0/03/Bundesarchiv_Bild_183-82487-0008%2C_Internationale_Halle-Saale-Schleife.jpg", 312 | "http://en.wikipedia.org/wiki/Bob_Anderson_(racing_driver)": "", 313 | "http://en.wikipedia.org/wiki/Mike_Spence": "", 314 | "http://en.wikipedia.org/wiki/Mike_Parkes": "https://upload.wikimedia.org/wikipedia/commons/8/86/Mike_Parkes_1969_kl.JPG", 315 | "http://en.wikipedia.org/wiki/Chris_Irwin": "https://upload.wikimedia.org/wikipedia/commons/6/65/Chris_Irwin_1968.JPG", 316 | "http://en.wikipedia.org/wiki/Guy_Ligier": "", 317 | "http://en.wikipedia.org/wiki/Alan_Rees_(racing_driver)": "", 318 | "http://en.wikipedia.org/wiki/Mike_Fisher_(driver)": "", 319 | "http://en.wikipedia.org/wiki/Jonathan_Williams_(racing_driver)": "https://upload.wikimedia.org/wikipedia/commons/5/51/Jonathan_Williams_1966.jpg", 320 | "http://en.wikipedia.org/wiki/Lorenzo_Bandini": "https://upload.wikimedia.org/wikipedia/commons/d/d8/Bandini1966cropped.jpg", 321 | "http://en.wikipedia.org/wiki/Bob_Bondurant": "https://upload.wikimedia.org/wikipedia/commons/c/c1/Bob_Portrait2_sm.jpg", 322 | "http://en.wikipedia.org/wiki/Richie_Ginther": "https://upload.wikimedia.org/wikipedia/commons/5/5b/Richie_Ginther_1966_N%C3%BCrburgring.jpg", 323 | "http://en.wikipedia.org/wiki/John_Taylor_(racer)": "https://upload.wikimedia.org/wikipedia/commons/2/28/John_Taylor_1966.jpg", 324 | "http://en.wikipedia.org/wiki/Chris_Lawrence_(racing_driver)": "", 325 | "http://en.wikipedia.org/wiki/Peter_Arundell": "https://upload.wikimedia.org/wikipedia/commons/e/e3/Peter_Arundell_1968_kl.JPG", 326 | "http://en.wikipedia.org/wiki/Geki_(driver)": "https://upload.wikimedia.org/wikipedia/commons/7/79/Giacomo_Russo_1966.jpg", 327 | "http://en.wikipedia.org/wiki/Ronnie_Bucknum": "https://upload.wikimedia.org/wikipedia/commons/2/2b/Ron_Bucknum_met_zijn_Honda_%281964%29.jpg", 328 | "http://en.wikipedia.org/wiki/Paul_Hawkins_(racing_driver)": "https://upload.wikimedia.org/wikipedia/commons/7/79/Hawkins%2C_Paul_1966.jpg", 329 | "http://en.wikipedia.org/wiki/Tony_Maggs": "", 330 | "http://en.wikipedia.org/wiki/Frank_Gardner_(driver)": "", 331 | "http://en.wikipedia.org/wiki/David_Prophet": "", 332 | "http://en.wikipedia.org/wiki/Innes_Ireland": "https://upload.wikimedia.org/wikipedia/commons/8/8c/Innes_Ireland.jpg", 333 | "http://en.wikipedia.org/wiki/Ian_Raby": "", 334 | "http://en.wikipedia.org/wiki/Masten_Gregory": "https://upload.wikimedia.org/wikipedia/commons/2/2c/GregoryMasten1965.jpg", 335 | "http://en.wikipedia.org/wiki/Nino_Vaccarella": "https://upload.wikimedia.org/wikipedia/commons/b/be/Vaccarella%2C_Nino_1972-07-07.jpg", 336 | "http://en.wikipedia.org/wiki/Roberto_Bussinello": "https://upload.wikimedia.org/wikipedia/commons/d/da/1965-05-09_Targa_Florio_Collesano_Alfa_Romeo_Giulia_TZ2_750112_Bussinello%2BTodaro.jpg", 337 | "http://en.wikipedia.org/wiki/Mois%C3%A9s_Solana": "", 338 | "http://en.wikipedia.org/wiki/Phil_Hill": "https://upload.wikimedia.org/wikipedia/commons/8/84/Phil_Hill_1991_USA_%28cropped%29.jpg", 339 | "http://en.wikipedia.org/wiki/Giancarlo_Baghetti": "https://upload.wikimedia.org/wikipedia/commons/2/21/Giancarlo_Baghetti_a_Monza_-_1962.jpg", 340 | "http://en.wikipedia.org/wiki/Trevor_Taylor": "", 341 | "http://en.wikipedia.org/wiki/Maurice_Trintignant": "https://upload.wikimedia.org/wikipedia/commons/3/35/Maurice_Trintignant_-_El_Gr%C3%A1fico_1801.jpg", 342 | "http://en.wikipedia.org/wiki/Gerhard_Mitter": "https://upload.wikimedia.org/wikipedia/commons/9/91/MitterGerhard1968.jpg", 343 | "http://en.wikipedia.org/wiki/Walt_Hansgen": "", 344 | "http://en.wikipedia.org/wiki/Hap_Sharp": "https://upload.wikimedia.org/wikipedia/commons/f/ff/1967-05-14_Targa_Florio_Collesano_Chaparral_2F_Hill%2BSharp.jpg", 345 | "http://en.wikipedia.org/wiki/Carel_Godin_de_Beaufort": "https://upload.wikimedia.org/wikipedia/commons/f/f5/N._13_at_1962_Dutch_Grand_Prix_%282%29_%28cropped%29.jpg", 346 | "http://en.wikipedia.org/wiki/Tony_Settember": "", 347 | "http://en.wikipedia.org/wiki/Jim_Hall_(race_car_driver)": "https://upload.wikimedia.org/wikipedia/commons/3/37/Jim_Hall_%28racer%29.jpg", 348 | "http://en.wikipedia.org/wiki/John_Campbell-Jones": "", 349 | "http://en.wikipedia.org/wiki/Bernard_Collomb": "", 350 | "http://en.wikipedia.org/wiki/Peter_Broeker": "", 351 | "http://en.wikipedia.org/wiki/Doug_Serrurier": "", 352 | "http://en.wikipedia.org/wiki/Trevor_Blokdyk": "", 353 | "http://en.wikipedia.org/wiki/Brausch_Niemann": "", 354 | "http://en.wikipedia.org/wiki/Jackie_Lewis": "https://upload.wikimedia.org/wikipedia/commons/3/37/Photograph_of_Jackie_Lewis_in_1961.jpg", 355 | "http://en.wikipedia.org/wiki/Willy_Mairesse": "https://upload.wikimedia.org/wikipedia/commons/4/48/Willy_Mairesse.jpg", 356 | "http://en.wikipedia.org/wiki/Ricardo_Rodr%C3%ADguez_(Formula_One)": "https://upload.wikimedia.org/wikipedia/commons/2/28/Rodr%C3%ADguez_at_1962_Dutch_Grand_Prix.jpg", 357 | "http://en.wikipedia.org/wiki/Ian_Burgess": "", 358 | "http://en.wikipedia.org/wiki/Jay_Chamberlain": "", 359 | "http://en.wikipedia.org/wiki/Heini_Walter": "", 360 | "http://en.wikipedia.org/wiki/Roger_Penske": "https://upload.wikimedia.org/wikipedia/commons/5/54/Roger_Penske_2023_%28cropped%29.jpg", 361 | "http://en.wikipedia.org/wiki/Rob_Schroeder": "", 362 | "http://en.wikipedia.org/wiki/Neville_Lederle": "", 363 | "http://en.wikipedia.org/wiki/Bruce_Johnstone_(racing_driver)": "", 364 | "http://en.wikipedia.org/wiki/Ernie_Pieterse": "", 365 | "http://en.wikipedia.org/wiki/Stirling_Moss": "https://upload.wikimedia.org/wikipedia/commons/b/b4/Stirling_Moss.jpg", 366 | "http://en.wikipedia.org/wiki/Wolfgang_Graf_Berghe_von_Trips": "https://upload.wikimedia.org/wikipedia/commons/f/f1/Wolfgang_von_Trips_in_1957.JPG", 367 | "http://en.wikipedia.org/wiki/Cliff_Allison": "https://upload.wikimedia.org/wikipedia/commons/7/7b/J_Crosthwaite_%28with_oily_rag%29_and_Graham_Hill_%28on_left_of_picture%29_with_Lotus.jpg", 368 | "http://en.wikipedia.org/wiki/Hans_Herrmann": "https://upload.wikimedia.org/wikipedia/commons/1/1b/Hans_Herrmann_%282011%29.jpg", 369 | "http://en.wikipedia.org/wiki/Tony_Brooks": "", 370 | "http://en.wikipedia.org/wiki/Olivier_Gendebien": "https://upload.wikimedia.org/wikipedia/commons/1/17/Olivier_Gendebien%2C_1960s.jpg", 371 | "http://en.wikipedia.org/wiki/Roy_Salvadori": "https://upload.wikimedia.org/wikipedia/commons/3/3d/1958-03-22_Sebring_Roy_Salvadori_%28cropped2%29.jpg", 372 | "http://en.wikipedia.org/wiki/Henry_Taylor_(racing_driver)": "https://upload.wikimedia.org/wikipedia/commons/8/86/Henry_Taylor_driving_a_Ford_Cortina_down_the_bobsleigh_run_at_Cortina_d%27Ampezzo.jpg", 373 | "http://en.wikipedia.org/wiki/Michael_May_(racing_driver)": "", 374 | "http://en.wikipedia.org/wiki/Keith_Greene": "", 375 | "http://en.wikipedia.org/wiki/Wolfgang_Seidel": "https://upload.wikimedia.org/wikipedia/commons/0/08/1955-05-01_Mille_Miglia_Porsche_550-15_Seidel_Gl%C3%B6ckler.jpg", 376 | "http://en.wikipedia.org/wiki/Tony_Marsh_(racing_driver)": "", 377 | "http://en.wikipedia.org/wiki/Gerry_Ashmore": "", 378 | "http://en.wikipedia.org/wiki/Tim_Parnell": "", 379 | "http://en.wikipedia.org/wiki/Renato_Pirocchi": "https://upload.wikimedia.org/wikipedia/commons/b/b5/Renato_Pirocchi_-_VII_Gran_Premio_di_Modena_F1_1961.jpg", 380 | "http://en.wikipedia.org/wiki/Peter_Ryan_(driver)": "https://upload.wikimedia.org/wikipedia/commons/9/96/1962-03-24_Sebring_Dino_248_SP_0806_Fulp_Ryan.jpg", 381 | "http://en.wikipedia.org/wiki/Carlos_Menditeguy": "https://upload.wikimedia.org/wikipedia/commons/3/3f/Carlos_Menditeguy_-_El_Gr%C3%A1fico_1805.jpg", 382 | "http://en.wikipedia.org/wiki/Alberto_Rodriguez_Larreta": "https://upload.wikimedia.org/wikipedia/commons/d/dd/Jorge_Rodr%C3%ADguez_Larreta_-_El_Gr%C3%A1fico_2001.jpg", 383 | "http://en.wikipedia.org/wiki/Jos%C3%A9_Froil%C3%A1n_Gonz%C3%A1lez": "https://upload.wikimedia.org/wikipedia/commons/5/51/Jos%C3%A9_Froil%C3%A1n_Gonz%C3%A1lez_1950.jpg", 384 | "http://en.wikipedia.org/wiki/Roberto_Bonomi": "https://upload.wikimedia.org/wikipedia/commons/7/78/Roberto_Bonomi_-_El_Gr%C3%A1fico_1751.jpg", 385 | "http://en.wikipedia.org/wiki/Gino_Munaron": "", 386 | "http://en.wikipedia.org/wiki/Nasif_Est%C3%A9fano": "", 387 | "http://en.wikipedia.org/wiki/Jim_Rathmann": "", 388 | "http://en.wikipedia.org/wiki/Rodger_Ward": "https://upload.wikimedia.org/wikipedia/commons/9/9d/Rodger_Ward_1950.jpg", 389 | "http://en.wikipedia.org/wiki/Paul_Goldsmith": "", 390 | "http://en.wikipedia.org/wiki/Don_Branson": "", 391 | "http://en.wikipedia.org/wiki/Johnny_Thomson": "", 392 | "http://en.wikipedia.org/wiki/Eddie_Johnson_(auto_racer)": "", 393 | "http://en.wikipedia.org/wiki/Lloyd_Ruby": "", 394 | "http://en.wikipedia.org/wiki/Bob_Veith": "", 395 | "http://en.wikipedia.org/wiki/Bud_Tingelstad": "", 396 | "http://en.wikipedia.org/wiki/Bob_Christie_(racing_driver)": "", 397 | "http://en.wikipedia.org/wiki/Red_Amick": "", 398 | "http://en.wikipedia.org/wiki/Duane_Carter": "https://upload.wikimedia.org/wikipedia/commons/8/80/Duane_Carter_at_Soldier_Field_circa_1946.jpg", 399 | "http://en.wikipedia.org/wiki/Bill_Homeier": "", 400 | "http://en.wikipedia.org/wiki/Gene_Hartley": "", 401 | "http://en.wikipedia.org/wiki/Chuck_Stevenson": "https://upload.wikimedia.org/wikipedia/commons/7/72/Chuck_Stevenson_1952cr.jpg", 402 | "http://en.wikipedia.org/wiki/Bobby_Grim": "", 403 | "http://en.wikipedia.org/wiki/Shorty_Templeman": "", 404 | "http://en.wikipedia.org/wiki/Jim_Hurtubise": "https://upload.wikimedia.org/wikipedia/commons/3/39/Jim_Hurtubise.jpg", 405 | "http://en.wikipedia.org/wiki/Jimmy_Bryan": "", 406 | "http://en.wikipedia.org/wiki/Troy_Ruttman": "https://upload.wikimedia.org/wikipedia/commons/8/8b/Troy_Ruttman_1951.jpg", 407 | "http://en.wikipedia.org/wiki/Eddie_Sachs": "", 408 | "http://en.wikipedia.org/wiki/Don_Freeland": "", 409 | "http://en.wikipedia.org/wiki/Tony_Bettenhausen": "https://upload.wikimedia.org/wikipedia/commons/1/15/Tony_Bettenhausen_circa_1952.jpg", 410 | "http://en.wikipedia.org/wiki/Wayne_Weiler": "", 411 | "http://en.wikipedia.org/wiki/A.J._Foyt": "https://upload.wikimedia.org/wikipedia/commons/6/62/AJ_Foyt_at_Foyt_Wine_Vault_-_2015_-_Sarah_Stierch_2.jpg", 412 | "http://en.wikipedia.org/wiki/Eddie_Russo": "", 413 | "http://en.wikipedia.org/wiki/Johnny_Boyd": "", 414 | "http://en.wikipedia.org/wiki/Gene_Force": "", 415 | "http://en.wikipedia.org/wiki/Jim_McWithey": "", 416 | "http://en.wikipedia.org/wiki/Len_Sutton": "", 417 | "http://en.wikipedia.org/wiki/Dick_Rathmann": "https://upload.wikimedia.org/wikipedia/commons/1/1e/Dick_Rathmann_USAC_circa_1957.jpg", 418 | "http://en.wikipedia.org/wiki/Al_Herman": "", 419 | "http://en.wikipedia.org/wiki/Dempsey_Wilson": "", 420 | "http://en.wikipedia.org/wiki/Ron_Flockhart_(auto_racing)": "", 421 | "http://en.wikipedia.org/wiki/Bruce_Halford": "", 422 | "http://en.wikipedia.org/wiki/David_Piper": "", 423 | "http://en.wikipedia.org/wiki/Brian_Naylor": "", 424 | "http://en.wikipedia.org/wiki/Giulio_Cabianca": "https://upload.wikimedia.org/wikipedia/commons/d/d7/Giulio_Cabianca_in_an_OSCA_%28cropped%29.jpg", 425 | "http://en.wikipedia.org/wiki/Edgar_Barth": "https://upload.wikimedia.org/wikipedia/commons/3/3d/Edgar_Barth_podium_Nurburgring_1957.jpg", 426 | "http://en.wikipedia.org/wiki/Piero_Drogo": "https://upload.wikimedia.org/wikipedia/commons/e/e8/1962_ASA_1000_GTC_Drogo_Bizzarini.jpg", 427 | "http://en.wikipedia.org/wiki/Fred_Gamble_(racing_driver)": "https://upload.wikimedia.org/wikipedia/commons/a/a9/Fred_Gamble_-_1961_U.S._National_Championship.png", 428 | "http://en.wikipedia.org/wiki/Chuck_Daigh": "", 429 | "http://en.wikipedia.org/wiki/Bob_Drake_(Formula_One)": "", 430 | "http://en.wikipedia.org/wiki/Paul_Russo": "https://upload.wikimedia.org/wikipedia/commons/8/81/Paul_Russo_1947.jpg", 431 | "http://en.wikipedia.org/wiki/Jimmy_Daywalt": "", 432 | "http://en.wikipedia.org/wiki/Chuck_Arnold": "", 433 | "http://en.wikipedia.org/wiki/Jean_Behra": "https://upload.wikimedia.org/wikipedia/commons/3/3e/Jean_Behra_-_El_Gr%C3%A1fico_1953.jpg", 434 | "http://en.wikipedia.org/wiki/Harry_Schell": "", 435 | "http://en.wikipedia.org/wiki/Giorgio_Scarlatti": "https://upload.wikimedia.org/wikipedia/commons/9/9e/1957-08-18_Pescara_GP_Maserati_250_Scarlatti.jpg", 436 | "http://en.wikipedia.org/wiki/Fritz_d%27Orey": "", 437 | "http://en.wikipedia.org/wiki/Alan_Stacey": "https://upload.wikimedia.org/wikipedia/commons/3/39/Alan_Stacey_1960.jpg", 438 | "http://en.wikipedia.org/wiki/Chris_Bristow": "", 439 | "http://en.wikipedia.org/wiki/Peter_Ashdown": "https://upload.wikimedia.org/wikipedia/commons/f/f0/1956-08-26_Karlskoga_WINNER_Lotus_IX_Ashdown.jpg", 440 | "http://en.wikipedia.org/wiki/Ivor_Bueb": "", 441 | "http://en.wikipedia.org/wiki/Carroll_Shelby": "https://upload.wikimedia.org/wikipedia/commons/1/13/CarrollShelbyVIR2007.jpg", 442 | "http://en.wikipedia.org/wiki/Mario_de_Araujo_Cabral": "", 443 | "http://en.wikipedia.org/wiki/Colin_Davis_(driver)": "", 444 | "http://en.wikipedia.org/wiki/Harry_Blanchard": "", 445 | "http://en.wikipedia.org/wiki/Luigi_Musso": "https://upload.wikimedia.org/wikipedia/commons/8/8b/Luigi_Musso.jpg", 446 | "http://en.wikipedia.org/wiki/Mike_Hawthorn": "", 447 | "http://en.wikipedia.org/wiki/Juan_Manuel_Fangio": "https://upload.wikimedia.org/wikipedia/commons/2/20/Fangio_in_1955_%28cropped%29.jpg", 448 | "http://en.wikipedia.org/wiki/Paco_Godia": "", 449 | "http://en.wikipedia.org/wiki/Horace_Gould": "", 450 | "http://en.wikipedia.org/wiki/Peter_Collins_(racing_driver)": "", 451 | "http://en.wikipedia.org/wiki/George_Amick": "", 452 | "http://en.wikipedia.org/wiki/Jimmy_Reece": "", 453 | "http://en.wikipedia.org/wiki/Jud_Larson": "", 454 | "http://en.wikipedia.org/wiki/Bill_Cheesbourg": "", 455 | "http://en.wikipedia.org/wiki/Al_Keller": "", 456 | "http://en.wikipedia.org/wiki/Johnnie_Parsons": "https://upload.wikimedia.org/wikipedia/commons/a/a8/Johnnie_Parsons_USAC_circa_1957.jpg", 457 | "http://en.wikipedia.org/wiki/Johnnie_Tolan": "https://upload.wikimedia.org/wikipedia/commons/2/28/Johnnie_Tolan_1950_%28cropped%29.jpg", 458 | "http://en.wikipedia.org/wiki/Stuart_Lewis-Evans": "", 459 | "http://en.wikipedia.org/wiki/Maria_Teresa_de_Filippis": "https://upload.wikimedia.org/wikipedia/commons/8/88/Maria_Teresa_de_Filippis_%28cropped%29.jpg", 460 | "http://en.wikipedia.org/wiki/Gerino_Gerini_(racing_driver)": "", 461 | "http://en.wikipedia.org/wiki/Jack_Fairman": "", 462 | "http://en.wikipedia.org/wiki/Robert_La_Caze": "", 463 | "http://en.wikipedia.org/wiki/Andr%C3%A9_Guelfi": "https://upload.wikimedia.org/wikipedia/commons/5/50/Comit%C3%A9_d%27organisation_du_Grand_Prix_d%27Agadir%2C_1953_%28Andr%C3%A9_Guelfi%29.jpg", 464 | "http://en.wikipedia.org/wiki/Alfonso_de_Portago": "https://upload.wikimedia.org/wikipedia/commons/1/16/Alfonso%2C_Marquess_of_Portago.jpg", 465 | "http://en.wikipedia.org/wiki/Cesare_Perdisa": "", 466 | "http://en.wikipedia.org/wiki/Alessandro_de_Tomaso": "https://upload.wikimedia.org/wikipedia/commons/9/95/Alejandro_detomaso.jpg", 467 | "http://en.wikipedia.org/wiki/Luigi_Piotti": "", 468 | "http://en.wikipedia.org/wiki/Sam_Hanks": "https://upload.wikimedia.org/wikipedia/commons/4/4c/Sam_Hanks_USAC_circa_1957.jpg", 469 | "http://en.wikipedia.org/wiki/Andy_Linden_(racing_driver)": "", 470 | "http://en.wikipedia.org/wiki/Marshall_Teague_(racing_driver)": "https://upload.wikimedia.org/wikipedia/commons/4/49/Marshall_Teague_USAC_circa_1957.jpg", 471 | "http://en.wikipedia.org/wiki/Pat_O%27Connor_(auto_racer)": "", 472 | "http://en.wikipedia.org/wiki/Jack_Turner_(driver)": "", 473 | "http://en.wikipedia.org/wiki/Chuck_Weyant": "", 474 | "http://en.wikipedia.org/wiki/Mike_MacDowel": "", 475 | "http://en.wikipedia.org/wiki/Bob_Gerard": "", 476 | "http://en.wikipedia.org/wiki/Andr%C3%A9_Simon_(racing_driver)": "", 477 | "http://en.wikipedia.org/wiki/Ottorino_Volonterio": "", 478 | "http://en.wikipedia.org/wiki/Chico_Landi": "", 479 | "http://en.wikipedia.org/wiki/Alberto_Uria": "", 480 | "http://en.wikipedia.org/wiki/%C3%93scar_Gonz%C3%A1lez_(racing_driver)": "", 481 | "http://en.wikipedia.org/wiki/Eugenio_Castellotti": "https://upload.wikimedia.org/wikipedia/commons/7/75/Eugenio_Castellotti.jpg", 482 | "http://en.wikipedia.org/wiki/Hernando_da_Silva_Ramos": "", 483 | "http://en.wikipedia.org/wiki/%C3%89lie_Bayol": "", 484 | "http://en.wikipedia.org/wiki/Andr%C3%A9_Pilette": "", 485 | "http://en.wikipedia.org/wiki/Pat_Flaherty_(racing_driver)": "", 486 | "http://en.wikipedia.org/wiki/Bob_Sweikert": "https://upload.wikimedia.org/wikipedia/commons/4/4e/Bob_Sweikert.jpg", 487 | "http://en.wikipedia.org/wiki/Cliff_Griffith": "", 488 | "http://en.wikipedia.org/wiki/Fred_Agabashian": "https://upload.wikimedia.org/wikipedia/commons/8/85/Fred_Agabashian_1953_%28cropped%29.jpg", 489 | "http://en.wikipedia.org/wiki/Billy_Garrett": "", 490 | "http://en.wikipedia.org/wiki/Duke_Dinsmore": "", 491 | "http://en.wikipedia.org/wiki/Paul_Fr%C3%A8re": "https://upload.wikimedia.org/wikipedia/commons/5/56/2003-04-26_Paul_Fr%C3%A8re_Cfs.JPG", 492 | "http://en.wikipedia.org/wiki/Luigi_Villoresi": "https://upload.wikimedia.org/wikipedia/commons/d/dd/Luis_Villoresi_-_El_Gr%C3%A1fico_1442.jpg", 493 | "http://en.wikipedia.org/wiki/Louis_Rosier": "", 494 | "http://en.wikipedia.org/wiki/Robert_Manzon": "", 495 | "http://en.wikipedia.org/wiki/Toulo_de_Graffenried": "https://upload.wikimedia.org/wikipedia/commons/7/77/Toulo_de_Graffenried.gif", 496 | "http://en.wikipedia.org/wiki/Nino_Farina": "https://upload.wikimedia.org/wikipedia/commons/d/d0/Giuseppe_Farina_-_El_Gr%C3%A1fico_1750.jpg", 497 | "http://en.wikipedia.org/wiki/Umberto_Maglioli": "https://upload.wikimedia.org/wikipedia/commons/4/41/Umberto_Maglioli.jpg", 498 | "http://en.wikipedia.org/wiki/Karl_Kling": "https://upload.wikimedia.org/wikipedia/commons/a/ad/Karl_Kling_El_Gr%C3%A1fico.jpg", 499 | "http://en.wikipedia.org/wiki/Roberto_Mieres": "https://upload.wikimedia.org/wikipedia/commons/2/23/Roberto_Mieres_-_El_Gr%C3%A1fico_1770.jpg", 500 | "http://en.wikipedia.org/wiki/Sergio_Mantovani": "https://upload.wikimedia.org/wikipedia/commons/4/44/SergioMantovani-AlfaRomeo.png", 501 | "http://en.wikipedia.org/wiki/Louis_Chiron": "https://upload.wikimedia.org/wikipedia/commons/d/d8/Louis_Chiron_1931bw.jpg", 502 | "http://en.wikipedia.org/wiki/Jacques_Pollet": "", 503 | "http://en.wikipedia.org/wiki/Piero_Taruffi": "https://upload.wikimedia.org/wikipedia/commons/8/8e/Piero_Taruffi.jpg", 504 | "http://en.wikipedia.org/wiki/Jimmy_Davies": "", 505 | "http://en.wikipedia.org/wiki/Walt_Faulkner": "https://upload.wikimedia.org/wikipedia/commons/2/2b/Walt_Faulkner_circa_1948.jpg", 506 | "http://en.wikipedia.org/wiki/Johnny_Claes": "https://upload.wikimedia.org/wikipedia/commons/8/84/Talbot_F1_vr_yellow_EMS.jpg", 507 | "http://en.wikipedia.org/wiki/Mike_Sparken": "https://upload.wikimedia.org/wikipedia/commons/1/16/1955-02-27_Agadir_WINNER_Ferrari_750_0504M_Mike_Sparken.jpg", 508 | "http://en.wikipedia.org/wiki/Lance_Macklin": "", 509 | "http://en.wikipedia.org/wiki/Ken_Wharton": "", 510 | "http://en.wikipedia.org/wiki/John_Fitch_(driver)": "", 511 | "http://en.wikipedia.org/wiki/Prince_Bira": "https://upload.wikimedia.org/wikipedia/commons/d/dc/Air_cadets_learn_the_basics_of_flight_at_RNAS_St_Merryn_in_Cornwall%2C_February_1944._A22064-croponBirabongse_Bhanudej.jpg", 512 | "http://en.wikipedia.org/wiki/Bill_Vukovich": "https://upload.wikimedia.org/wikipedia/commons/c/c3/Bill_Vukovich_1951.jpg", 513 | "http://en.wikipedia.org/wiki/Jack_McGrath_(racing_driver)": "https://upload.wikimedia.org/wikipedia/commons/4/44/Jack_McGrath_1951.jpg", 514 | "http://en.wikipedia.org/wiki/Mike_Nazaruk": "", 515 | "http://en.wikipedia.org/wiki/Jerry_Hoyt": "", 516 | "http://en.wikipedia.org/wiki/Larry_Crockett": "", 517 | "http://en.wikipedia.org/wiki/Cal_Niday": "", 518 | "http://en.wikipedia.org/wiki/Art_Cross": "", 519 | "http://en.wikipedia.org/wiki/Manny_Ayulo": "https://upload.wikimedia.org/wikipedia/commons/a/ae/Manny_Ayulo_1953.jpg", 520 | "http://en.wikipedia.org/wiki/Jimmy_Jackson_(driver)": "", 521 | "http://en.wikipedia.org/wiki/Ernie_McCoy": "", 522 | "http://en.wikipedia.org/wiki/Ed_Elisian": "", 523 | "http://en.wikipedia.org/wiki/Bob_Scott_(auto_racer)": "https://upload.wikimedia.org/wikipedia/commons/7/77/Bob_Scott_1954.jpg", 524 | "http://en.wikipedia.org/wiki/Frank_Armi": "", 525 | "http://en.wikipedia.org/wiki/George_Fonder": "", 526 | "http://en.wikipedia.org/wiki/Onofre_Marim%C3%B3n": "https://upload.wikimedia.org/wikipedia/commons/1/19/Onofre_Marim%C3%B3n_-_El_Gr%C3%A1fico_1708.jpg", 527 | "http://en.wikipedia.org/wiki/Don_Beauman": "", 528 | "http://en.wikipedia.org/wiki/Leslie_Marr": "https://upload.wikimedia.org/wikipedia/commons/9/9f/Leslie_Marr_with_painting_2019_%28cropped%29.jpg", 529 | "http://en.wikipedia.org/wiki/Leslie_Thorne": "", 530 | "http://en.wikipedia.org/wiki/Jacques_Swaters": "https://upload.wikimedia.org/wikipedia/commons/5/5f/Jacques_Swaters_1980.jpg", 531 | "http://en.wikipedia.org/wiki/Fred_Wacker": "https://upload.wikimedia.org/wikipedia/commons/1/19/Cunningham_C2-R_no_5103%2C_front_right_%28Greenwich_2018%29.jpg", 532 | "http://en.wikipedia.org/wiki/Jorge_Daponte": "", 533 | "http://en.wikipedia.org/wiki/Alberto_Ascari": "https://upload.wikimedia.org/wikipedia/commons/6/69/Ascari_last_photo_in_car.jpg", 534 | "http://en.wikipedia.org/wiki/%C3%93scar_Alfredo_G%C3%A1lvez": "https://upload.wikimedia.org/wikipedia/commons/3/3f/Oscar_Alfredo_G%C3%A1lvez.jpg", 535 | "http://en.wikipedia.org/wiki/John_Barber_(racing_driver)": "", 536 | "http://en.wikipedia.org/wiki/Alan_Brown_(racing_driver)": "", 537 | "http://en.wikipedia.org/wiki/Duke_Nalon": "https://upload.wikimedia.org/wikipedia/commons/9/95/Duke_Nalon_1946.jpg", 538 | "http://en.wikipedia.org/wiki/Carl_Scarborough": "", 539 | "http://en.wikipedia.org/wiki/Bill_Holland": "https://upload.wikimedia.org/wikipedia/commons/8/86/Bill_Holland_and_Linda_Darnell_1949_Indianapolis_500_%28cropped%29.jpg", 540 | "http://en.wikipedia.org/wiki/Johnny_Mantz": "https://upload.wikimedia.org/wikipedia/commons/b/b7/Johnny_Mantz_USAC_circa_1957.jpg", 541 | "http://en.wikipedia.org/wiki/Felice_Bonetto": "https://upload.wikimedia.org/wikipedia/commons/d/d4/Portrait_of_Felice_Bonetto_%28cropped%29.jpg", 542 | "http://en.wikipedia.org/wiki/Yves_Giraud_Cabantous": "https://upload.wikimedia.org/wikipedia/commons/b/b1/Yves_Giraud-Cabantous_vainqueur_du_Championnat_automobile_des_Aviateurs%2C_en_juin_1929_%28et_madame%29.jpg", 543 | "http://en.wikipedia.org/wiki/Peter_Whitehead_(racing_driver)": "https://upload.wikimedia.org/wikipedia/commons/3/38/ERA_of_Peter_Whitehead%2C_1938_AGP.jpg", 544 | "http://en.wikipedia.org/wiki/Rodney_Nuckey": "", 545 | "http://en.wikipedia.org/wiki/Theo_Helfrich": "https://upload.wikimedia.org/wikipedia/commons/2/20/Fotothek_df_roe-neg_0006640_013_Portrait_eines_Automobilrennfahrers_in_seinem_Wa.jpg", 546 | "http://en.wikipedia.org/wiki/Kenneth_McAlpine": "", 547 | "http://en.wikipedia.org/wiki/Rudolf_Krause": "", 548 | "http://en.wikipedia.org/wiki/Ernst_Klodwig": "https://upload.wikimedia.org/wikipedia/commons/0/05/Klodwig-BMW.jpg", 549 | "http://en.wikipedia.org/wiki/Hermann_Lang": "https://upload.wikimedia.org/wikipedia/commons/5/5b/Hermann_Lang_El_Gr%C3%A1fico.jpg", 550 | "http://en.wikipedia.org/wiki/Max_de_Terra": "", 551 | "http://en.wikipedia.org/wiki/Albert_Scherrer": "", 552 | "http://en.wikipedia.org/wiki/Hans_Von_Stuck": "https://upload.wikimedia.org/wikipedia/commons/6/63/Bundesarchiv_Bild_102-08188%2C_Hans_von_Stuck.jpg", 553 | "http://en.wikipedia.org/wiki/Rudi_Fischer": "", 554 | "http://en.wikipedia.org/wiki/Peter_Hirt": "", 555 | "http://en.wikipedia.org/wiki/Eric_Brandon": "", 556 | "http://en.wikipedia.org/wiki/George_Connor_(driver)": "https://upload.wikimedia.org/wikipedia/commons/8/80/George_Connor_1933.jpg", 557 | "http://en.wikipedia.org/wiki/Jim_Rigsby": "", 558 | "http://en.wikipedia.org/wiki/Joe_James_(racing_driver)": "https://upload.wikimedia.org/wikipedia/commons/4/49/Joe_James_qualifies_for_the_1951_Indy_500.jpg", 559 | "http://en.wikipedia.org/wiki/Bill_Schindler": "", 560 | "http://en.wikipedia.org/wiki/Henry_Banks": "https://upload.wikimedia.org/wikipedia/commons/3/38/Henry_Banks_1951_%283%29.jpg", 561 | "http://en.wikipedia.org/wiki/Johnny_McDowell": "", 562 | "http://en.wikipedia.org/wiki/Charles_de_Tornaco": "", 563 | "http://en.wikipedia.org/wiki/Roger_Laurent": "https://upload.wikimedia.org/wikipedia/commons/3/32/Ecosse_and_Francorchamps_Jaguar_C-types_Zandvoort_1954_crop.jpg", 564 | "http://en.wikipedia.org/wiki/Arthur_Legat": "", 565 | "http://en.wikipedia.org/wiki/Robert_O%27Brien_(auto_racer)": "", 566 | "http://en.wikipedia.org/wiki/Tony_Gaze": "", 567 | "http://en.wikipedia.org/wiki/Philippe_%C3%89tancelin": "https://upload.wikimedia.org/wikipedia/commons/2/2a/Philippe_%C3%89tancelin_at_the_1933_Grand_Prix_de_la_Marne_%28cropped%29.jpg", 568 | "http://en.wikipedia.org/wiki/Franco_Comotti": "", 569 | "http://en.wikipedia.org/wiki/Dennis_Poore": "", 570 | "http://en.wikipedia.org/wiki/Eric_Thompson_(racing_driver)": "", 571 | "http://en.wikipedia.org/wiki/Reg_Parnell": "https://upload.wikimedia.org/wikipedia/commons/7/72/Autoraces_te_Zandvoort%2C_Bestanddeelnr_902-9002.jpg", 572 | "http://en.wikipedia.org/wiki/Ken_Downing": "https://upload.wikimedia.org/wikipedia/commons/8/89/Ken_Downing_cropped.jpg", 573 | "http://en.wikipedia.org/wiki/Graham_Whitehead": "", 574 | "http://en.wikipedia.org/wiki/Gino_Bianco": "https://upload.wikimedia.org/wikipedia/commons/4/43/Gino_Bianco_%281949%29.jpg", 575 | "http://en.wikipedia.org/wiki/Tony_Crook": "", 576 | "http://en.wikipedia.org/wiki/Fritz_Riess": "https://upload.wikimedia.org/wikipedia/commons/4/48/Fritz_Rie%C3%9F.jpg", 577 | "http://en.wikipedia.org/wiki/Toni_Ulmen": "", 578 | "http://en.wikipedia.org/wiki/Helmut_Niedermayr": "", 579 | "http://en.wikipedia.org/wiki/Hans_Klenk": "", 580 | "http://en.wikipedia.org/wiki/Duncan_Hamilton_(racing_driver)": "", 581 | "http://en.wikipedia.org/wiki/Jan_Flinterman": "https://upload.wikimedia.org/wikipedia/commons/f/f1/Majoor_Flinterman%2C_Bestanddeelnr_903-5819.jpg", 582 | "http://en.wikipedia.org/wiki/Eitel_Cantoni": "", 583 | "http://en.wikipedia.org/wiki/Consalvo_Sanesi": "https://upload.wikimedia.org/wikipedia/commons/e/ee/Consalvo_Sanesi.jpg", 584 | "http://en.wikipedia.org/wiki/Guy_Mairesse": "https://upload.wikimedia.org/wikipedia/commons/1/11/Guymairesse.jpg", 585 | "http://en.wikipedia.org/wiki/Lee_Wallard": "https://upload.wikimedia.org/wikipedia/commons/3/3a/Leewallard.jpg", 586 | "http://en.wikipedia.org/wiki/Bobby_Ball_(auto_racer)": "", 587 | "http://en.wikipedia.org/wiki/Carl_Forberg": "", 588 | "http://en.wikipedia.org/wiki/Pierre_Levegh": "", 589 | "http://en.wikipedia.org/wiki/Luigi_Fagioli": "https://upload.wikimedia.org/wikipedia/commons/b/b3/Luigi_Fagioli_in_his_Maserati_at_the_1932_Targa_Florio_%28cropped%29.jpg", 590 | "http://en.wikipedia.org/wiki/Eug%C3%A8ne_Chaboud": "https://upload.wikimedia.org/wikipedia/commons/7/75/Eug%C3%A8ne_Chaboud%2C_vainqueur_des_24_heures_du_Mans_1938.jpg", 591 | "http://en.wikipedia.org/wiki/Peter_Walker_(driver)": "", 592 | "http://en.wikipedia.org/wiki/Brian_Shawe_Taylor": "", 593 | "http://en.wikipedia.org/wiki/Franco_Rol": "", 594 | "http://en.wikipedia.org/wiki/Cuth_Harrison": "", 595 | "http://en.wikipedia.org/wiki/David_Hampshire": "", 596 | "http://en.wikipedia.org/wiki/Joe_Fry": "", 597 | "http://en.wikipedia.org/wiki/Raymond_Sommer": "https://upload.wikimedia.org/wikipedia/commons/f/f9/Raymond_Sommer_1932.jpg", 598 | "http://en.wikipedia.org/wiki/Mauri_Rose": "", 599 | "http://en.wikipedia.org/wiki/Cecil_Green": "", 600 | "http://en.wikipedia.org/wiki/Joie_Chitwood": "", 601 | "http://en.wikipedia.org/wiki/Myron_Fohr": "https://upload.wikimedia.org/wikipedia/commons/6/60/Myron_Fohr_%28circa_1946%29_%281%29.jpg", 602 | "http://en.wikipedia.org/wiki/Mack_Hellings": "https://upload.wikimedia.org/wikipedia/commons/e/ec/Mack_Hellings_1951.jpg", 603 | "http://en.wikipedia.org/wiki/Walt_Brown_(auto_racer)": "", 604 | "http://en.wikipedia.org/wiki/Travis_Webb": "", 605 | "http://en.wikipedia.org/wiki/Walt_Ader": "", 606 | "http://en.wikipedia.org/wiki/Jackie_Holmes": "", 607 | "http://en.wikipedia.org/wiki/Nello_Pagani": "https://upload.wikimedia.org/wikipedia/commons/b/b2/Nello_Pagani_wordt_gefeliciteerd_door_G._J._Bruinsman%2C_voorzitter_KNMV%2C_Bestanddeelnr_903-4797.jpg", 608 | "http://en.wikipedia.org/wiki/Toni_Branca": "", 609 | "http://en.wikipedia.org/wiki/Geoff_Crossley": "", 610 | "http://en.wikipedia.org/wiki/Charles_Pozzi": "", 611 | "http://en.wikipedia.org/wiki/Dorino_Serafini": "https://upload.wikimedia.org/wikipedia/commons/c/c3/Serafini_1936.jpg", 612 | "http://en.wikipedia.org/wiki/Paul_di_Resta": "https://upload.wikimedia.org/wikipedia/commons/a/a2/2014_DTM_HockenheimringII_Paul_di_Resta_by_2eight_8SC5384_%28cropped2%29.jpg", 613 | "http://en.wikipedia.org/wiki/J%C3%A9r%C3%B4me_d%27Ambrosio": "https://upload.wikimedia.org/wikipedia/commons/4/41/DAmbrosioBerlin_%28cropped%29.jpg", 614 | "http://en.wikipedia.org/wiki/Sergio_P%C3%A9rez": "https://upload.wikimedia.org/wikipedia/commons/7/7a/Sergio_P%C3%A9rez_2019_%28cropped%29.jpg", 615 | "http://en.wikipedia.org/wiki/Pastor_Maldonado": "https://upload.wikimedia.org/wikipedia/commons/8/84/Pastor_Maldonado_2011_Malaysia.jpg", 616 | "http://en.wikipedia.org/wiki/Daniel_Ricciardo": "https://upload.wikimedia.org/wikipedia/commons/9/96/F12019_Schloss_Gabelhofen_%2818%29.jpg", 617 | "http://en.wikipedia.org/wiki/Jean-%C3%89ric_Vergne": "https://upload.wikimedia.org/wikipedia/commons/7/70/Jean-Eric_Vergne_2024_WEC_Fuji.jpg", 618 | "http://en.wikipedia.org/wiki/Charles_Pic": "https://upload.wikimedia.org/wikipedia/commons/e/ef/Charles_Pic_Moscow_2013.jpg", 619 | "http://en.wikipedia.org/wiki/Esteban_Guti%C3%A9rrez": "https://upload.wikimedia.org/wikipedia/commons/d/df/Esteban_Guti%C3%A9rrez_en_el_Gran_Premio_de_Italia_2019_%28cropped%29.jpg", 620 | "http://en.wikipedia.org/wiki/Valtteri_Bottas": "https://upload.wikimedia.org/wikipedia/commons/5/5f/Valtteri_Bottas_at_the_2022_Austrian_Grand_Prix.jpg", 621 | "http://en.wikipedia.org/wiki/Jules_Bianchi": "https://upload.wikimedia.org/wikipedia/commons/0/03/Jules_Bianchi_2012-1.JPG", 622 | "http://en.wikipedia.org/wiki/Max_Chilton": "https://upload.wikimedia.org/wikipedia/commons/f/f8/Max_Chilton_2.jpg", 623 | "http://en.wikipedia.org/wiki/Giedo_van_der_Garde": "https://upload.wikimedia.org/wikipedia/commons/b/b7/Giedo_van_der_Garde.jpg", 624 | "http://en.wikipedia.org/wiki/Kevin_Magnussen": "https://upload.wikimedia.org/wikipedia/commons/6/63/Kevin_Magnussen%2C_2019_Formula_One_Tests_Barcelona_%28cropped%29.jpg", 625 | "http://en.wikipedia.org/wiki/Daniil_Kvyat": "https://upload.wikimedia.org/wikipedia/commons/b/b1/Daniil_Kvyat_2024_Suzuka_A2RL.jpg", 626 | "http://en.wikipedia.org/wiki/Marcus_Ericsson": "https://upload.wikimedia.org/wikipedia/commons/8/87/Marcus_Ericsson_in_2023.jpg", 627 | "http://en.wikipedia.org/wiki/Will_Stevens": "https://upload.wikimedia.org/wikipedia/commons/c/c5/Will_Stevens_2017.jpg", 628 | "http://en.wikipedia.org/wiki/Felipe_Nasr": "https://upload.wikimedia.org/wikipedia/commons/c/c8/Piloto_Felipe_Nasr_fala_%C3%A0_imprensa_ap%C3%B3s_encontro_com_Temer_%2828412246304%29_%28cropped%29.jpg", 629 | "http://en.wikipedia.org/wiki/Carlos_Sainz_Jr.": "https://upload.wikimedia.org/wikipedia/commons/c/ce/Formula1Gabelhofen2022_%2804%29_%28cropped2%29.jpg", 630 | "http://en.wikipedia.org/wiki/Max_Verstappen": "https://upload.wikimedia.org/wikipedia/commons/5/52/2024-08-25_Motorsport%2C_Formel_1%2C_Gro%C3%9Fer_Preis_der_Niederlande_2024_STP_3973_by_Stepro_%28medium_crop%29.jpg", 631 | "http://en.wikipedia.org/wiki/Roberto_Merhi": "https://upload.wikimedia.org/wikipedia/commons/3/34/Merhi_Jakarta.jpg", 632 | "http://en.wikipedia.org/wiki/Alexander_Rossi_%28racing_driver%29": "https://upload.wikimedia.org/wikipedia/commons/4/45/Andretti_Autosport_Visit_180405-F-KS667-0012_%28cropped%29.jpg", 633 | "http://en.wikipedia.org/wiki/Jolyon_Palmer": "https://upload.wikimedia.org/wikipedia/commons/6/6c/Jolyon_Palmer_2016_Malaysia.jpg", 634 | "http://en.wikipedia.org/wiki/Pascal_Wehrlein": "https://upload.wikimedia.org/wikipedia/commons/0/0b/2024-05-10_Motorsport%2C_ABB_FIA_Formula_E_World_Championship%2C_Berlin_E-Prix_2024_STP_2554_by_Stepro.jpg", 635 | "http://en.wikipedia.org/wiki/Stoffel_Vandoorne": "https://upload.wikimedia.org/wikipedia/commons/c/c6/2023-04-23_Motorsport%2C_ABB_FIA_Formula_E_World_Championship%2C_Berlin_E-Prix_2023_1DX_1774_by_Stepro_%28cropped%29.jpg", 636 | "http://en.wikipedia.org/wiki/Rio_Haryanto": "https://upload.wikimedia.org/wikipedia/commons/6/6a/Rio_Haryanto_2016_paddock.jpg", 637 | "http://en.wikipedia.org/wiki/Esteban_Ocon": "https://upload.wikimedia.org/wikipedia/commons/e/e8/FIA_F1_Austria_2022_Drivers_Parade_%281%29_%28cropped%29.jpg", 638 | "http://en.wikipedia.org/wiki/Antonio_Giovinazzi": "https://upload.wikimedia.org/wikipedia/commons/9/91/Antonio_Giovinazzi_-_Ferrari_499P_-_Hybrid_during_the_pitwalk_at_the_2023_Le_Mans_%2853468237574%29.jpg", 639 | "http://en.wikipedia.org/wiki/Lance_Stroll": "https://upload.wikimedia.org/wikipedia/commons/a/a4/FIA_F1_Austria_2022_Lance_Stroll_%28cropped_2%29.jpg", 640 | "http://en.wikipedia.org/wiki/Pierre_Gasly": "https://upload.wikimedia.org/wikipedia/commons/f/fd/2022_French_Grand_Prix_%2852279065728%29_%28midcrop%29.png", 641 | "http://en.wikipedia.org/wiki/Brendon_Hartley": "https://upload.wikimedia.org/wikipedia/commons/c/ca/Brendon_Hartley_2024_WEC_Fuji.jpg", 642 | "http://en.wikipedia.org/wiki/Charles_Leclerc": "https://upload.wikimedia.org/wikipedia/commons/7/7b/2024-08-25_Motorsport%2C_Formel_1%2C_Gro%C3%9Fer_Preis_der_Niederlande_2024_STP_3978_by_Stepro_%28cropped2%29.jpg", 643 | "http://en.wikipedia.org/wiki/Sergey_Sirotkin_(racing_driver)": "https://upload.wikimedia.org/wikipedia/commons/f/fa/Sergey_Sirotkin_Moscow.jpg", 644 | "http://en.wikipedia.org/wiki/Lando_Norris": "https://upload.wikimedia.org/wikipedia/commons/a/ac/2024-08-25_Motorsport%2C_Formel_1%2C_Gro%C3%9Fer_Preis_der_Niederlande_2024_STP_3975_by_Stepro_%28cropped2%29.jpg", 645 | "http://en.wikipedia.org/wiki/Alexander_Albon": "https://upload.wikimedia.org/wikipedia/commons/c/c1/Alex_Albon_%28cropped%29.jpg", 646 | "http://en.wikipedia.org/wiki/George_Russell_(racing_driver)": "https://upload.wikimedia.org/wikipedia/commons/f/ff/George_Russell%2C_British_GP_2022_%2852381430692%29_%28cropped%29.jpg", 647 | "http://en.wikipedia.org/wiki/Nicholas_Latifi": "https://upload.wikimedia.org/wikipedia/commons/5/58/Nicholas_Latifi_at_Singapore_in_2022_%28cropped%29.jpg", 648 | "http://en.wikipedia.org/wiki/Jack_Aitken": "https://upload.wikimedia.org/wikipedia/commons/4/42/2023-05-27_Motorsport%2C_DTM%2C_Oschersleben_1DX_4952_by_Stepro_%28cropped%29.jpg", 649 | "http://en.wikipedia.org/wiki/Pietro_Fittipaldi": "https://upload.wikimedia.org/wikipedia/commons/e/ec/Pietro_and_Enzo_Fittipaldi_%28cropped2%29.jpg", 650 | "http://en.wikipedia.org/wiki/Yuki_Tsunoda": "https://upload.wikimedia.org/wikipedia/commons/e/eb/2021_US_GP%2C_Tsunoda.jpg", 651 | "http://en.wikipedia.org/wiki/Mick_Schumacher": "https://upload.wikimedia.org/wikipedia/commons/9/9e/Mick_Schumacher_2024_WEC_Fuji.jpg", 652 | "http://en.wikipedia.org/wiki/Nikita_Mazepin": "https://upload.wikimedia.org/wikipedia/commons/e/e8/%D0%9D%D0%B8%D0%BA%D0%B8%D1%82%D0%B0_%D0%9C%D0%B0%D0%B7%D0%B5%D0%BF%D0%B8%D0%BD_-_%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%B2%D1%8C%D1%8E_-_2019%2C_02.jpg", 653 | "http://en.wikipedia.org/wiki/Zhou_Guanyu": "https://upload.wikimedia.org/wikipedia/commons/e/ed/Zhou_Guanyu_at_the_2022_Austrian_Grand_Prix.jpg", 654 | "http://en.wikipedia.org/wiki/Nyck_de_Vries": "https://upload.wikimedia.org/wikipedia/commons/2/2e/Nyck_de_Vries_2024_SF_Motegi.jpg", 655 | "http://en.wikipedia.org/wiki/Logan_Sargeant": "https://upload.wikimedia.org/wikipedia/commons/0/02/Logan_Sargeant_NYC_%28cropped%29.jpg", 656 | "http://en.wikipedia.org/wiki/Oscar_Piastri": "https://upload.wikimedia.org/wikipedia/commons/6/64/Oscar_Piastri.png", 657 | "http://en.wikipedia.org/wiki/Liam_Lawson": "https://upload.wikimedia.org/wikipedia/commons/5/5e/Liam_Lawson_Austria_2022.jpg", 658 | "http://en.wikipedia.org/wiki/Oliver_Bearman": "https://upload.wikimedia.org/wikipedia/commons/c/ca/Ollie_Bearman_Austria_2022.jpg", 659 | "http://en.wikipedia.org/wiki/Franco_Colapinto": "https://upload.wikimedia.org/wikipedia/commons/7/79/Conferencia_de_prensa_Colapinto_ACA_octubre_2023_-_BugWarp_%2813%29_%28cropped%29.jpg", 660 | "http://en.wikipedia.org/wiki/Jack_Doohan": "https://upload.wikimedia.org/wikipedia/commons/4/42/Jack_Doohan_2023.jpg" 661 | } 662 | -------------------------------------------------------------------------------- /bun.lock: -------------------------------------------------------------------------------- 1 | { 2 | "lockfileVersion": 1, 3 | "workspaces": { 4 | "": { 5 | "name": "redis-bigquery", 6 | "dependencies": { 7 | "@google-cloud/bigquery": "^7.9.3", 8 | "cors": "^2.8.5", 9 | "dotenv": "^16.4.7", 10 | "express": "^4.21.2", 11 | "jsdom": "^26.0.0", 12 | "react": "^19.1.0", 13 | "react-dom": "^19.1.0", 14 | "react-router-dom": "^7.4.1", 15 | "react-tates": "^0.2.0", 16 | "redis": "^4.7.0", 17 | }, 18 | "devDependencies": { 19 | "@types/react": "^19.0.12", 20 | "@types/react-dom": "^19.0.4", 21 | "@vitejs/plugin-react-swc": "^3.8.1", 22 | "globals": "^16.0.0", 23 | "npm-run-all": "^4.1.5", 24 | "prettier": "^3.5.3", 25 | "vite": "^6.2.3", 26 | }, 27 | }, 28 | }, 29 | "packages": { 30 | "@asamuzakjp/css-color": ["@asamuzakjp/css-color@3.1.1", "", { "dependencies": { "@csstools/css-calc": "^2.1.2", "@csstools/css-color-parser": "^3.0.8", "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3", "lru-cache": "^10.4.3" } }, "sha512-hpRD68SV2OMcZCsrbdkccTw5FXjNDLo5OuqSHyHZfwweGsDWZwDJ2+gONyNAbazZclobMirACLw0lk8WVxIqxA=="], 31 | 32 | "@csstools/color-helpers": ["@csstools/color-helpers@5.0.2", "", {}, "sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA=="], 33 | 34 | "@csstools/css-calc": ["@csstools/css-calc@2.1.2", "", { "peerDependencies": { "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3" } }, "sha512-TklMyb3uBB28b5uQdxjReG4L80NxAqgrECqLZFQbyLekwwlcDDS8r3f07DKqeo8C4926Br0gf/ZDe17Zv4wIuw=="], 35 | 36 | "@csstools/css-color-parser": ["@csstools/css-color-parser@3.0.8", "", { "dependencies": { "@csstools/color-helpers": "^5.0.2", "@csstools/css-calc": "^2.1.2" }, "peerDependencies": { "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3" } }, "sha512-pdwotQjCCnRPuNi06jFuP68cykU1f3ZWExLe/8MQ1LOs8Xq+fTkYgd+2V8mWUWMrOn9iS2HftPVaMZDaXzGbhQ=="], 37 | 38 | "@csstools/css-parser-algorithms": ["@csstools/css-parser-algorithms@3.0.4", "", { "peerDependencies": { "@csstools/css-tokenizer": "^3.0.3" } }, "sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A=="], 39 | 40 | "@csstools/css-tokenizer": ["@csstools/css-tokenizer@3.0.3", "", {}, "sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw=="], 41 | 42 | "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.1", "", { "os": "aix", "cpu": "ppc64" }, "sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ=="], 43 | 44 | "@esbuild/android-arm": ["@esbuild/android-arm@0.25.1", "", { "os": "android", "cpu": "arm" }, "sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q=="], 45 | 46 | "@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.1", "", { "os": "android", "cpu": "arm64" }, "sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA=="], 47 | 48 | "@esbuild/android-x64": ["@esbuild/android-x64@0.25.1", "", { "os": "android", "cpu": "x64" }, "sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw=="], 49 | 50 | "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ=="], 51 | 52 | "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA=="], 53 | 54 | "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.1", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A=="], 55 | 56 | "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww=="], 57 | 58 | "@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.1", "", { "os": "linux", "cpu": "arm" }, "sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ=="], 59 | 60 | "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ=="], 61 | 62 | "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.1", "", { "os": "linux", "cpu": "ia32" }, "sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ=="], 63 | 64 | "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.1", "", { "os": "linux", "cpu": "none" }, "sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg=="], 65 | 66 | "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.1", "", { "os": "linux", "cpu": "none" }, "sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg=="], 67 | 68 | "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg=="], 69 | 70 | "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.1", "", { "os": "linux", "cpu": "none" }, "sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ=="], 71 | 72 | "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ=="], 73 | 74 | "@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.1", "", { "os": "linux", "cpu": "x64" }, "sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA=="], 75 | 76 | "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.1", "", { "os": "none", "cpu": "arm64" }, "sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g=="], 77 | 78 | "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.1", "", { "os": "none", "cpu": "x64" }, "sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA=="], 79 | 80 | "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.1", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg=="], 81 | 82 | "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.1", "", { "os": "openbsd", "cpu": "x64" }, "sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw=="], 83 | 84 | "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.1", "", { "os": "sunos", "cpu": "x64" }, "sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg=="], 85 | 86 | "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ=="], 87 | 88 | "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A=="], 89 | 90 | "@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.1", "", { "os": "win32", "cpu": "x64" }, "sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg=="], 91 | 92 | "@google-cloud/bigquery": ["@google-cloud/bigquery@7.9.3", "", { "dependencies": { "@google-cloud/common": "^5.0.0", "@google-cloud/paginator": "^5.0.2", "@google-cloud/precise-date": "^4.0.0", "@google-cloud/promisify": "4.0.0", "arrify": "^2.0.1", "big.js": "^6.0.0", "duplexify": "^4.0.0", "extend": "^3.0.2", "is": "^3.3.0", "stream-events": "^1.0.5", "uuid": "^9.0.0" } }, "sha512-e0jvEwnEyvQeJOn5Twd429yr7T5/+3wR0rO0Vfe+3T25P0dRShhGyknlh/Ucoafa7WR4imFhW8+542yR4VkJ+w=="], 93 | 94 | "@google-cloud/common": ["@google-cloud/common@5.0.2", "", { "dependencies": { "@google-cloud/projectify": "^4.0.0", "@google-cloud/promisify": "^4.0.0", "arrify": "^2.0.1", "duplexify": "^4.1.1", "extend": "^3.0.2", "google-auth-library": "^9.0.0", "html-entities": "^2.5.2", "retry-request": "^7.0.0", "teeny-request": "^9.0.0" } }, "sha512-V7bmBKYQyu0eVG2BFejuUjlBt+zrya6vtsKdY+JxMM/dNntPF41vZ9+LhOshEUH01zOHEqBSvI7Dad7ZS6aUeA=="], 95 | 96 | "@google-cloud/paginator": ["@google-cloud/paginator@5.0.2", "", { "dependencies": { "arrify": "^2.0.0", "extend": "^3.0.2" } }, "sha512-DJS3s0OVH4zFDB1PzjxAsHqJT6sKVbRwwML0ZBP9PbU7Yebtu/7SWMRzvO2J3nUi9pRNITCfu4LJeooM2w4pjg=="], 97 | 98 | "@google-cloud/precise-date": ["@google-cloud/precise-date@4.0.0", "", {}, "sha512-1TUx3KdaU3cN7nfCdNf+UVqA/PSX29Cjcox3fZZBtINlRrXVTmUkQnCKv2MbBUbCopbK4olAT1IHl76uZyCiVA=="], 99 | 100 | "@google-cloud/projectify": ["@google-cloud/projectify@4.0.0", "", {}, "sha512-MmaX6HeSvyPbWGwFq7mXdo0uQZLGBYCwziiLIGq5JVX+/bdI3SAq6bP98trV5eTWfLuvsMcIC1YJOF2vfteLFA=="], 101 | 102 | "@google-cloud/promisify": ["@google-cloud/promisify@4.0.0", "", {}, "sha512-Orxzlfb9c67A15cq2JQEyVc7wEsmFBmHjZWZYQMUyJ1qivXyMwdyNOs9odi79hze+2zqdTtu1E19IM/FtqZ10g=="], 103 | 104 | "@redis/bloom": ["@redis/bloom@1.2.0", "", { "peerDependencies": { "@redis/client": "^1.0.0" } }, "sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg=="], 105 | 106 | "@redis/client": ["@redis/client@1.6.0", "", { "dependencies": { "cluster-key-slot": "1.1.2", "generic-pool": "3.9.0", "yallist": "4.0.0" } }, "sha512-aR0uffYI700OEEH4gYnitAnv3vzVGXCFvYfdpu/CJKvk4pHfLPEy/JSZyrpQ+15WhXe1yJRXLtfQ84s4mEXnPg=="], 107 | 108 | "@redis/graph": ["@redis/graph@1.1.1", "", { "peerDependencies": { "@redis/client": "^1.0.0" } }, "sha512-FEMTcTHZozZciLRl6GiiIB4zGm5z5F3F6a6FZCyrfxdKOhFlGkiAqlexWMBzCi4DcRoyiOsuLfW+cjlGWyExOw=="], 109 | 110 | "@redis/json": ["@redis/json@1.0.7", "", { "peerDependencies": { "@redis/client": "^1.0.0" } }, "sha512-6UyXfjVaTBTJtKNG4/9Z8PSpKE6XgSyEb8iwaqDcy+uKrd/DGYHTWkUdnQDyzm727V7p21WUMhsqz5oy65kPcQ=="], 111 | 112 | "@redis/search": ["@redis/search@1.2.0", "", { "peerDependencies": { "@redis/client": "^1.0.0" } }, "sha512-tYoDBbtqOVigEDMAcTGsRlMycIIjwMCgD8eR2t0NANeQmgK/lvxNAvYyb6bZDD4frHRhIHkJu2TBRvB0ERkOmw=="], 113 | 114 | "@redis/time-series": ["@redis/time-series@1.1.0", "", { "peerDependencies": { "@redis/client": "^1.0.0" } }, "sha512-c1Q99M5ljsIuc4YdaCwfUEXsofakb9c8+Zse2qxTadu8TalLXuAESzLvFAvNVbkmSlvlzIQOLpBCmWI9wTOt+g=="], 115 | 116 | "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.37.0", "", { "os": "android", "cpu": "arm" }, "sha512-l7StVw6WAa8l3vA1ov80jyetOAEo1FtHvZDbzXDO/02Sq/QVvqlHkYoFwDJPIMj0GKiistsBudfx5tGFnwYWDQ=="], 117 | 118 | "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.37.0", "", { "os": "android", "cpu": "arm64" }, "sha512-6U3SlVyMxezt8Y+/iEBcbp945uZjJwjZimu76xoG7tO1av9VO691z8PkhzQ85ith2I8R2RddEPeSfcbyPfD4hA=="], 119 | 120 | "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.37.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-+iTQ5YHuGmPt10NTzEyMPbayiNTcOZDWsbxZYR1ZnmLnZxG17ivrPSWFO9j6GalY0+gV3Jtwrrs12DBscxnlYA=="], 121 | 122 | "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.37.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-m8W2UbxLDcmRKVjgl5J/k4B8d7qX2EcJve3Sut7YGrQoPtCIQGPH5AMzuFvYRWZi0FVS0zEY4c8uttPfX6bwYQ=="], 123 | 124 | "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.37.0", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-FOMXGmH15OmtQWEt174v9P1JqqhlgYge/bUjIbiVD1nI1NeJ30HYT9SJlZMqdo1uQFyt9cz748F1BHghWaDnVA=="], 125 | 126 | "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.37.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-SZMxNttjPKvV14Hjck5t70xS3l63sbVwl98g3FlVVx2YIDmfUIy29jQrsw06ewEYQ8lQSuY9mpAPlmgRD2iSsA=="], 127 | 128 | "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.37.0", "", { "os": "linux", "cpu": "arm" }, "sha512-hhAALKJPidCwZcj+g+iN+38SIOkhK2a9bqtJR+EtyxrKKSt1ynCBeqrQy31z0oWU6thRZzdx53hVgEbRkuI19w=="], 129 | 130 | "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.37.0", "", { "os": "linux", "cpu": "arm" }, "sha512-jUb/kmn/Gd8epbHKEqkRAxq5c2EwRt0DqhSGWjPFxLeFvldFdHQs/n8lQ9x85oAeVb6bHcS8irhTJX2FCOd8Ag=="], 131 | 132 | "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.37.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-oNrJxcQT9IcbcmKlkF+Yz2tmOxZgG9D9GRq+1OE6XCQwCVwxixYAa38Z8qqPzQvzt1FCfmrHX03E0pWoXm1DqA=="], 133 | 134 | "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.37.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-pfxLBMls+28Ey2enpX3JvjEjaJMBX5XlPCZNGxj4kdJyHduPBXtxYeb8alo0a7bqOoWZW2uKynhHxF/MWoHaGQ=="], 135 | 136 | "@rollup/rollup-linux-loongarch64-gnu": ["@rollup/rollup-linux-loongarch64-gnu@4.37.0", "", { "os": "linux", "cpu": "none" }, "sha512-yCE0NnutTC/7IGUq/PUHmoeZbIwq3KRh02e9SfFh7Vmc1Z7atuJRYWhRME5fKgT8aS20mwi1RyChA23qSyRGpA=="], 137 | 138 | "@rollup/rollup-linux-powerpc64le-gnu": ["@rollup/rollup-linux-powerpc64le-gnu@4.37.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-NxcICptHk06E2Lh3a4Pu+2PEdZ6ahNHuK7o6Np9zcWkrBMuv21j10SQDJW3C9Yf/A/P7cutWoC/DptNLVsZ0VQ=="], 139 | 140 | "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.37.0", "", { "os": "linux", "cpu": "none" }, "sha512-PpWwHMPCVpFZLTfLq7EWJWvrmEuLdGn1GMYcm5MV7PaRgwCEYJAwiN94uBuZev0/J/hFIIJCsYw4nLmXA9J7Pw=="], 141 | 142 | "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.37.0", "", { "os": "linux", "cpu": "none" }, "sha512-DTNwl6a3CfhGTAOYZ4KtYbdS8b+275LSLqJVJIrPa5/JuIufWWZ/QFvkxp52gpmguN95eujrM68ZG+zVxa8zHA=="], 143 | 144 | "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.37.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-hZDDU5fgWvDdHFuExN1gBOhCuzo/8TMpidfOR+1cPZJflcEzXdCy1LjnklQdW8/Et9sryOPJAKAQRw8Jq7Tg+A=="], 145 | 146 | "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.37.0", "", { "os": "linux", "cpu": "x64" }, "sha512-pKivGpgJM5g8dwj0ywBwe/HeVAUSuVVJhUTa/URXjxvoyTT/AxsLTAbkHkDHG7qQxLoW2s3apEIl26uUe08LVQ=="], 147 | 148 | "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.37.0", "", { "os": "linux", "cpu": "x64" }, "sha512-E2lPrLKE8sQbY/2bEkVTGDEk4/49UYRVWgj90MY8yPjpnGBQ+Xi1Qnr7b7UIWw1NOggdFQFOLZ8+5CzCiz143w=="], 149 | 150 | "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.37.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-Jm7biMazjNzTU4PrQtr7VS8ibeys9Pn29/1bm4ph7CP2kf21950LgN+BaE2mJ1QujnvOc6p54eWWiVvn05SOBg=="], 151 | 152 | "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.37.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-e3/1SFm1OjefWICB2Ucstg2dxYDkDTZGDYgwufcbsxTHyqQps1UQf33dFEChBNmeSsTOyrjw2JJq0zbG5GF6RA=="], 153 | 154 | "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.37.0", "", { "os": "win32", "cpu": "x64" }, "sha512-LWbXUBwn/bcLx2sSsqy7pK5o+Nr+VCoRoAohfJ5C/aBio9nfJmGQqHAhU6pwxV/RmyTk5AqdySma7uwWGlmeuA=="], 155 | 156 | "@swc/core": ["@swc/core@1.11.13", "", { "dependencies": { "@swc/counter": "^0.1.3", "@swc/types": "^0.1.19" }, "optionalDependencies": { "@swc/core-darwin-arm64": "1.11.13", "@swc/core-darwin-x64": "1.11.13", "@swc/core-linux-arm-gnueabihf": "1.11.13", "@swc/core-linux-arm64-gnu": "1.11.13", "@swc/core-linux-arm64-musl": "1.11.13", "@swc/core-linux-x64-gnu": "1.11.13", "@swc/core-linux-x64-musl": "1.11.13", "@swc/core-win32-arm64-msvc": "1.11.13", "@swc/core-win32-ia32-msvc": "1.11.13", "@swc/core-win32-x64-msvc": "1.11.13" }, "peerDependencies": { "@swc/helpers": "*" }, "optionalPeers": ["@swc/helpers"] }, "sha512-9BXdYz12Wl0zWmZ80PvtjBWeg2ncwJ9L5WJzjhN6yUTZWEV/AwAdVdJnIEp4pro3WyKmAaMxcVOSbhuuOZco5g=="], 157 | 158 | "@swc/core-darwin-arm64": ["@swc/core-darwin-arm64@1.11.13", "", { "os": "darwin", "cpu": "arm64" }, "sha512-loSERhLaQ9XDS+5Kdx8cLe2tM1G0HLit8MfehipAcsdctpo79zrRlkW34elOf3tQoVPKUItV0b/rTuhjj8NtHg=="], 159 | 160 | "@swc/core-darwin-x64": ["@swc/core-darwin-x64@1.11.13", "", { "os": "darwin", "cpu": "x64" }, "sha512-uSA4UwgsDCIysUPfPS8OrQTH2h9spO7IYFd+1NB6dJlVGUuR6jLKuMBOP1IeLeax4cGHayvkcwSJ3OvxHwgcZQ=="], 161 | 162 | "@swc/core-linux-arm-gnueabihf": ["@swc/core-linux-arm-gnueabihf@1.11.13", "", { "os": "linux", "cpu": "arm" }, "sha512-boVtyJzS8g30iQfe8Q46W5QE/cmhKRln/7NMz/5sBP/am2Lce9NL0d05NnFwEWJp1e2AMGHFOdRr3Xg1cDiPKw=="], 163 | 164 | "@swc/core-linux-arm64-gnu": ["@swc/core-linux-arm64-gnu@1.11.13", "", { "os": "linux", "cpu": "arm64" }, "sha512-+IK0jZ84zHUaKtwpV+T+wT0qIUBnK9v2xXD03vARubKF+eUqCsIvcVHXmLpFuap62dClMrhCiwW10X3RbXNlHw=="], 165 | 166 | "@swc/core-linux-arm64-musl": ["@swc/core-linux-arm64-musl@1.11.13", "", { "os": "linux", "cpu": "arm64" }, "sha512-+ukuB8RHD5BHPCUjQwuLP98z+VRfu+NkKQVBcLJGgp0/+w7y0IkaxLY/aKmrAS5ofCNEGqKL+AOVyRpX1aw+XA=="], 167 | 168 | "@swc/core-linux-x64-gnu": ["@swc/core-linux-x64-gnu@1.11.13", "", { "os": "linux", "cpu": "x64" }, "sha512-q9H3WI3U3dfJ34tdv60zc8oTuWvSd5fOxytyAO9Pc5M82Hic3jjWaf2xBekUg07ubnMZpyfnv+MlD+EbUI3Llw=="], 169 | 170 | "@swc/core-linux-x64-musl": ["@swc/core-linux-x64-musl@1.11.13", "", { "os": "linux", "cpu": "x64" }, "sha512-9aaZnnq2pLdTbAzTSzy/q8dr7Woy3aYIcQISmw1+Q2/xHJg5y80ZzbWSWKYca/hKonDMjIbGR6dp299I5J0aeA=="], 171 | 172 | "@swc/core-win32-arm64-msvc": ["@swc/core-win32-arm64-msvc@1.11.13", "", { "os": "win32", "cpu": "arm64" }, "sha512-n3QZmDewkHANcoHvtwvA6yJbmS4XJf0MBMmwLZoKDZ2dOnC9D/jHiXw7JOohEuzYcpLoL5tgbqmjxa3XNo9Oow=="], 173 | 174 | "@swc/core-win32-ia32-msvc": ["@swc/core-win32-ia32-msvc@1.11.13", "", { "os": "win32", "cpu": "ia32" }, "sha512-wM+Nt4lc6YSJFthCx3W2dz0EwFNf++j0/2TQ0Js9QLJuIxUQAgukhNDVCDdq8TNcT0zuA399ALYbvj5lfIqG6g=="], 175 | 176 | "@swc/core-win32-x64-msvc": ["@swc/core-win32-x64-msvc@1.11.13", "", { "os": "win32", "cpu": "x64" }, "sha512-+X5/uW3s1L5gK7wAo0E27YaAoidJDo51dnfKSfU7gF3mlEUuWH8H1bAy5OTt2mU4eXtfsdUMEVXSwhDlLtQkuA=="], 177 | 178 | "@swc/counter": ["@swc/counter@0.1.3", "", {}, "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ=="], 179 | 180 | "@swc/types": ["@swc/types@0.1.20", "", { "dependencies": { "@swc/counter": "^0.1.3" } }, "sha512-/rlIpxwKrhz4BIplXf6nsEHtqlhzuNN34/k3kMAXH4/lvVoA3cdq+60aqVNnyvw2uITEaCi0WV3pxBe4dQqoXQ=="], 181 | 182 | "@tootallnate/once": ["@tootallnate/once@2.0.0", "", {}, "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A=="], 183 | 184 | "@types/caseless": ["@types/caseless@0.12.5", "", {}, "sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg=="], 185 | 186 | "@types/cookie": ["@types/cookie@0.6.0", "", {}, "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA=="], 187 | 188 | "@types/estree": ["@types/estree@1.0.6", "", {}, "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw=="], 189 | 190 | "@types/node": ["@types/node@22.13.14", "", { "dependencies": { "undici-types": "~6.20.0" } }, "sha512-Zs/Ollc1SJ8nKUAgc7ivOEdIBM8JAKgrqqUYi2J997JuKO7/tpQC+WCetQ1sypiKCQWHdvdg9wBNpUPEWZae7w=="], 191 | 192 | "@types/react": ["@types/react@19.0.12", "", { "dependencies": { "csstype": "^3.0.2" } }, "sha512-V6Ar115dBDrjbtXSrS+/Oruobc+qVbbUxDFC1RSbRqLt5SYvxxyIDrSC85RWml54g+jfNeEMZhEj7wW07ONQhA=="], 193 | 194 | "@types/react-dom": ["@types/react-dom@19.0.4", "", { "peerDependencies": { "@types/react": "^19.0.0" } }, "sha512-4fSQ8vWFkg+TGhePfUzVmat3eC14TXYSsiiDSLI0dVLsrm9gZFABjPy/Qu6TKgl1tq1Bu1yDsuQgY3A3DOjCcg=="], 195 | 196 | "@types/request": ["@types/request@2.48.12", "", { "dependencies": { "@types/caseless": "*", "@types/node": "*", "@types/tough-cookie": "*", "form-data": "^2.5.0" } }, "sha512-G3sY+NpsA9jnwm0ixhAFQSJ3Q9JkpLZpJbI3GMv0mIAT0y3mRabYeINzal5WOChIiaTEGQYlHOKgkaM9EisWHw=="], 197 | 198 | "@types/tough-cookie": ["@types/tough-cookie@4.0.5", "", {}, "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA=="], 199 | 200 | "@vitejs/plugin-react-swc": ["@vitejs/plugin-react-swc@3.8.1", "", { "dependencies": { "@swc/core": "^1.11.11" }, "peerDependencies": { "vite": "^4 || ^5 || ^6" } }, "sha512-aEUPCckHDcFyxpwFm0AIkbtv6PpUp3xTb9wYGFjtABynXjCYKkWoxX0AOK9NT9XCrdk6mBBUOeHQS+RKdcNO1A=="], 201 | 202 | "accepts": ["accepts@1.3.8", "", { "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" } }, "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw=="], 203 | 204 | "agent-base": ["agent-base@7.1.3", "", {}, "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw=="], 205 | 206 | "ansi-styles": ["ansi-styles@3.2.1", "", { "dependencies": { "color-convert": "^1.9.0" } }, "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="], 207 | 208 | "array-buffer-byte-length": ["array-buffer-byte-length@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "is-array-buffer": "^3.0.5" } }, "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw=="], 209 | 210 | "array-flatten": ["array-flatten@1.1.1", "", {}, "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="], 211 | 212 | "arraybuffer.prototype.slice": ["arraybuffer.prototype.slice@1.0.4", "", { "dependencies": { "array-buffer-byte-length": "^1.0.1", "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "is-array-buffer": "^3.0.4" } }, "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ=="], 213 | 214 | "arrify": ["arrify@2.0.1", "", {}, "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug=="], 215 | 216 | "async-function": ["async-function@1.0.0", "", {}, "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA=="], 217 | 218 | "asynckit": ["asynckit@0.4.0", "", {}, "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="], 219 | 220 | "available-typed-arrays": ["available-typed-arrays@1.0.7", "", { "dependencies": { "possible-typed-array-names": "^1.0.0" } }, "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ=="], 221 | 222 | "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], 223 | 224 | "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], 225 | 226 | "big.js": ["big.js@6.2.2", "", {}, "sha512-y/ie+Faknx7sZA5MfGA2xKlu0GDv8RWrXGsmlteyJQ2lvoKv9GBK/fpRMc2qlSoBAgNxrixICFCBefIq8WCQpQ=="], 227 | 228 | "bignumber.js": ["bignumber.js@9.1.2", "", {}, "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug=="], 229 | 230 | "body-parser": ["body-parser@1.20.3", "", { "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", "qs": "6.13.0", "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" } }, "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g=="], 231 | 232 | "brace-expansion": ["brace-expansion@1.1.11", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="], 233 | 234 | "buffer-equal-constant-time": ["buffer-equal-constant-time@1.0.1", "", {}, "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA=="], 235 | 236 | "bytes": ["bytes@3.1.2", "", {}, "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="], 237 | 238 | "call-bind": ["call-bind@1.0.8", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", "get-intrinsic": "^1.2.4", "set-function-length": "^1.2.2" } }, "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww=="], 239 | 240 | "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="], 241 | 242 | "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], 243 | 244 | "chalk": ["chalk@2.4.2", "", { "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="], 245 | 246 | "cluster-key-slot": ["cluster-key-slot@1.1.2", "", {}, "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA=="], 247 | 248 | "color-convert": ["color-convert@1.9.3", "", { "dependencies": { "color-name": "1.1.3" } }, "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="], 249 | 250 | "color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="], 251 | 252 | "combined-stream": ["combined-stream@1.0.8", "", { "dependencies": { "delayed-stream": "~1.0.0" } }, "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="], 253 | 254 | "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], 255 | 256 | "content-disposition": ["content-disposition@0.5.4", "", { "dependencies": { "safe-buffer": "5.2.1" } }, "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ=="], 257 | 258 | "content-type": ["content-type@1.0.5", "", {}, "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA=="], 259 | 260 | "cookie": ["cookie@0.7.1", "", {}, "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w=="], 261 | 262 | "cookie-signature": ["cookie-signature@1.0.6", "", {}, "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="], 263 | 264 | "cors": ["cors@2.8.5", "", { "dependencies": { "object-assign": "^4", "vary": "^1" } }, "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g=="], 265 | 266 | "cross-spawn": ["cross-spawn@6.0.6", "", { "dependencies": { "nice-try": "^1.0.4", "path-key": "^2.0.1", "semver": "^5.5.0", "shebang-command": "^1.2.0", "which": "^1.2.9" } }, "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw=="], 267 | 268 | "cssstyle": ["cssstyle@4.3.0", "", { "dependencies": { "@asamuzakjp/css-color": "^3.1.1", "rrweb-cssom": "^0.8.0" } }, "sha512-6r0NiY0xizYqfBvWp1G7WXJ06/bZyrk7Dc6PHql82C/pKGUTKu4yAX4Y8JPamb1ob9nBKuxWzCGTRuGwU3yxJQ=="], 269 | 270 | "csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="], 271 | 272 | "data-urls": ["data-urls@5.0.0", "", { "dependencies": { "whatwg-mimetype": "^4.0.0", "whatwg-url": "^14.0.0" } }, "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg=="], 273 | 274 | "data-view-buffer": ["data-view-buffer@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-data-view": "^1.0.2" } }, "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ=="], 275 | 276 | "data-view-byte-length": ["data-view-byte-length@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-data-view": "^1.0.2" } }, "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ=="], 277 | 278 | "data-view-byte-offset": ["data-view-byte-offset@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-data-view": "^1.0.1" } }, "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ=="], 279 | 280 | "debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], 281 | 282 | "decimal.js": ["decimal.js@10.5.0", "", {}, "sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw=="], 283 | 284 | "define-data-property": ["define-data-property@1.1.4", "", { "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "gopd": "^1.0.1" } }, "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A=="], 285 | 286 | "define-properties": ["define-properties@1.2.1", "", { "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" } }, "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg=="], 287 | 288 | "delayed-stream": ["delayed-stream@1.0.0", "", {}, "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="], 289 | 290 | "depd": ["depd@2.0.0", "", {}, "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="], 291 | 292 | "destroy": ["destroy@1.2.0", "", {}, "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg=="], 293 | 294 | "dotenv": ["dotenv@16.4.7", "", {}, "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ=="], 295 | 296 | "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="], 297 | 298 | "duplexify": ["duplexify@4.1.3", "", { "dependencies": { "end-of-stream": "^1.4.1", "inherits": "^2.0.3", "readable-stream": "^3.1.1", "stream-shift": "^1.0.2" } }, "sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA=="], 299 | 300 | "ecdsa-sig-formatter": ["ecdsa-sig-formatter@1.0.11", "", { "dependencies": { "safe-buffer": "^5.0.1" } }, "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ=="], 301 | 302 | "ee-first": ["ee-first@1.1.1", "", {}, "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="], 303 | 304 | "encodeurl": ["encodeurl@2.0.0", "", {}, "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg=="], 305 | 306 | "end-of-stream": ["end-of-stream@1.4.4", "", { "dependencies": { "once": "^1.4.0" } }, "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q=="], 307 | 308 | "entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], 309 | 310 | "error-ex": ["error-ex@1.3.2", "", { "dependencies": { "is-arrayish": "^0.2.1" } }, "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g=="], 311 | 312 | "es-abstract": ["es-abstract@1.23.9", "", { "dependencies": { "array-buffer-byte-length": "^1.0.2", "arraybuffer.prototype.slice": "^1.0.4", "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.3", "data-view-buffer": "^1.0.2", "data-view-byte-length": "^1.0.2", "data-view-byte-offset": "^1.0.1", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "es-set-tostringtag": "^2.1.0", "es-to-primitive": "^1.3.0", "function.prototype.name": "^1.1.8", "get-intrinsic": "^1.2.7", "get-proto": "^1.0.0", "get-symbol-description": "^1.1.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-proto": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "internal-slot": "^1.1.0", "is-array-buffer": "^3.0.5", "is-callable": "^1.2.7", "is-data-view": "^1.0.2", "is-regex": "^1.2.1", "is-shared-array-buffer": "^1.0.4", "is-string": "^1.1.1", "is-typed-array": "^1.1.15", "is-weakref": "^1.1.0", "math-intrinsics": "^1.1.0", "object-inspect": "^1.13.3", "object-keys": "^1.1.1", "object.assign": "^4.1.7", "own-keys": "^1.0.1", "regexp.prototype.flags": "^1.5.3", "safe-array-concat": "^1.1.3", "safe-push-apply": "^1.0.0", "safe-regex-test": "^1.1.0", "set-proto": "^1.0.0", "string.prototype.trim": "^1.2.10", "string.prototype.trimend": "^1.0.9", "string.prototype.trimstart": "^1.0.8", "typed-array-buffer": "^1.0.3", "typed-array-byte-length": "^1.0.3", "typed-array-byte-offset": "^1.0.4", "typed-array-length": "^1.0.7", "unbox-primitive": "^1.1.0", "which-typed-array": "^1.1.18" } }, "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA=="], 313 | 314 | "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="], 315 | 316 | "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], 317 | 318 | "es-object-atoms": ["es-object-atoms@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="], 319 | 320 | "es-set-tostringtag": ["es-set-tostringtag@2.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA=="], 321 | 322 | "es-to-primitive": ["es-to-primitive@1.3.0", "", { "dependencies": { "is-callable": "^1.2.7", "is-date-object": "^1.0.5", "is-symbol": "^1.0.4" } }, "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g=="], 323 | 324 | "esbuild": ["esbuild@0.25.1", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.1", "@esbuild/android-arm": "0.25.1", "@esbuild/android-arm64": "0.25.1", "@esbuild/android-x64": "0.25.1", "@esbuild/darwin-arm64": "0.25.1", "@esbuild/darwin-x64": "0.25.1", "@esbuild/freebsd-arm64": "0.25.1", "@esbuild/freebsd-x64": "0.25.1", "@esbuild/linux-arm": "0.25.1", "@esbuild/linux-arm64": "0.25.1", "@esbuild/linux-ia32": "0.25.1", "@esbuild/linux-loong64": "0.25.1", "@esbuild/linux-mips64el": "0.25.1", "@esbuild/linux-ppc64": "0.25.1", "@esbuild/linux-riscv64": "0.25.1", "@esbuild/linux-s390x": "0.25.1", "@esbuild/linux-x64": "0.25.1", "@esbuild/netbsd-arm64": "0.25.1", "@esbuild/netbsd-x64": "0.25.1", "@esbuild/openbsd-arm64": "0.25.1", "@esbuild/openbsd-x64": "0.25.1", "@esbuild/sunos-x64": "0.25.1", "@esbuild/win32-arm64": "0.25.1", "@esbuild/win32-ia32": "0.25.1", "@esbuild/win32-x64": "0.25.1" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ=="], 325 | 326 | "escape-html": ["escape-html@1.0.3", "", {}, "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="], 327 | 328 | "escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], 329 | 330 | "etag": ["etag@1.8.1", "", {}, "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="], 331 | 332 | "express": ["express@4.21.2", "", { "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", "cookie": "0.7.1", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", "finalhandler": "1.3.1", "fresh": "0.5.2", "http-errors": "2.0.0", "merge-descriptors": "1.0.3", "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", "path-to-regexp": "0.1.12", "proxy-addr": "~2.0.7", "qs": "6.13.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", "send": "0.19.0", "serve-static": "1.16.2", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" } }, "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA=="], 333 | 334 | "extend": ["extend@3.0.2", "", {}, "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="], 335 | 336 | "finalhandler": ["finalhandler@1.3.1", "", { "dependencies": { "debug": "2.6.9", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "on-finished": "2.4.1", "parseurl": "~1.3.3", "statuses": "2.0.1", "unpipe": "~1.0.0" } }, "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ=="], 337 | 338 | "for-each": ["for-each@0.3.5", "", { "dependencies": { "is-callable": "^1.2.7" } }, "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg=="], 339 | 340 | "form-data": ["form-data@4.0.2", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "mime-types": "^2.1.12" } }, "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w=="], 341 | 342 | "forwarded": ["forwarded@0.2.0", "", {}, "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="], 343 | 344 | "fresh": ["fresh@0.5.2", "", {}, "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="], 345 | 346 | "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], 347 | 348 | "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], 349 | 350 | "function.prototype.name": ["function.prototype.name@1.1.8", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "functions-have-names": "^1.2.3", "hasown": "^2.0.2", "is-callable": "^1.2.7" } }, "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q=="], 351 | 352 | "functions-have-names": ["functions-have-names@1.2.3", "", {}, "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ=="], 353 | 354 | "gaxios": ["gaxios@6.7.1", "", { "dependencies": { "extend": "^3.0.2", "https-proxy-agent": "^7.0.1", "is-stream": "^2.0.0", "node-fetch": "^2.6.9", "uuid": "^9.0.1" } }, "sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ=="], 355 | 356 | "gcp-metadata": ["gcp-metadata@6.1.1", "", { "dependencies": { "gaxios": "^6.1.1", "google-logging-utils": "^0.0.2", "json-bigint": "^1.0.0" } }, "sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A=="], 357 | 358 | "generic-pool": ["generic-pool@3.9.0", "", {}, "sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g=="], 359 | 360 | "get-intrinsic": ["get-intrinsic@1.3.0", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="], 361 | 362 | "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="], 363 | 364 | "get-symbol-description": ["get-symbol-description@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6" } }, "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg=="], 365 | 366 | "globals": ["globals@16.0.0", "", {}, "sha512-iInW14XItCXET01CQFqudPOWP2jYMl7T+QRQT+UNcR/iQncN/F0UNpgd76iFkBPgNQb4+X3LV9tLJYzwh+Gl3A=="], 367 | 368 | "globalthis": ["globalthis@1.0.4", "", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="], 369 | 370 | "google-auth-library": ["google-auth-library@9.15.1", "", { "dependencies": { "base64-js": "^1.3.0", "ecdsa-sig-formatter": "^1.0.11", "gaxios": "^6.1.1", "gcp-metadata": "^6.1.0", "gtoken": "^7.0.0", "jws": "^4.0.0" } }, "sha512-Jb6Z0+nvECVz+2lzSMt9u98UsoakXxA2HGHMCxh+so3n90XgYWkq5dur19JAJV7ONiJY22yBTyJB1TSkvPq9Ng=="], 371 | 372 | "google-logging-utils": ["google-logging-utils@0.0.2", "", {}, "sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ=="], 373 | 374 | "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="], 375 | 376 | "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], 377 | 378 | "gtoken": ["gtoken@7.1.0", "", { "dependencies": { "gaxios": "^6.0.0", "jws": "^4.0.0" } }, "sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw=="], 379 | 380 | "has-bigints": ["has-bigints@1.1.0", "", {}, "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg=="], 381 | 382 | "has-flag": ["has-flag@3.0.0", "", {}, "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="], 383 | 384 | "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="], 385 | 386 | "has-proto": ["has-proto@1.2.0", "", { "dependencies": { "dunder-proto": "^1.0.0" } }, "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ=="], 387 | 388 | "has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="], 389 | 390 | "has-tostringtag": ["has-tostringtag@1.0.2", "", { "dependencies": { "has-symbols": "^1.0.3" } }, "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw=="], 391 | 392 | "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], 393 | 394 | "hosted-git-info": ["hosted-git-info@2.8.9", "", {}, "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw=="], 395 | 396 | "html-encoding-sniffer": ["html-encoding-sniffer@4.0.0", "", { "dependencies": { "whatwg-encoding": "^3.1.1" } }, "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ=="], 397 | 398 | "html-entities": ["html-entities@2.5.5", "", {}, "sha512-24CG9o869vSa86BGCf7x65slrAztzFTU5VBQzEIwqjhKuB4zCC7xlH/7NCcZ1EN5MdmGx9lUqugfutuT6J+jKQ=="], 399 | 400 | "http-errors": ["http-errors@2.0.0", "", { "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", "setprototypeof": "1.2.0", "statuses": "2.0.1", "toidentifier": "1.0.1" } }, "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ=="], 401 | 402 | "http-proxy-agent": ["http-proxy-agent@7.0.2", "", { "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" } }, "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig=="], 403 | 404 | "https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="], 405 | 406 | "iconv-lite": ["iconv-lite@0.4.24", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3" } }, "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA=="], 407 | 408 | "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], 409 | 410 | "internal-slot": ["internal-slot@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "hasown": "^2.0.2", "side-channel": "^1.1.0" } }, "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw=="], 411 | 412 | "ipaddr.js": ["ipaddr.js@1.9.1", "", {}, "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="], 413 | 414 | "is": ["is@3.3.0", "", {}, "sha512-nW24QBoPcFGGHJGUwnfpI7Yc5CdqWNdsyHQszVE/z2pKHXzh7FZ5GWhJqSyaQ9wMkQnsTx+kAI8bHlCX4tKdbg=="], 415 | 416 | "is-array-buffer": ["is-array-buffer@3.0.5", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" } }, "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A=="], 417 | 418 | "is-arrayish": ["is-arrayish@0.2.1", "", {}, "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="], 419 | 420 | "is-async-function": ["is-async-function@2.1.1", "", { "dependencies": { "async-function": "^1.0.0", "call-bound": "^1.0.3", "get-proto": "^1.0.1", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" } }, "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ=="], 421 | 422 | "is-bigint": ["is-bigint@1.1.0", "", { "dependencies": { "has-bigints": "^1.0.2" } }, "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ=="], 423 | 424 | "is-boolean-object": ["is-boolean-object@1.2.2", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A=="], 425 | 426 | "is-callable": ["is-callable@1.2.7", "", {}, "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA=="], 427 | 428 | "is-core-module": ["is-core-module@2.16.1", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w=="], 429 | 430 | "is-data-view": ["is-data-view@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "get-intrinsic": "^1.2.6", "is-typed-array": "^1.1.13" } }, "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw=="], 431 | 432 | "is-date-object": ["is-date-object@1.1.0", "", { "dependencies": { "call-bound": "^1.0.2", "has-tostringtag": "^1.0.2" } }, "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg=="], 433 | 434 | "is-finalizationregistry": ["is-finalizationregistry@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg=="], 435 | 436 | "is-generator-function": ["is-generator-function@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "get-proto": "^1.0.0", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" } }, "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ=="], 437 | 438 | "is-map": ["is-map@2.0.3", "", {}, "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw=="], 439 | 440 | "is-number-object": ["is-number-object@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw=="], 441 | 442 | "is-potential-custom-element-name": ["is-potential-custom-element-name@1.0.1", "", {}, "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ=="], 443 | 444 | "is-regex": ["is-regex@1.2.1", "", { "dependencies": { "call-bound": "^1.0.2", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g=="], 445 | 446 | "is-set": ["is-set@2.0.3", "", {}, "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg=="], 447 | 448 | "is-shared-array-buffer": ["is-shared-array-buffer@1.0.4", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A=="], 449 | 450 | "is-stream": ["is-stream@2.0.1", "", {}, "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="], 451 | 452 | "is-string": ["is-string@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA=="], 453 | 454 | "is-symbol": ["is-symbol@1.1.1", "", { "dependencies": { "call-bound": "^1.0.2", "has-symbols": "^1.1.0", "safe-regex-test": "^1.1.0" } }, "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w=="], 455 | 456 | "is-typed-array": ["is-typed-array@1.1.15", "", { "dependencies": { "which-typed-array": "^1.1.16" } }, "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ=="], 457 | 458 | "is-weakmap": ["is-weakmap@2.0.2", "", {}, "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w=="], 459 | 460 | "is-weakref": ["is-weakref@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew=="], 461 | 462 | "is-weakset": ["is-weakset@2.0.4", "", { "dependencies": { "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" } }, "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ=="], 463 | 464 | "isarray": ["isarray@2.0.5", "", {}, "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="], 465 | 466 | "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], 467 | 468 | "jsdom": ["jsdom@26.0.0", "", { "dependencies": { "cssstyle": "^4.2.1", "data-urls": "^5.0.0", "decimal.js": "^10.4.3", "form-data": "^4.0.1", "html-encoding-sniffer": "^4.0.0", "http-proxy-agent": "^7.0.2", "https-proxy-agent": "^7.0.6", "is-potential-custom-element-name": "^1.0.1", "nwsapi": "^2.2.16", "parse5": "^7.2.1", "rrweb-cssom": "^0.8.0", "saxes": "^6.0.0", "symbol-tree": "^3.2.4", "tough-cookie": "^5.0.0", "w3c-xmlserializer": "^5.0.0", "webidl-conversions": "^7.0.0", "whatwg-encoding": "^3.1.1", "whatwg-mimetype": "^4.0.0", "whatwg-url": "^14.1.0", "ws": "^8.18.0", "xml-name-validator": "^5.0.0" }, "peerDependencies": { "canvas": "^3.0.0" }, "optionalPeers": ["canvas"] }, "sha512-BZYDGVAIriBWTpIxYzrXjv3E/4u8+/pSG5bQdIYCbNCGOvsPkDQfTVLAIXAf9ETdCpduCVTkDe2NNZ8NIwUVzw=="], 469 | 470 | "json-bigint": ["json-bigint@1.0.0", "", { "dependencies": { "bignumber.js": "^9.0.0" } }, "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ=="], 471 | 472 | "json-parse-better-errors": ["json-parse-better-errors@1.0.2", "", {}, "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw=="], 473 | 474 | "jwa": ["jwa@2.0.0", "", { "dependencies": { "buffer-equal-constant-time": "1.0.1", "ecdsa-sig-formatter": "1.0.11", "safe-buffer": "^5.0.1" } }, "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA=="], 475 | 476 | "jws": ["jws@4.0.0", "", { "dependencies": { "jwa": "^2.0.0", "safe-buffer": "^5.0.1" } }, "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg=="], 477 | 478 | "load-json-file": ["load-json-file@4.0.0", "", { "dependencies": { "graceful-fs": "^4.1.2", "parse-json": "^4.0.0", "pify": "^3.0.0", "strip-bom": "^3.0.0" } }, "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw=="], 479 | 480 | "lodash": ["lodash@4.17.21", "", {}, "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="], 481 | 482 | "lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], 483 | 484 | "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="], 485 | 486 | "media-typer": ["media-typer@0.3.0", "", {}, "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ=="], 487 | 488 | "memorystream": ["memorystream@0.3.1", "", {}, "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw=="], 489 | 490 | "merge-descriptors": ["merge-descriptors@1.0.3", "", {}, "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ=="], 491 | 492 | "methods": ["methods@1.1.2", "", {}, "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w=="], 493 | 494 | "mime": ["mime@1.6.0", "", { "bin": { "mime": "cli.js" } }, "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="], 495 | 496 | "mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], 497 | 498 | "mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], 499 | 500 | "minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], 501 | 502 | "ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], 503 | 504 | "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], 505 | 506 | "negotiator": ["negotiator@0.6.3", "", {}, "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="], 507 | 508 | "nice-try": ["nice-try@1.0.5", "", {}, "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ=="], 509 | 510 | "node-fetch": ["node-fetch@2.7.0", "", { "dependencies": { "whatwg-url": "^5.0.0" }, "peerDependencies": { "encoding": "^0.1.0" }, "optionalPeers": ["encoding"] }, "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A=="], 511 | 512 | "normalize-package-data": ["normalize-package-data@2.5.0", "", { "dependencies": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", "semver": "2 || 3 || 4 || 5", "validate-npm-package-license": "^3.0.1" } }, "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA=="], 513 | 514 | "npm-run-all": ["npm-run-all@4.1.5", "", { "dependencies": { "ansi-styles": "^3.2.1", "chalk": "^2.4.1", "cross-spawn": "^6.0.5", "memorystream": "^0.3.1", "minimatch": "^3.0.4", "pidtree": "^0.3.0", "read-pkg": "^3.0.0", "shell-quote": "^1.6.1", "string.prototype.padend": "^3.0.0" }, "bin": { "run-p": "bin/run-p/index.js", "run-s": "bin/run-s/index.js", "npm-run-all": "bin/npm-run-all/index.js" } }, "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ=="], 515 | 516 | "nwsapi": ["nwsapi@2.2.20", "", {}, "sha512-/ieB+mDe4MrrKMT8z+mQL8klXydZWGR5Dowt4RAGKbJ3kIGEx3X4ljUo+6V73IXtUPWgfOlU5B9MlGxFO5T+cA=="], 517 | 518 | "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="], 519 | 520 | "object-inspect": ["object-inspect@1.13.4", "", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="], 521 | 522 | "object-keys": ["object-keys@1.1.1", "", {}, "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="], 523 | 524 | "object.assign": ["object.assign@4.1.7", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0", "has-symbols": "^1.1.0", "object-keys": "^1.1.1" } }, "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw=="], 525 | 526 | "on-finished": ["on-finished@2.4.1", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg=="], 527 | 528 | "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], 529 | 530 | "own-keys": ["own-keys@1.0.1", "", { "dependencies": { "get-intrinsic": "^1.2.6", "object-keys": "^1.1.1", "safe-push-apply": "^1.0.0" } }, "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg=="], 531 | 532 | "parse-json": ["parse-json@4.0.0", "", { "dependencies": { "error-ex": "^1.3.1", "json-parse-better-errors": "^1.0.1" } }, "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw=="], 533 | 534 | "parse5": ["parse5@7.2.1", "", { "dependencies": { "entities": "^4.5.0" } }, "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ=="], 535 | 536 | "parseurl": ["parseurl@1.3.3", "", {}, "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="], 537 | 538 | "path-key": ["path-key@2.0.1", "", {}, "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw=="], 539 | 540 | "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="], 541 | 542 | "path-to-regexp": ["path-to-regexp@0.1.12", "", {}, "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ=="], 543 | 544 | "path-type": ["path-type@3.0.0", "", { "dependencies": { "pify": "^3.0.0" } }, "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg=="], 545 | 546 | "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], 547 | 548 | "pidtree": ["pidtree@0.3.1", "", { "bin": { "pidtree": "bin/pidtree.js" } }, "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA=="], 549 | 550 | "pify": ["pify@3.0.0", "", {}, "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg=="], 551 | 552 | "possible-typed-array-names": ["possible-typed-array-names@1.1.0", "", {}, "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg=="], 553 | 554 | "postcss": ["postcss@8.5.3", "", { "dependencies": { "nanoid": "^3.3.8", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A=="], 555 | 556 | "prettier": ["prettier@3.5.3", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw=="], 557 | 558 | "proxy-addr": ["proxy-addr@2.0.7", "", { "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" } }, "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg=="], 559 | 560 | "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], 561 | 562 | "qs": ["qs@6.13.0", "", { "dependencies": { "side-channel": "^1.0.6" } }, "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg=="], 563 | 564 | "range-parser": ["range-parser@1.2.1", "", {}, "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="], 565 | 566 | "raw-body": ["raw-body@2.5.2", "", { "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" } }, "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA=="], 567 | 568 | "react": ["react@19.1.0", "", {}, "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg=="], 569 | 570 | "react-dom": ["react-dom@19.1.0", "", { "dependencies": { "scheduler": "^0.26.0" }, "peerDependencies": { "react": "^19.1.0" } }, "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g=="], 571 | 572 | "react-router": ["react-router@7.4.1", "", { "dependencies": { "@types/cookie": "^0.6.0", "cookie": "^1.0.1", "set-cookie-parser": "^2.6.0", "turbo-stream": "2.4.0" }, "peerDependencies": { "react": ">=18", "react-dom": ">=18" }, "optionalPeers": ["react-dom"] }, "sha512-Vmizn9ZNzxfh3cumddqv3kLOKvc7AskUT0dC1prTabhiEi0U4A33LmkDOJ79tXaeSqCqMBXBU/ySX88W85+EUg=="], 573 | 574 | "react-router-dom": ["react-router-dom@7.4.1", "", { "dependencies": { "react-router": "7.4.1" }, "peerDependencies": { "react": ">=18", "react-dom": ">=18" } }, "sha512-L3/4tig0Lvs6m6THK0HRV4eHUdpx0dlJasgCxXKnavwhh4tKYgpuZk75HRYNoRKDyDWi9QgzGXsQ1oQSBlWpAA=="], 575 | 576 | "react-tates": ["react-tates@0.2.0", "", { "peerDependencies": { "react": ">=17.x", "tates": "^0.3.x" } }, "sha512-m/BfjCeFwFql4SfYuFfHYDqeiOMtKZjWAFdZ8Sw02JmsmDGXZEcKHy32YvJ942LPW518ePUJ2CoUX2SKs0v7qw=="], 577 | 578 | "read-pkg": ["read-pkg@3.0.0", "", { "dependencies": { "load-json-file": "^4.0.0", "normalize-package-data": "^2.3.2", "path-type": "^3.0.0" } }, "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA=="], 579 | 580 | "readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], 581 | 582 | "redis": ["redis@4.7.0", "", { "dependencies": { "@redis/bloom": "1.2.0", "@redis/client": "1.6.0", "@redis/graph": "1.1.1", "@redis/json": "1.0.7", "@redis/search": "1.2.0", "@redis/time-series": "1.1.0" } }, "sha512-zvmkHEAdGMn+hMRXuMBtu4Vo5P6rHQjLoHftu+lBqq8ZTA3RCVC/WzD790bkKKiNFp7d5/9PcSD19fJyyRvOdQ=="], 583 | 584 | "reflect.getprototypeof": ["reflect.getprototypeof@1.0.10", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.9", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.7", "get-proto": "^1.0.1", "which-builtin-type": "^1.2.1" } }, "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw=="], 585 | 586 | "regexp.prototype.flags": ["regexp.prototype.flags@1.5.4", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-errors": "^1.3.0", "get-proto": "^1.0.1", "gopd": "^1.2.0", "set-function-name": "^2.0.2" } }, "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA=="], 587 | 588 | "resolve": ["resolve@1.22.10", "", { "dependencies": { "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w=="], 589 | 590 | "retry-request": ["retry-request@7.0.2", "", { "dependencies": { "@types/request": "^2.48.8", "extend": "^3.0.2", "teeny-request": "^9.0.0" } }, "sha512-dUOvLMJ0/JJYEn8NrpOaGNE7X3vpI5XlZS/u0ANjqtcZVKnIxP7IgCFwrKTxENw29emmwug53awKtaMm4i9g5w=="], 591 | 592 | "rollup": ["rollup@4.37.0", "", { "dependencies": { "@types/estree": "1.0.6" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.37.0", "@rollup/rollup-android-arm64": "4.37.0", "@rollup/rollup-darwin-arm64": "4.37.0", "@rollup/rollup-darwin-x64": "4.37.0", "@rollup/rollup-freebsd-arm64": "4.37.0", "@rollup/rollup-freebsd-x64": "4.37.0", "@rollup/rollup-linux-arm-gnueabihf": "4.37.0", "@rollup/rollup-linux-arm-musleabihf": "4.37.0", "@rollup/rollup-linux-arm64-gnu": "4.37.0", "@rollup/rollup-linux-arm64-musl": "4.37.0", "@rollup/rollup-linux-loongarch64-gnu": "4.37.0", "@rollup/rollup-linux-powerpc64le-gnu": "4.37.0", "@rollup/rollup-linux-riscv64-gnu": "4.37.0", "@rollup/rollup-linux-riscv64-musl": "4.37.0", "@rollup/rollup-linux-s390x-gnu": "4.37.0", "@rollup/rollup-linux-x64-gnu": "4.37.0", "@rollup/rollup-linux-x64-musl": "4.37.0", "@rollup/rollup-win32-arm64-msvc": "4.37.0", "@rollup/rollup-win32-ia32-msvc": "4.37.0", "@rollup/rollup-win32-x64-msvc": "4.37.0", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-iAtQy/L4QFU+rTJ1YUjXqJOJzuwEghqWzCEYD2FEghT7Gsy1VdABntrO4CLopA5IkflTyqNiLNwPcOJ3S7UKLg=="], 593 | 594 | "rrweb-cssom": ["rrweb-cssom@0.8.0", "", {}, "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw=="], 595 | 596 | "safe-array-concat": ["safe-array-concat@1.1.3", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "get-intrinsic": "^1.2.6", "has-symbols": "^1.1.0", "isarray": "^2.0.5" } }, "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q=="], 597 | 598 | "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], 599 | 600 | "safe-push-apply": ["safe-push-apply@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "isarray": "^2.0.5" } }, "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA=="], 601 | 602 | "safe-regex-test": ["safe-regex-test@1.1.0", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-regex": "^1.2.1" } }, "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw=="], 603 | 604 | "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="], 605 | 606 | "saxes": ["saxes@6.0.0", "", { "dependencies": { "xmlchars": "^2.2.0" } }, "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA=="], 607 | 608 | "scheduler": ["scheduler@0.26.0", "", {}, "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA=="], 609 | 610 | "semver": ["semver@5.7.2", "", { "bin": { "semver": "bin/semver" } }, "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g=="], 611 | 612 | "send": ["send@0.19.0", "", { "dependencies": { "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", "http-errors": "2.0.0", "mime": "1.6.0", "ms": "2.1.3", "on-finished": "2.4.1", "range-parser": "~1.2.1", "statuses": "2.0.1" } }, "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw=="], 613 | 614 | "serve-static": ["serve-static@1.16.2", "", { "dependencies": { "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", "send": "0.19.0" } }, "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw=="], 615 | 616 | "set-cookie-parser": ["set-cookie-parser@2.7.1", "", {}, "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ=="], 617 | 618 | "set-function-length": ["set-function-length@1.2.2", "", { "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2" } }, "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg=="], 619 | 620 | "set-function-name": ["set-function-name@2.0.2", "", { "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "functions-have-names": "^1.2.3", "has-property-descriptors": "^1.0.2" } }, "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ=="], 621 | 622 | "set-proto": ["set-proto@1.0.0", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0" } }, "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw=="], 623 | 624 | "setprototypeof": ["setprototypeof@1.2.0", "", {}, "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="], 625 | 626 | "shebang-command": ["shebang-command@1.2.0", "", { "dependencies": { "shebang-regex": "^1.0.0" } }, "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg=="], 627 | 628 | "shebang-regex": ["shebang-regex@1.0.0", "", {}, "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ=="], 629 | 630 | "shell-quote": ["shell-quote@1.8.2", "", {}, "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA=="], 631 | 632 | "side-channel": ["side-channel@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", "side-channel-list": "^1.0.0", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw=="], 633 | 634 | "side-channel-list": ["side-channel-list@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" } }, "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA=="], 635 | 636 | "side-channel-map": ["side-channel-map@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3" } }, "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA=="], 637 | 638 | "side-channel-weakmap": ["side-channel-weakmap@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3", "side-channel-map": "^1.0.1" } }, "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A=="], 639 | 640 | "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], 641 | 642 | "spdx-correct": ["spdx-correct@3.2.0", "", { "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" } }, "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA=="], 643 | 644 | "spdx-exceptions": ["spdx-exceptions@2.5.0", "", {}, "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w=="], 645 | 646 | "spdx-expression-parse": ["spdx-expression-parse@3.0.1", "", { "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q=="], 647 | 648 | "spdx-license-ids": ["spdx-license-ids@3.0.21", "", {}, "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg=="], 649 | 650 | "statuses": ["statuses@2.0.1", "", {}, "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="], 651 | 652 | "stream-events": ["stream-events@1.0.5", "", { "dependencies": { "stubs": "^3.0.0" } }, "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg=="], 653 | 654 | "stream-shift": ["stream-shift@1.0.3", "", {}, "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ=="], 655 | 656 | "string.prototype.padend": ["string.prototype.padend@3.1.6", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2", "es-object-atoms": "^1.0.0" } }, "sha512-XZpspuSB7vJWhvJc9DLSlrXl1mcA2BdoY5jjnS135ydXqLoqhs96JjDtCkjJEQHvfqZIp9hBuBMgI589peyx9Q=="], 657 | 658 | "string.prototype.trim": ["string.prototype.trim@1.2.10", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "define-data-property": "^1.1.4", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-object-atoms": "^1.0.0", "has-property-descriptors": "^1.0.2" } }, "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA=="], 659 | 660 | "string.prototype.trimend": ["string.prototype.trimend@1.0.9", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ=="], 661 | 662 | "string.prototype.trimstart": ["string.prototype.trimstart@1.0.8", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg=="], 663 | 664 | "string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], 665 | 666 | "strip-bom": ["strip-bom@3.0.0", "", {}, "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA=="], 667 | 668 | "stubs": ["stubs@3.0.0", "", {}, "sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw=="], 669 | 670 | "supports-color": ["supports-color@5.5.0", "", { "dependencies": { "has-flag": "^3.0.0" } }, "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="], 671 | 672 | "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], 673 | 674 | "symbol-tree": ["symbol-tree@3.2.4", "", {}, "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw=="], 675 | 676 | "tates": ["tates@0.3.4", "", { "dependencies": { "lodash": "^4.17.21" } }, "sha512-fuN+b89K7bjtJOow8K04AOfdsSlzULS3KhIjjHogJ6gSrhMaFsa5uC0Ws1fuKrqwDDEgzJL4P/9jrG4Y1qef8A=="], 677 | 678 | "teeny-request": ["teeny-request@9.0.0", "", { "dependencies": { "http-proxy-agent": "^5.0.0", "https-proxy-agent": "^5.0.0", "node-fetch": "^2.6.9", "stream-events": "^1.0.5", "uuid": "^9.0.0" } }, "sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g=="], 679 | 680 | "tldts": ["tldts@6.1.85", "", { "dependencies": { "tldts-core": "^6.1.85" }, "bin": { "tldts": "bin/cli.js" } }, "sha512-gBdZ1RjCSevRPFix/hpaUWeak2/RNUZB4/8frF1r5uYMHjFptkiT0JXIebWvgI/0ZHXvxaUDDJshiA0j6GdL3w=="], 681 | 682 | "tldts-core": ["tldts-core@6.1.85", "", {}, "sha512-DTjUVvxckL1fIoPSb3KE7ISNtkWSawZdpfxGxwiIrZoO6EbHVDXXUIlIuWympPaeS+BLGyggozX/HTMsRAdsoA=="], 683 | 684 | "toidentifier": ["toidentifier@1.0.1", "", {}, "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="], 685 | 686 | "tough-cookie": ["tough-cookie@5.1.2", "", { "dependencies": { "tldts": "^6.1.32" } }, "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A=="], 687 | 688 | "tr46": ["tr46@5.1.0", "", { "dependencies": { "punycode": "^2.3.1" } }, "sha512-IUWnUK7ADYR5Sl1fZlO1INDUhVhatWl7BtJWsIhwJ0UAK7ilzzIa8uIqOO/aYVWHZPJkKbEL+362wrzoeRF7bw=="], 689 | 690 | "turbo-stream": ["turbo-stream@2.4.0", "", {}, "sha512-FHncC10WpBd2eOmGwpmQsWLDoK4cqsA/UT/GqNoaKOQnT8uzhtCbg3EoUDMvqpOSAI0S26mr0rkjzbOO6S3v1g=="], 691 | 692 | "type-is": ["type-is@1.6.18", "", { "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" } }, "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g=="], 693 | 694 | "typed-array-buffer": ["typed-array-buffer@1.0.3", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-typed-array": "^1.1.14" } }, "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw=="], 695 | 696 | "typed-array-byte-length": ["typed-array-byte-length@1.0.3", "", { "dependencies": { "call-bind": "^1.0.8", "for-each": "^0.3.3", "gopd": "^1.2.0", "has-proto": "^1.2.0", "is-typed-array": "^1.1.14" } }, "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg=="], 697 | 698 | "typed-array-byte-offset": ["typed-array-byte-offset@1.0.4", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "for-each": "^0.3.3", "gopd": "^1.2.0", "has-proto": "^1.2.0", "is-typed-array": "^1.1.15", "reflect.getprototypeof": "^1.0.9" } }, "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ=="], 699 | 700 | "typed-array-length": ["typed-array-length@1.0.7", "", { "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", "is-typed-array": "^1.1.13", "possible-typed-array-names": "^1.0.0", "reflect.getprototypeof": "^1.0.6" } }, "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg=="], 701 | 702 | "unbox-primitive": ["unbox-primitive@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "has-bigints": "^1.0.2", "has-symbols": "^1.1.0", "which-boxed-primitive": "^1.1.1" } }, "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw=="], 703 | 704 | "undici-types": ["undici-types@6.20.0", "", {}, "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg=="], 705 | 706 | "unpipe": ["unpipe@1.0.0", "", {}, "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="], 707 | 708 | "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], 709 | 710 | "utils-merge": ["utils-merge@1.0.1", "", {}, "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA=="], 711 | 712 | "uuid": ["uuid@9.0.1", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA=="], 713 | 714 | "validate-npm-package-license": ["validate-npm-package-license@3.0.4", "", { "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew=="], 715 | 716 | "vary": ["vary@1.1.2", "", {}, "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="], 717 | 718 | "vite": ["vite@6.2.3", "", { "dependencies": { "esbuild": "^0.25.0", "postcss": "^8.5.3", "rollup": "^4.30.1" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-IzwM54g4y9JA/xAeBPNaDXiBF8Jsgl3VBQ2YQ/wOY6fyW3xMdSoltIV3Bo59DErdqdE6RxUfv8W69DvUorE4Eg=="], 719 | 720 | "w3c-xmlserializer": ["w3c-xmlserializer@5.0.0", "", { "dependencies": { "xml-name-validator": "^5.0.0" } }, "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA=="], 721 | 722 | "webidl-conversions": ["webidl-conversions@7.0.0", "", {}, "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g=="], 723 | 724 | "whatwg-encoding": ["whatwg-encoding@3.1.1", "", { "dependencies": { "iconv-lite": "0.6.3" } }, "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ=="], 725 | 726 | "whatwg-mimetype": ["whatwg-mimetype@4.0.0", "", {}, "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg=="], 727 | 728 | "whatwg-url": ["whatwg-url@14.2.0", "", { "dependencies": { "tr46": "^5.1.0", "webidl-conversions": "^7.0.0" } }, "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw=="], 729 | 730 | "which": ["which@1.3.1", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "which": "./bin/which" } }, "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ=="], 731 | 732 | "which-boxed-primitive": ["which-boxed-primitive@1.1.1", "", { "dependencies": { "is-bigint": "^1.1.0", "is-boolean-object": "^1.2.1", "is-number-object": "^1.1.1", "is-string": "^1.1.1", "is-symbol": "^1.1.1" } }, "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA=="], 733 | 734 | "which-builtin-type": ["which-builtin-type@1.2.1", "", { "dependencies": { "call-bound": "^1.0.2", "function.prototype.name": "^1.1.6", "has-tostringtag": "^1.0.2", "is-async-function": "^2.0.0", "is-date-object": "^1.1.0", "is-finalizationregistry": "^1.1.0", "is-generator-function": "^1.0.10", "is-regex": "^1.2.1", "is-weakref": "^1.0.2", "isarray": "^2.0.5", "which-boxed-primitive": "^1.1.0", "which-collection": "^1.0.2", "which-typed-array": "^1.1.16" } }, "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q=="], 735 | 736 | "which-collection": ["which-collection@1.0.2", "", { "dependencies": { "is-map": "^2.0.3", "is-set": "^2.0.3", "is-weakmap": "^2.0.2", "is-weakset": "^2.0.3" } }, "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw=="], 737 | 738 | "which-typed-array": ["which-typed-array@1.1.19", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.4", "for-each": "^0.3.5", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" } }, "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw=="], 739 | 740 | "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], 741 | 742 | "ws": ["ws@8.18.1", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w=="], 743 | 744 | "xml-name-validator": ["xml-name-validator@5.0.0", "", {}, "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg=="], 745 | 746 | "xmlchars": ["xmlchars@2.2.0", "", {}, "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw=="], 747 | 748 | "yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], 749 | 750 | "@types/request/form-data": ["form-data@2.5.3", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "mime-types": "^2.1.35", "safe-buffer": "^5.2.1" } }, "sha512-XHIrMD0NpDrNM/Ckf7XJiBbLl57KEhT3+i3yY+eWm+cqYZJQTZrKo8Y8AWKnuV5GT4scfuUGt9LzNoIx3dU1nQ=="], 751 | 752 | "http-proxy-agent/debug": ["debug@4.4.0", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA=="], 753 | 754 | "https-proxy-agent/debug": ["debug@4.4.0", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA=="], 755 | 756 | "node-fetch/whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="], 757 | 758 | "react-router/cookie": ["cookie@1.0.2", "", {}, "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA=="], 759 | 760 | "send/encodeurl": ["encodeurl@1.0.2", "", {}, "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="], 761 | 762 | "send/ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], 763 | 764 | "teeny-request/http-proxy-agent": ["http-proxy-agent@5.0.0", "", { "dependencies": { "@tootallnate/once": "2", "agent-base": "6", "debug": "4" } }, "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w=="], 765 | 766 | "teeny-request/https-proxy-agent": ["https-proxy-agent@5.0.1", "", { "dependencies": { "agent-base": "6", "debug": "4" } }, "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA=="], 767 | 768 | "whatwg-encoding/iconv-lite": ["iconv-lite@0.6.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="], 769 | 770 | "http-proxy-agent/debug/ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], 771 | 772 | "https-proxy-agent/debug/ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], 773 | 774 | "node-fetch/whatwg-url/tr46": ["tr46@0.0.3", "", {}, "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="], 775 | 776 | "node-fetch/whatwg-url/webidl-conversions": ["webidl-conversions@3.0.1", "", {}, "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="], 777 | 778 | "teeny-request/http-proxy-agent/agent-base": ["agent-base@6.0.2", "", { "dependencies": { "debug": "4" } }, "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ=="], 779 | 780 | "teeny-request/http-proxy-agent/debug": ["debug@4.4.0", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA=="], 781 | 782 | "teeny-request/https-proxy-agent/agent-base": ["agent-base@6.0.2", "", { "dependencies": { "debug": "4" } }, "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ=="], 783 | 784 | "teeny-request/https-proxy-agent/debug": ["debug@4.4.0", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA=="], 785 | 786 | "teeny-request/http-proxy-agent/debug/ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], 787 | 788 | "teeny-request/https-proxy-agent/debug/ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], 789 | } 790 | } 791 | --------------------------------------------------------------------------------