From ff8b82c4738577d043a0a588d139f9e45b50d729 Mon Sep 17 00:00:00 2001 From: Mohit Kumhar Date: Tue, 23 Sep 2025 16:49:34 +0530 Subject: [PATCH 01/13] chore: test (#9) --- index.html | 1 - 1 file changed, 1 deletion(-) diff --git a/index.html b/index.html index ee09ab1..de38bf5 100644 --- a/index.html +++ b/index.html @@ -5,7 +5,6 @@ SafeCam Converted Web -
From 4f21c32ba85c16f5129a04db80054b8007a4cf43 Mon Sep 17 00:00:00 2001 From: Mohit Kumhar Date: Tue, 23 Sep 2025 17:01:18 +0530 Subject: [PATCH 02/13] chore: updated wordflows (#11) * chore: added labeler * fix: fix minor issues * chore: testing jobs * chore: updated workflows --- .github/workflows/build_test.yml | 9 +++++++-- index.html | 1 + 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build_test.yml b/.github/workflows/build_test.yml index f98c51a..4f5ffdc 100644 --- a/.github/workflows/build_test.yml +++ b/.github/workflows/build_test.yml @@ -2,9 +2,14 @@ name: React CI - build and test on: push: - branches: [ main ] + branches: + - main + - prod + pull_request: - branches: [ main ] + branches: + - main + - prod jobs: build: diff --git a/index.html b/index.html index de38bf5..ee09ab1 100644 --- a/index.html +++ b/index.html @@ -5,6 +5,7 @@ SafeCam Converted Web +
From 4bbe88e7fbfc033433ec8f544efdc0bc69d0110f Mon Sep 17 00:00:00 2001 From: Mohit Kumhar Date: Tue, 23 Sep 2025 23:55:09 +0530 Subject: [PATCH 03/13] chore: updated ci jobs (#15) * chore: added labeler * fix: fix minor issues * chore: updated ci jobs --- .github/workflows/build_test.yml | 11 ++++++----- .github/workflows/lint_test.yml | 32 +++++++++++++++++++++++--------- 2 files changed, 29 insertions(+), 14 deletions(-) diff --git a/.github/workflows/build_test.yml b/.github/workflows/build_test.yml index 4f5ffdc..8baa075 100644 --- a/.github/workflows/build_test.yml +++ b/.github/workflows/build_test.yml @@ -24,13 +24,14 @@ jobs: with: node-version: 22 - - name: Install dependencies + - name: Install dependencies (web) run: npm ci + working-directory: ShieldX- Web - - - name: Build app + - name: Build app (web) run: npm run build - + working-directory: web + - name: Deploy to Vercel if: github.ref == 'refs/heads/prod' - run: curl -X POST https://api.vercel.com/v1/integrations/deploy/{{ secrets.VERCEL_PROD_HOOK }} + run: curl -X POST https://api.vercel.com/v1/integrations/deploy/${{ secrets.VERCEL_PROD_HOOK }} diff --git a/.github/workflows/lint_test.yml b/.github/workflows/lint_test.yml index e620d21..24965f0 100644 --- a/.github/workflows/lint_test.yml +++ b/.github/workflows/lint_test.yml @@ -2,28 +2,42 @@ name: React CI Pipeline on: pull_request: - branches: [ main ] + branches: [ main, prod ] push: - branches: [ main ] + branches: [ main, prod ] jobs: lint: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 with: - node-version: 22.17.1 - - run: npm ci - - run: npm run lint + node-version: 22 + + - name: Install deps (web) + run: npm ci + working-directory: web + + - name: Run lint + run: npm run lint + working-directory: web build: runs-on: ubuntu-latest - needs: [lint, test] + needs: [lint] steps: - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 with: - node-version: 22.17.1 - - run: npm ci - - run: npm run build + node-version: 22 + + - name: Install deps (web) + run: npm ci + working-directory: ShieldX- Web + + - name: Build app (web) + run: npm run build + working-directory: web From d5e3d2802fa60db633493cd4ef0d8a52c50d63da Mon Sep 17 00:00:00 2001 From: Mohit Kumhar Date: Wed, 24 Sep 2025 00:19:51 +0530 Subject: [PATCH 04/13] chore: update workflows (#17) * chore: added labeler * fix: fix minor issues * feat: #01 Auth Working and complete signup and login Funtionallity * fix : Fix Bugs or error * Fix : Env Variable Hided * Fix * init * chore: update workflows * chore: update workflows --------- Co-authored-by: kushal --- .github/workflows/build_test.yml | 8 +- .github/workflows/lint_test.yml | 24 +- ShieldX- Web/.gitignore | 1 + README.md => ShieldX- Web/README.md | 20 +- ShieldX- Web/dist/assets/index-16523284.css | 1 + ShieldX- Web/dist/assets/index-96984a42.js | 62 + ShieldX- Web/dist/index.html | 15 + index.html => ShieldX- Web/index.html | 0 .../package-lock.json | 0 package.json => ShieldX- Web/package.json | 0 {src => ShieldX- Web/src}/App.jsx | 0 .../src}/components/BottomTabs.jsx | 4 +- .../src}/components/PoliceMap.jsx | 0 {src => ShieldX- Web/src}/main.jsx | 0 {src => ShieldX- Web/src}/pages/Alerts.jsx | 0 {src => ShieldX- Web/src}/pages/Chat.jsx | 0 {src => ShieldX- Web/src}/pages/Evidence.jsx | 0 {src => ShieldX- Web/src}/pages/Home.jsx | 0 {src => ShieldX- Web/src}/pages/Location.jsx | 0 ShieldX- Web/src/pages/Login.jsx | 90 + ShieldX- Web/src/pages/Signup.jsx | 87 + {src => ShieldX- Web/src}/styles/index.css | 3 +- server/.gitignore | 4 + server/README.md | 26 + server/config/db.js | 15 + server/middleware/authMiddleware.js | 16 + server/models/UserR.js | 19 + server/package-lock.json | 2210 +++++++++++++++++ server/package.json | 25 + server/routes/auth.js | 50 + server/src/index.js | 31 + server/test_register.js | 25 + src/pages/Login.jsx | 75 - src/pages/Signup.jsx | 53 - 34 files changed, 2716 insertions(+), 148 deletions(-) create mode 100644 ShieldX- Web/.gitignore rename README.md => ShieldX- Web/README.md (55%) create mode 100644 ShieldX- Web/dist/assets/index-16523284.css create mode 100644 ShieldX- Web/dist/assets/index-96984a42.js create mode 100644 ShieldX- Web/dist/index.html rename index.html => ShieldX- Web/index.html (100%) rename package-lock.json => ShieldX- Web/package-lock.json (100%) rename package.json => ShieldX- Web/package.json (100%) rename {src => ShieldX- Web/src}/App.jsx (100%) rename {src => ShieldX- Web/src}/components/BottomTabs.jsx (76%) rename {src => ShieldX- Web/src}/components/PoliceMap.jsx (100%) rename {src => ShieldX- Web/src}/main.jsx (100%) rename {src => ShieldX- Web/src}/pages/Alerts.jsx (100%) rename {src => ShieldX- Web/src}/pages/Chat.jsx (100%) rename {src => ShieldX- Web/src}/pages/Evidence.jsx (100%) rename {src => ShieldX- Web/src}/pages/Home.jsx (100%) rename {src => ShieldX- Web/src}/pages/Location.jsx (100%) create mode 100644 ShieldX- Web/src/pages/Login.jsx create mode 100644 ShieldX- Web/src/pages/Signup.jsx rename {src => ShieldX- Web/src}/styles/index.css (99%) create mode 100644 server/.gitignore create mode 100644 server/README.md create mode 100644 server/config/db.js create mode 100644 server/middleware/authMiddleware.js create mode 100644 server/models/UserR.js create mode 100644 server/package-lock.json create mode 100644 server/package.json create mode 100644 server/routes/auth.js create mode 100644 server/src/index.js create mode 100644 server/test_register.js delete mode 100644 src/pages/Login.jsx delete mode 100644 src/pages/Signup.jsx diff --git a/.github/workflows/build_test.yml b/.github/workflows/build_test.yml index 8baa075..717560c 100644 --- a/.github/workflows/build_test.yml +++ b/.github/workflows/build_test.yml @@ -24,13 +24,13 @@ jobs: with: node-version: 22 - - name: Install dependencies (web) + - name: Install dependencies (frontend) run: npm ci - working-directory: ShieldX- Web + working-directory: ShieldX-Web - - name: Build app (web) + - name: Build app (frontend) run: npm run build - working-directory: web + working-directory: ShieldX-Web - name: Deploy to Vercel if: github.ref == 'refs/heads/prod' diff --git a/.github/workflows/lint_test.yml b/.github/workflows/lint_test.yml index 24965f0..c0ea240 100644 --- a/.github/workflows/lint_test.yml +++ b/.github/workflows/lint_test.yml @@ -2,9 +2,9 @@ name: React CI Pipeline on: pull_request: - branches: [ main, prod ] + branches: [ main ] push: - branches: [ main, prod ] + branches: [ main ] jobs: lint: @@ -14,15 +14,15 @@ jobs: - uses: actions/setup-node@v4 with: - node-version: 22 + node-version: 22.17.1 - - name: Install deps (web) + - name: Install dependencies (frontend) run: npm ci - working-directory: web + working-directory: ShieldX-Web - - name: Run lint + - name: Run lint (frontend) run: npm run lint - working-directory: web + working-directory: ShieldX-Web build: runs-on: ubuntu-latest @@ -32,12 +32,12 @@ jobs: - uses: actions/setup-node@v4 with: - node-version: 22 + node-version: 22.17.1 - - name: Install deps (web) + - name: Install dependencies (frontend) run: npm ci - working-directory: ShieldX- Web + working-directory: ShieldX-Web - - name: Build app (web) + - name: Build app (frontend) run: npm run build - working-directory: web + working-directory: ShieldX-Web diff --git a/ShieldX- Web/.gitignore b/ShieldX- Web/.gitignore new file mode 100644 index 0000000..40b878d --- /dev/null +++ b/ShieldX- Web/.gitignore @@ -0,0 +1 @@ +node_modules/ \ No newline at end of file diff --git a/README.md b/ShieldX- Web/README.md similarity index 55% rename from README.md rename to ShieldX- Web/README.md index 37cf89f..8aa9ea1 100644 --- a/README.md +++ b/ShieldX- Web/README.md @@ -5,7 +5,7 @@ This folder contains a Vite React app converted from the React Native project. I How to run (Windows cmd.exe): ```cmd -cd converted-web +cd "ShieldX- Web" npm install npm run dev ``` @@ -21,4 +21,20 @@ Next steps I can do on request: - Implement file upload for Evidence and integrate API endpoints - Convert remaining screens with fidelity and accessibility improvements -If you want me to continue and convert every RN screen precisely to web components (no RN imports), tell me and I will proceed screen-by-screen. \ No newline at end of file +If you want me to continue and convert every RN screen precisely to web components (no RN imports), tell me and I will proceed screen-by-screen. + +## Backend API (optional) + +You can connect the frontend to the Node/Express backend to use real MongoDB-backed signup/login. + +1. Start the server in `server/` and set the API URL in your frontend environment. With Vite you should use a Vite-prefixed env var: + + - create a `.env` file in the frontend root with (Vite): + VITE_API_URL=http://localhost:4000 + + - or for older setups you can use the CRA-style var: + REACT_APP_API_URL=http://localhost:4000 + +2. Restart the dev server. Signup/Login will call the backend endpoints when `VITE_API_URL` or `REACT_APP_API_URL` is set. + +If not set, the app falls back to the local `localStorage`-based auth (demo mode). \ No newline at end of file diff --git a/ShieldX- Web/dist/assets/index-16523284.css b/ShieldX- Web/dist/assets/index-16523284.css new file mode 100644 index 0000000..3d1a59c --- /dev/null +++ b/ShieldX- Web/dist/assets/index-16523284.css @@ -0,0 +1 @@ +:root{--red: #E53935;--muted: #888;--bg: #fff }*{box-sizing:border-box}html,body,#root{height:100%;margin:0;font-family:Inter,system-ui,-apple-system,Segoe UI,Roboto,Helvetica Neue,Arial}.app-root{min-height:100vh;background:var(--bg)}.main-content{padding:16px}.bottom-tabs{position:fixed;left:0;right:0;bottom:0;height:64px;background:#fff;border-top:1px solid #eee;display:flex;align-items:center;justify-content:space-around;padding:8px 12px}.bottom-tabs .tab{display:flex;flex-direction:column;align-items:center;color:#777;text-decoration:none}.bottom-tabs .tab.active{color:var(--red)}.bottom-tabs .tab-label{font-size:12px;margin-top:4px}.main-content{padding-bottom:88px}.safe-area{min-height:80vh;padding:8px}.header-row{display:flex;align-items:center;justify-content:space-between;padding:8px 12px;margin-bottom:8px}.header-title{font-size:20px;font-weight:700;color:#222}.header-icon{background:#f5f5f5;border-radius:20px;padding:8px;border:none}.status-bar{display:flex;align-items:center;gap:8px;background:#f7f7fa;border-radius:12px;border:1px solid #e0e0e0;padding:10px 14px;margin:8px 0}.status-bar.panic{background:#fff3f3;border-color:var(--red)}.status-text{font-size:16px;color:#222;font-weight:600}.status-text.panic{color:var(--red);font-weight:700}.sos-container{text-align:center;margin:14px 0}.sos-button{width:220px;height:220px;border-radius:110px;background:var(--red);color:#fff;display:inline-flex;flex-direction:column;align-items:center;justify-content:center;border:0;box-shadow:0 8px 16px #e539352e;cursor:pointer}.sos-button:disabled{opacity:.85;cursor:default}.sos-button.active{background:#fff;border:4px solid var(--red)}.sos-text{color:#fff;font-size:36px;font-weight:700;margin-top:8px;letter-spacing:2px}.sos-text.active{color:var(--red)}.sos-subtext{color:var(--muted);font-size:16px;margin-top:10px}.quick-actions-section{margin-top:10px;padding:0 4px}.quick-actions-title{font-size:18px;font-weight:700;margin-bottom:12px}.quick-actions-grid{display:flex;gap:16px;margin-bottom:16px}.quick-action-box{flex:1;background:#f7f7fa;border-radius:18px;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:16px;min-height:96px;cursor:pointer;transition:box-shadow .15s ease,transform .12s ease;text-align:center}.quick-action-label{margin-top:10px;font-size:15px;font-weight:600;color:#222}.auth-screen{max-width:420px;margin:20px auto;padding:16px;background:#fff;border-radius:12px;box-shadow:0 4px 12px #0000000d}.auth-form{display:flex;flex-direction:column;gap:12px}.auth-form input{padding:10px;border-radius:8px;border:1px solid #e0e0e0}.auth-form button{background:var(--red);color:#fff;padding:10px;border-radius:8px;border:0;cursor:pointer}@media (max-width:600px){.quick-actions-grid{flex-direction:column}.quick-action-box{width:100%}}.quick-action-box:focus,.quick-action-box:hover{box-shadow:0 8px 20px #0000000f;transform:translateY(-4px);outline:none}.quick-action-box svg{display:block}.quick-action-label{line-height:1.1}.chat-screen{display:flex;flex-direction:column;height:calc(100vh - 64px);max-height:100vh}.chat-header{display:flex;align-items:center;justify-content:space-between;padding:10px}.back-btn{background:none;border:0;font-size:20px;cursor:pointer}.chat-title{font-size:20px;font-weight:700;color:#222}.avatar-row{display:flex;justify-content:center;margin-bottom:8px}.avatar-circle{width:60px;height:60px;border-radius:30px;background:#eee;display:flex;align-items:center;justify-content:center;position:relative}.avatar-status{position:absolute;right:8px;bottom:8px;width:12px;height:12px;border-radius:6px;background:#3ecf4a;border:2px solid #fff}.chat-area{flex:1;overflow:auto;padding:10px}.bubble-row{display:flex;align-items:flex-end;margin-bottom:12px}.bubble-row.user{justify-content:flex-end}.bubble-avatar,.bubble-avatar-user{width:36px;height:36px;border-radius:18px;background:#ddd;display:flex;align-items:center;justify-content:center}.bubble-avatar{margin-right:8px}.bubble-avatar-user{margin-left:8px}.bubble-left{background:#f7f7fa;border-radius:16px;padding:12px;max-width:70%}.bubble-right{background:#E53935;border-radius:16px;padding:12px;max-width:70%}.bubble-sender{font-size:12px;color:#b71c1c;font-weight:700;margin-bottom:6px}.bubble-text{font-size:15px;color:#222}.bubble-text-user{font-size:15px;color:#fff}.typing-indicator{display:flex;align-items:center;justify-content:center;margin:8px 0}.spinner{width:16px;height:16px;border-radius:8px;background:var(--red);animation:spin 1s linear infinite;margin-right:8px}.typing-text{color:var(--red);font-size:13px}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.input-bar{display:flex;align-items:center;padding:10px;border-top:1px solid #eee;background:#fff}.chat-input{flex:1;background:#f7f7fa;border-radius:20px;padding:10px 14px;font-size:15px;border:1px solid #eee;margin-right:8px}.input-mic{background:none;border:0;margin-right:8px}.input-send{background:var(--red);border:0;border-radius:20px;padding:8px;display:flex;align-items:center;justify-content:center;color:#fff;cursor:pointer}.status-card{background:#f7f7fa;border-radius:14px;padding:16px;margin:12px}.status-card.offline{background:#fff3f3}.status-card.mesh{background:#e3f2fd}.queued-section{background:#fff8f0;border-radius:14px;padding:14px;margin:12px}.queued-title{font-size:15px;font-weight:700;color:var(--red);margin-bottom:8px}.queued-alert-box{display:flex;align-items:flex-start;margin-bottom:8px}.send-btn{display:inline-flex;align-items:center;background:var(--red);color:#fff;border:0;padding:8px 12px;border-radius:20px;cursor:pointer}.status-pill{padding:6px 10px;border-radius:14px;font-weight:700;background:#f0f0f0;color:#222;font-size:13px}.status-pill.online{background:#e8f8ee;color:#0b8a39}.status-pill.offline{background:#fff3f3;color:#c62828}.status-pill.mesh{background:#eaf4ff;color:#1565c0}.icon-btn{background:#fff;border:1px solid #eee;padding:8px;border-radius:10px;cursor:pointer}.alert-controls{display:flex;gap:12px;margin-top:12px}.btn{background:var(--red);color:#fff;border:0;padding:8px 12px;border-radius:8px;cursor:pointer}.btn.outline{background:#fff;border:1px solid #ddd;color:#333}.btn.small{padding:6px 8px;border-radius:6px}.btn.primary{background:var(--red);padding:6px 8px}.btn.tiny{padding:6px 8px;font-size:12px}.queued-section{background:#fff;border-radius:12px;padding:12px;margin:12px 0}.queued-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:10px}.queued-title{font-size:16px;font-weight:700;color:#222}.queued-actions{display:flex;gap:8px}.empty-queued{color:#888;font-style:italic;padding:12px}.queued-list{display:flex;flex-direction:column;gap:10px}.queued-alert-box{display:flex;align-items:flex-start;gap:12px;padding:10px;border-radius:10px;background:#fff8f0;border:1px solid #ffe6e0}.queued-left{flex:0 0 36px;display:flex;align-items:center;justify-content:center}.queued-body{flex:1}.queued-type{font-weight:700;color:var(--red);margin-bottom:6px}.queued-details{color:#333}.queued-time{color:#888;font-size:12px;margin-top:6px}.queued-actions{display:flex;flex-direction:column;gap:6px}.features-section{margin-top:16px}.features-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(140px,1fr));gap:12px;margin-bottom:12px}.feature-box{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:16px;border-radius:12px;background:#f7f7fa;min-height:96px;text-align:center}.feature-box svg{width:36px;height:36px}.feature-label{text-align:center;margin-top:8px;font-weight:600;font-size:14px;color:#222}.feature-subtext{font-size:12px;color:#666;margin-top:6px}.feature-box{transition:box-shadow .18s ease,border-color .18s ease,transform .12s ease}.feature-box:focus,.feature-box:hover{box-shadow:0 6px 18px #0000000f;transform:translateY(-4px);outline:none}.map-panel{margin-top:12px;background:#fff;border-radius:12px;border:1px solid #eee;padding:12px}.map-panel-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px}.map-panel-body{display:flex;gap:12px}.map-area{flex:1;position:relative;background:linear-gradient(180deg,#eaf3ff,#fff);height:260px;border-radius:10px;overflow:hidden;border:1px solid #dcecff}.center-dot{position:absolute;width:14px;height:14px;border-radius:7px;background:#1976d2;border:2px solid #fff;transform:translate(-50%,-50%)}.marker{position:absolute;width:30px;height:30px;border-radius:15px;background:transparent;border:0;cursor:pointer;display:flex;align-items:center;justify-content:center}.marker .marker-dot{width:12px;height:12px;border-radius:6px;background:#E53935;border:2px solid #fff;box-shadow:0 2px 6px #0000001f}.marker.selected .marker-dot{background:#1976d2}.unit-list{width:280px;display:flex;flex-direction:column;gap:8px}.unit-list-title{font-weight:700;margin-bottom:6px}.unit-item{display:flex;justify-content:space-between;align-items:center;padding:8px;border-radius:8px;border:1px solid #f0f0f0;background:#fafcff;cursor:pointer}.unit-item.active{box-shadow:0 6px 18px #1976d214;border-color:#d0e8ff}.selected-details{margin-top:10px;padding:8px;border-radius:8px;background:#f7f7fa;border:1px solid #eee}@media (max-width:720px){.map-panel-body{flex-direction:column}.unit-list{width:100%}}.evidence-screen .actions-row{display:flex;gap:12px;justify-content:center;margin:16px}.action-btn{background:var(--red);color:#fff;border:0;padding:10px 14px;border-radius:20px;cursor:pointer}.media-preview{display:flex;flex-wrap:wrap;justify-content:center;margin:12px}.media-box{width:110px;height:110px;background:#f7f7fa;border-radius:14px;margin:8px;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:6px}.media-img{width:90px;height:90px;object-fit:cover;border-radius:10px}.media-type{color:#1976d2;font-weight:700;margin-top:6px}.upload-btn{background:#1976d2;color:#fff;border:0;padding:12px 20px;border-radius:22px;display:block;margin:16px auto;cursor:pointer}.map-view{height:28vh;border-radius:18px;margin:12px;padding:12px;background:#fff}.action-row{display:flex;gap:12px;justify-content:space-evenly;margin:12px}.action-btn.alt{background:#1976d2}.emergency-row{display:flex;gap:8px;margin-top:8px}.emergency-btn{flex:1;background:#fff0f0;border-radius:14px;padding:12px;border:0;cursor:pointer}.list-section{padding:12px}.list-item{display:flex;align-items:center;background:#f7f7fa;border-radius:14px;padding:12px;margin-bottom:10px}.list-item-name{font-size:15px;font-weight:600}.list-item-address{font-size:13px;color:#888}.input{display:block;width:100%;padding:10px;border-radius:8px;border:1px solid #e0e0e0;margin-bottom:12px}.remember-row{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px}.forgot{background:none;border:0;color:red;cursor:pointer}.login-btn{background:red;color:#fff;padding:12px;border-radius:30px;border:0;display:block;width:100%;cursor:pointer}.divider-row{display:flex;align-items:center;margin:12px 0}.divider{flex:1;height:1;background:#ddd}.or-text{margin:0 10px;color:#900}.social-row{display:flex;gap:12px;justify-content:center}.social-btn{border:1px solid #ddd;padding:10px 14px;border-radius:30px;background:#fff;cursor:pointer}.bottom-nav{display:flex;justify-content:space-around;padding:12px;border-top:1px solid #eee;background:#fff}.nav-text{font-size:12px;color:#777;text-align:center}.nav-text-active{font-size:12px;color:red;text-align:center}.signup-btn{background:red;color:#fff;padding:12px;border-radius:30px;border:0;display:block;width:100%;cursor:pointer}.dividerContainer{display:flex;align-items:center;margin:12px 0}.line{flex:1;height:1;background:#ccc}.orText{margin:0 10px;color:#777}.socialContainer{display:flex;justify-content:space-evenly;margin-bottom:20px}.socialBtn{border:1px solid #ccc;padding:10px 14px;border-radius:10px;background:#fff;cursor:pointer}.link{background:none;border:0;cursor:pointer} diff --git a/ShieldX- Web/dist/assets/index-96984a42.js b/ShieldX- Web/dist/assets/index-96984a42.js new file mode 100644 index 0000000..276eabb --- /dev/null +++ b/ShieldX- Web/dist/assets/index-96984a42.js @@ -0,0 +1,62 @@ +function rd(e,t){for(var n=0;nr[l]})}}}return Object.freeze(Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}))}(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const l of document.querySelectorAll('link[rel="modulepreload"]'))r(l);new MutationObserver(l=>{for(const i of l)if(i.type==="childList")for(const o of i.addedNodes)o.tagName==="LINK"&&o.rel==="modulepreload"&&r(o)}).observe(document,{childList:!0,subtree:!0});function n(l){const i={};return l.integrity&&(i.integrity=l.integrity),l.referrerPolicy&&(i.referrerPolicy=l.referrerPolicy),l.crossOrigin==="use-credentials"?i.credentials="include":l.crossOrigin==="anonymous"?i.credentials="omit":i.credentials="same-origin",i}function r(l){if(l.ep)return;l.ep=!0;const i=n(l);fetch(l.href,i)}})();function ld(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var Ou={exports:{}},M={};/** + * @license React + * react.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var ur=Symbol.for("react.element"),id=Symbol.for("react.portal"),od=Symbol.for("react.fragment"),ad=Symbol.for("react.strict_mode"),ud=Symbol.for("react.profiler"),sd=Symbol.for("react.provider"),cd=Symbol.for("react.context"),dd=Symbol.for("react.forward_ref"),fd=Symbol.for("react.suspense"),pd=Symbol.for("react.memo"),md=Symbol.for("react.lazy"),ca=Symbol.iterator;function hd(e){return e===null||typeof e!="object"?null:(e=ca&&e[ca]||e["@@iterator"],typeof e=="function"?e:null)}var Iu={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},Du=Object.assign,Uu={};function fn(e,t,n){this.props=e,this.context=t,this.refs=Uu,this.updater=n||Iu}fn.prototype.isReactComponent={};fn.prototype.setState=function(e,t){if(typeof e!="object"&&typeof e!="function"&&e!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")};fn.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")};function Fu(){}Fu.prototype=fn.prototype;function uo(e,t,n){this.props=e,this.context=t,this.refs=Uu,this.updater=n||Iu}var so=uo.prototype=new Fu;so.constructor=uo;Du(so,fn.prototype);so.isPureReactComponent=!0;var da=Array.isArray,ju=Object.prototype.hasOwnProperty,co={current:null},Au={key:!0,ref:!0,__self:!0,__source:!0};function Bu(e,t,n){var r,l={},i=null,o=null;if(t!=null)for(r in t.ref!==void 0&&(o=t.ref),t.key!==void 0&&(i=""+t.key),t)ju.call(t,r)&&!Au.hasOwnProperty(r)&&(l[r]=t[r]);var a=arguments.length-2;if(a===1)l.children=n;else if(1>>1,q=P[K];if(0>>1;Kl(Fl,T))Ntl(mr,Fl)?(P[K]=mr,P[Nt]=T,K=Nt):(P[K]=Fl,P[Ct]=T,K=Ct);else if(Ntl(mr,T))P[K]=mr,P[Nt]=T,K=Nt;else break e}}return R}function l(P,R){var T=P.sortIndex-R.sortIndex;return T!==0?T:P.id-R.id}if(typeof performance=="object"&&typeof performance.now=="function"){var i=performance;e.unstable_now=function(){return i.now()}}else{var o=Date,a=o.now();e.unstable_now=function(){return o.now()-a}}var u=[],c=[],h=1,p=null,m=3,g=!1,y=!1,E=!1,x=typeof setTimeout=="function"?setTimeout:null,f=typeof clearTimeout=="function"?clearTimeout:null,d=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function v(P){for(var R=n(c);R!==null;){if(R.callback===null)r(c);else if(R.startTime<=P)r(c),R.sortIndex=R.expirationTime,t(u,R);else break;R=n(c)}}function w(P){if(E=!1,v(P),!y)if(n(u)!==null)y=!0,Dl(C);else{var R=n(c);R!==null&&Ul(w,R.startTime-P)}}function C(P,R){y=!1,E&&(E=!1,f(L),L=-1),g=!0;var T=m;try{for(v(R),p=n(u);p!==null&&(!(p.expirationTime>R)||P&&!Le());){var K=p.callback;if(typeof K=="function"){p.callback=null,m=p.priorityLevel;var q=K(p.expirationTime<=R);R=e.unstable_now(),typeof q=="function"?p.callback=q:p===n(u)&&r(u),v(R)}else r(u);p=n(u)}if(p!==null)var pr=!0;else{var Ct=n(c);Ct!==null&&Ul(w,Ct.startTime-R),pr=!1}return pr}finally{p=null,m=T,g=!1}}var z=!1,_=null,L=-1,Q=5,O=-1;function Le(){return!(e.unstable_now()-OP||125K?(P.sortIndex=T,t(c,P),n(u)===null&&P===n(c)&&(E?(f(L),L=-1):E=!0,Ul(w,T-K))):(P.sortIndex=q,t(u,P),y||g||(y=!0,Dl(C))),P},e.unstable_shouldYield=Le,e.unstable_wrapCallback=function(P){var R=m;return function(){var T=m;m=R;try{return P.apply(this,arguments)}finally{m=T}}}})(Hu);Vu.exports=Hu;var Sd=Vu.exports;/** + * @license React + * react-dom.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var Wu=S,we=Sd;function k(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),fi=Object.prototype.hasOwnProperty,kd=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,pa={},ma={};function Cd(e){return fi.call(ma,e)?!0:fi.call(pa,e)?!1:kd.test(e)?ma[e]=!0:(pa[e]=!0,!1)}function Nd(e,t,n,r){if(n!==null&&n.type===0)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return r?!1:n!==null?!n.acceptsBooleans:(e=e.toLowerCase().slice(0,5),e!=="data-"&&e!=="aria-");default:return!1}}function xd(e,t,n,r){if(t===null||typeof t>"u"||Nd(e,t,n,r))return!0;if(r)return!1;if(n!==null)switch(n.type){case 3:return!t;case 4:return t===!1;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}function de(e,t,n,r,l,i,o){this.acceptsBooleans=t===2||t===3||t===4,this.attributeName=r,this.attributeNamespace=l,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=i,this.removeEmptyString=o}var re={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){re[e]=new de(e,0,!1,e,null,!1,!1)});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];re[t]=new de(t,1,!1,e[1],null,!1,!1)});["contentEditable","draggable","spellCheck","value"].forEach(function(e){re[e]=new de(e,2,!1,e.toLowerCase(),null,!1,!1)});["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){re[e]=new de(e,2,!1,e,null,!1,!1)});"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){re[e]=new de(e,3,!1,e.toLowerCase(),null,!1,!1)});["checked","multiple","muted","selected"].forEach(function(e){re[e]=new de(e,3,!0,e,null,!1,!1)});["capture","download"].forEach(function(e){re[e]=new de(e,4,!1,e,null,!1,!1)});["cols","rows","size","span"].forEach(function(e){re[e]=new de(e,6,!1,e,null,!1,!1)});["rowSpan","start"].forEach(function(e){re[e]=new de(e,5,!1,e.toLowerCase(),null,!1,!1)});var po=/[\-:]([a-z])/g;function mo(e){return e[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(e){var t=e.replace(po,mo);re[t]=new de(t,1,!1,e,null,!1,!1)});"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var t=e.replace(po,mo);re[t]=new de(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)});["xml:base","xml:lang","xml:space"].forEach(function(e){var t=e.replace(po,mo);re[t]=new de(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)});["tabIndex","crossOrigin"].forEach(function(e){re[e]=new de(e,1,!1,e.toLowerCase(),null,!1,!1)});re.xlinkHref=new de("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1);["src","href","action","formAction"].forEach(function(e){re[e]=new de(e,1,!1,e.toLowerCase(),null,!0,!0)});function ho(e,t,n,r){var l=re.hasOwnProperty(t)?re[t]:null;(l!==null?l.type!==0:r||!(2a||l[o]!==i[a]){var u=` +`+l[o].replace(" at new "," at ");return e.displayName&&u.includes("")&&(u=u.replace("",e.displayName)),u}while(1<=o&&0<=a);break}}}finally{Bl=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:"")?Rn(e):""}function Pd(e){switch(e.tag){case 5:return Rn(e.type);case 16:return Rn("Lazy");case 13:return Rn("Suspense");case 19:return Rn("SuspenseList");case 0:case 2:case 15:return e=$l(e.type,!1),e;case 11:return e=$l(e.type.render,!1),e;case 1:return e=$l(e.type,!0),e;default:return""}}function vi(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case $t:return"Fragment";case Bt:return"Portal";case pi:return"Profiler";case vo:return"StrictMode";case mi:return"Suspense";case hi:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case Yu:return(e.displayName||"Context")+".Consumer";case Ku:return(e._context.displayName||"Context")+".Provider";case go:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case yo:return t=e.displayName||null,t!==null?t:vi(e.type)||"Memo";case et:t=e._payload,e=e._init;try{return vi(e(t))}catch{}}return null}function zd(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=t.render,e=e.displayName||e.name||"",t.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return vi(t);case 8:return t===vo?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof t=="function")return t.displayName||t.name||null;if(typeof t=="string")return t}return null}function gt(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function Xu(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function _d(e){var t=Xu(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=""+e[t];if(!e.hasOwnProperty(t)&&typeof n<"u"&&typeof n.get=="function"&&typeof n.set=="function"){var l=n.get,i=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return l.call(this)},set:function(o){r=""+o,i.call(this,o)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return r},setValue:function(o){r=""+o},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function gr(e){e._valueTracker||(e._valueTracker=_d(e))}function Ju(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r="";return e&&(r=Xu(e)?e.checked?"true":"false":e.value),e=r,e!==n?(t.setValue(e),!0):!1}function Kr(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function gi(e,t){var n=t.checked;return V({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:n??e._wrapperState.initialChecked})}function va(e,t){var n=t.defaultValue==null?"":t.defaultValue,r=t.checked!=null?t.checked:t.defaultChecked;n=gt(t.value!=null?t.value:n),e._wrapperState={initialChecked:r,initialValue:n,controlled:t.type==="checkbox"||t.type==="radio"?t.checked!=null:t.value!=null}}function Zu(e,t){t=t.checked,t!=null&&ho(e,"checked",t,!1)}function yi(e,t){Zu(e,t);var n=gt(t.value),r=t.type;if(n!=null)r==="number"?(n===0&&e.value===""||e.value!=n)&&(e.value=""+n):e.value!==""+n&&(e.value=""+n);else if(r==="submit"||r==="reset"){e.removeAttribute("value");return}t.hasOwnProperty("value")?Ei(e,t.type,n):t.hasOwnProperty("defaultValue")&&Ei(e,t.type,gt(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function ga(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var r=t.type;if(!(r!=="submit"&&r!=="reset"||t.value!==void 0&&t.value!==null))return;t=""+e._wrapperState.initialValue,n||t===e.value||(e.value=t),e.defaultValue=t}n=e.name,n!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,n!==""&&(e.name=n)}function Ei(e,t,n){(t!=="number"||Kr(e.ownerDocument)!==e)&&(n==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+n&&(e.defaultValue=""+n))}var Tn=Array.isArray;function qt(e,t,n,r){if(e=e.options,t){t={};for(var l=0;l"+t.valueOf().toString()+"",t=yr.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function Wn(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&n.nodeType===3){n.nodeValue=t;return}}e.textContent=t}var In={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},Ld=["Webkit","ms","Moz","O"];Object.keys(In).forEach(function(e){Ld.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),In[t]=In[e]})});function ts(e,t,n){return t==null||typeof t=="boolean"||t===""?"":n||typeof t!="number"||t===0||In.hasOwnProperty(e)&&In[e]?(""+t).trim():t+"px"}function ns(e,t){e=e.style;for(var n in t)if(t.hasOwnProperty(n)){var r=n.indexOf("--")===0,l=ts(n,t[n],r);n==="float"&&(n="cssFloat"),r?e.setProperty(n,l):e[n]=l}}var Rd=V({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function ki(e,t){if(t){if(Rd[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(k(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(k(60));if(typeof t.dangerouslySetInnerHTML!="object"||!("__html"in t.dangerouslySetInnerHTML))throw Error(k(61))}if(t.style!=null&&typeof t.style!="object")throw Error(k(62))}}function Ci(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var Ni=null;function Eo(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var xi=null,bt=null,en=null;function wa(e){if(e=dr(e)){if(typeof xi!="function")throw Error(k(280));var t=e.stateNode;t&&(t=Cl(t),xi(e.stateNode,e.type,t))}}function rs(e){bt?en?en.push(e):en=[e]:bt=e}function ls(){if(bt){var e=bt,t=en;if(en=bt=null,wa(e),t)for(e=0;e>>=0,e===0?32:31-($d(e)/Vd|0)|0}var Er=64,wr=4194304;function Mn(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function Jr(e,t){var n=e.pendingLanes;if(n===0)return 0;var r=0,l=e.suspendedLanes,i=e.pingedLanes,o=n&268435455;if(o!==0){var a=o&~l;a!==0?r=Mn(a):(i&=o,i!==0&&(r=Mn(i)))}else o=n&~l,o!==0?r=Mn(o):i!==0&&(r=Mn(i));if(r===0)return 0;if(t!==0&&t!==r&&!(t&l)&&(l=r&-r,i=t&-t,l>=i||l===16&&(i&4194240)!==0))return t;if(r&4&&(r|=n&16),t=e.entangledLanes,t!==0)for(e=e.entanglements,t&=r;0n;n++)t.push(e);return t}function sr(e,t,n){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-Ie(t),e[t]=n}function Kd(e,t){var n=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var r=e.eventTimes;for(e=e.expirationTimes;0=Un),La=String.fromCharCode(32),Ra=!1;function Ns(e,t){switch(e){case"keyup":return Sf.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function xs(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var Vt=!1;function Cf(e,t){switch(e){case"compositionend":return xs(t);case"keypress":return t.which!==32?null:(Ra=!0,La);case"textInput":return e=t.data,e===La&&Ra?null:e;default:return null}}function Nf(e,t){if(Vt)return e==="compositionend"||!zo&&Ns(e,t)?(e=ks(),Ur=No=lt=null,Vt=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=r}e:{for(;n;){if(n.nextSibling){n=n.nextSibling;break e}n=n.parentNode}n=void 0}n=Ia(n)}}function Ls(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?Ls(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function Rs(){for(var e=window,t=Kr();t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href=="string"}catch{n=!1}if(n)e=t.contentWindow;else break;t=Kr(e.document)}return t}function _o(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}function Of(e){var t=Rs(),n=e.focusedElem,r=e.selectionRange;if(t!==n&&n&&n.ownerDocument&&Ls(n.ownerDocument.documentElement,n)){if(r!==null&&_o(n)){if(t=r.start,e=r.end,e===void 0&&(e=t),"selectionStart"in n)n.selectionStart=t,n.selectionEnd=Math.min(e,n.value.length);else if(e=(t=n.ownerDocument||document)&&t.defaultView||window,e.getSelection){e=e.getSelection();var l=n.textContent.length,i=Math.min(r.start,l);r=r.end===void 0?i:Math.min(r.end,l),!e.extend&&i>r&&(l=r,r=i,i=l),l=Da(n,i);var o=Da(n,r);l&&o&&(e.rangeCount!==1||e.anchorNode!==l.node||e.anchorOffset!==l.offset||e.focusNode!==o.node||e.focusOffset!==o.offset)&&(t=t.createRange(),t.setStart(l.node,l.offset),e.removeAllRanges(),i>r?(e.addRange(t),e.extend(o.node,o.offset)):(t.setEnd(o.node,o.offset),e.addRange(t)))}}for(t=[],e=n;e=e.parentNode;)e.nodeType===1&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof n.focus=="function"&&n.focus(),n=0;n=document.documentMode,Ht=null,Ti=null,jn=null,Mi=!1;function Ua(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;Mi||Ht==null||Ht!==Kr(r)||(r=Ht,"selectionStart"in r&&_o(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),jn&&Jn(jn,r)||(jn=r,r=br(Ti,"onSelect"),0Kt||(e.current=ji[Kt],ji[Kt]=null,Kt--)}function U(e,t){Kt++,ji[Kt]=e.current,e.current=t}var yt={},ae=wt(yt),me=wt(!1),Mt=yt;function on(e,t){var n=e.type.contextTypes;if(!n)return yt;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===t)return r.__reactInternalMemoizedMaskedChildContext;var l={},i;for(i in n)l[i]=t[i];return r&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=l),l}function he(e){return e=e.childContextTypes,e!=null}function tl(){j(me),j(ae)}function Ha(e,t,n){if(ae.current!==yt)throw Error(k(168));U(ae,t),U(me,n)}function As(e,t,n){var r=e.stateNode;if(t=t.childContextTypes,typeof r.getChildContext!="function")return n;r=r.getChildContext();for(var l in r)if(!(l in t))throw Error(k(108,zd(e)||"Unknown",l));return V({},n,r)}function nl(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||yt,Mt=ae.current,U(ae,e),U(me,me.current),!0}function Wa(e,t,n){var r=e.stateNode;if(!r)throw Error(k(169));n?(e=As(e,t,Mt),r.__reactInternalMemoizedMergedChildContext=e,j(me),j(ae),U(ae,e)):j(me),U(me,n)}var We=null,Nl=!1,ti=!1;function Bs(e){We===null?We=[e]:We.push(e)}function Qf(e){Nl=!0,Bs(e)}function St(){if(!ti&&We!==null){ti=!0;var e=0,t=D;try{var n=We;for(D=1;e>=o,l-=o,Qe=1<<32-Ie(t)+l|n<L?(Q=_,_=null):Q=_.sibling;var O=m(f,_,v[L],w);if(O===null){_===null&&(_=Q);break}e&&_&&O.alternate===null&&t(f,_),d=i(O,d,L),z===null?C=O:z.sibling=O,z=O,_=Q}if(L===v.length)return n(f,_),A&&xt(f,L),C;if(_===null){for(;LL?(Q=_,_=null):Q=_.sibling;var Le=m(f,_,O.value,w);if(Le===null){_===null&&(_=Q);break}e&&_&&Le.alternate===null&&t(f,_),d=i(Le,d,L),z===null?C=Le:z.sibling=Le,z=Le,_=Q}if(O.done)return n(f,_),A&&xt(f,L),C;if(_===null){for(;!O.done;L++,O=v.next())O=p(f,O.value,w),O!==null&&(d=i(O,d,L),z===null?C=O:z.sibling=O,z=O);return A&&xt(f,L),C}for(_=r(f,_);!O.done;L++,O=v.next())O=g(_,f,L,O.value,w),O!==null&&(e&&O.alternate!==null&&_.delete(O.key===null?L:O.key),d=i(O,d,L),z===null?C=O:z.sibling=O,z=O);return e&&_.forEach(function(wn){return t(f,wn)}),A&&xt(f,L),C}function x(f,d,v,w){if(typeof v=="object"&&v!==null&&v.type===$t&&v.key===null&&(v=v.props.children),typeof v=="object"&&v!==null){switch(v.$$typeof){case vr:e:{for(var C=v.key,z=d;z!==null;){if(z.key===C){if(C=v.type,C===$t){if(z.tag===7){n(f,z.sibling),d=l(z,v.props.children),d.return=f,f=d;break e}}else if(z.elementType===C||typeof C=="object"&&C!==null&&C.$$typeof===et&&Za(C)===z.type){n(f,z.sibling),d=l(z,v.props),d.ref=zn(f,z,v),d.return=f,f=d;break e}n(f,z);break}else t(f,z);z=z.sibling}v.type===$t?(d=Tt(v.props.children,f.mode,w,v.key),d.return=f,f=d):(w=Wr(v.type,v.key,v.props,null,f.mode,w),w.ref=zn(f,d,v),w.return=f,f=w)}return o(f);case Bt:e:{for(z=v.key;d!==null;){if(d.key===z)if(d.tag===4&&d.stateNode.containerInfo===v.containerInfo&&d.stateNode.implementation===v.implementation){n(f,d.sibling),d=l(d,v.children||[]),d.return=f,f=d;break e}else{n(f,d);break}else t(f,d);d=d.sibling}d=si(v,f.mode,w),d.return=f,f=d}return o(f);case et:return z=v._init,x(f,d,z(v._payload),w)}if(Tn(v))return y(f,d,v,w);if(kn(v))return E(f,d,v,w);zr(f,v)}return typeof v=="string"&&v!==""||typeof v=="number"?(v=""+v,d!==null&&d.tag===6?(n(f,d.sibling),d=l(d,v),d.return=f,f=d):(n(f,d),d=ui(v,f.mode,w),d.return=f,f=d),o(f)):n(f,d)}return x}var un=Gs(!0),Xs=Gs(!1),fr={},$e=wt(fr),er=wt(fr),tr=wt(fr);function Lt(e){if(e===fr)throw Error(k(174));return e}function Fo(e,t){switch(U(tr,t),U(er,e),U($e,fr),e=t.nodeType,e){case 9:case 11:t=(t=t.documentElement)?t.namespaceURI:Si(null,"");break;default:e=e===8?t.parentNode:t,t=e.namespaceURI||null,e=e.tagName,t=Si(t,e)}j($e),U($e,t)}function sn(){j($e),j(er),j(tr)}function Js(e){Lt(tr.current);var t=Lt($e.current),n=Si(t,e.type);t!==n&&(U(er,e),U($e,n))}function jo(e){er.current===e&&(j($e),j(er))}var B=wt(0);function ul(e){for(var t=e;t!==null;){if(t.tag===13){var n=t.memoizedState;if(n!==null&&(n=n.dehydrated,n===null||n.data==="$?"||n.data==="$!"))return t}else if(t.tag===19&&t.memoizedProps.revealOrder!==void 0){if(t.flags&128)return t}else if(t.child!==null){t.child.return=t,t=t.child;continue}if(t===e)break;for(;t.sibling===null;){if(t.return===null||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}var ni=[];function Ao(){for(var e=0;en?n:4,e(!0);var r=ri.transition;ri.transition={};try{e(!1),t()}finally{D=n,ri.transition=r}}function fc(){return _e().memoizedState}function Xf(e,t,n){var r=pt(e);if(n={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null},pc(e))mc(t,n);else if(n=Ws(e,t,n,r),n!==null){var l=se();De(n,e,r,l),hc(n,t,r)}}function Jf(e,t,n){var r=pt(e),l={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null};if(pc(e))mc(t,l);else{var i=e.alternate;if(e.lanes===0&&(i===null||i.lanes===0)&&(i=t.lastRenderedReducer,i!==null))try{var o=t.lastRenderedState,a=i(o,n);if(l.hasEagerState=!0,l.eagerState=a,Ue(a,o)){var u=t.interleaved;u===null?(l.next=l,Do(t)):(l.next=u.next,u.next=l),t.interleaved=l;return}}catch{}finally{}n=Ws(e,t,l,r),n!==null&&(l=se(),De(n,e,r,l),hc(n,t,r))}}function pc(e){var t=e.alternate;return e===$||t!==null&&t===$}function mc(e,t){An=sl=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function hc(e,t,n){if(n&4194240){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,So(e,n)}}var cl={readContext:ze,useCallback:le,useContext:le,useEffect:le,useImperativeHandle:le,useInsertionEffect:le,useLayoutEffect:le,useMemo:le,useReducer:le,useRef:le,useState:le,useDebugValue:le,useDeferredValue:le,useTransition:le,useMutableSource:le,useSyncExternalStore:le,useId:le,unstable_isNewReconciler:!1},Zf={readContext:ze,useCallback:function(e,t){return je().memoizedState=[e,t===void 0?null:t],e},useContext:ze,useEffect:ba,useImperativeHandle:function(e,t,n){return n=n!=null?n.concat([e]):null,Br(4194308,4,ac.bind(null,t,e),n)},useLayoutEffect:function(e,t){return Br(4194308,4,e,t)},useInsertionEffect:function(e,t){return Br(4,2,e,t)},useMemo:function(e,t){var n=je();return t=t===void 0?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var r=je();return t=n!==void 0?n(t):t,r.memoizedState=r.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},r.queue=e,e=e.dispatch=Xf.bind(null,$,e),[r.memoizedState,e]},useRef:function(e){var t=je();return e={current:e},t.memoizedState=e},useState:qa,useDebugValue:Wo,useDeferredValue:function(e){return je().memoizedState=e},useTransition:function(){var e=qa(!1),t=e[0];return e=Gf.bind(null,e[1]),je().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,n){var r=$,l=je();if(A){if(n===void 0)throw Error(k(407));n=n()}else{if(n=t(),ee===null)throw Error(k(349));It&30||bs(r,t,n)}l.memoizedState=n;var i={value:n,getSnapshot:t};return l.queue=i,ba(tc.bind(null,r,i,e),[e]),r.flags|=2048,lr(9,ec.bind(null,r,i,n,t),void 0,null),n},useId:function(){var e=je(),t=ee.identifierPrefix;if(A){var n=Ke,r=Qe;n=(r&~(1<<32-Ie(r)-1)).toString(32)+n,t=":"+t+"R"+n,n=nr++,0<\/script>",e=e.removeChild(e.firstChild)):typeof r.is=="string"?e=o.createElement(n,{is:r.is}):(e=o.createElement(n),n==="select"&&(o=e,r.multiple?o.multiple=!0:r.size&&(o.size=r.size))):e=o.createElementNS(e,n),e[Ae]=t,e[bn]=r,Nc(e,t,!1,!1),t.stateNode=e;e:{switch(o=Ci(n,r),n){case"dialog":F("cancel",e),F("close",e),l=r;break;case"iframe":case"object":case"embed":F("load",e),l=r;break;case"video":case"audio":for(l=0;ldn&&(t.flags|=128,r=!0,_n(i,!1),t.lanes=4194304)}else{if(!r)if(e=ul(o),e!==null){if(t.flags|=128,r=!0,n=e.updateQueue,n!==null&&(t.updateQueue=n,t.flags|=4),_n(i,!0),i.tail===null&&i.tailMode==="hidden"&&!o.alternate&&!A)return ie(t),null}else 2*Y()-i.renderingStartTime>dn&&n!==1073741824&&(t.flags|=128,r=!0,_n(i,!1),t.lanes=4194304);i.isBackwards?(o.sibling=t.child,t.child=o):(n=i.last,n!==null?n.sibling=o:t.child=o,i.last=o)}return i.tail!==null?(t=i.tail,i.rendering=t,i.tail=t.sibling,i.renderingStartTime=Y(),t.sibling=null,n=B.current,U(B,r?n&1|2:n&1),t):(ie(t),null);case 22:case 23:return Jo(),r=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==r&&(t.flags|=8192),r&&t.mode&1?ge&1073741824&&(ie(t),t.subtreeFlags&6&&(t.flags|=8192)):ie(t),null;case 24:return null;case 25:return null}throw Error(k(156,t.tag))}function ip(e,t){switch(Ro(t),t.tag){case 1:return he(t.type)&&tl(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return sn(),j(me),j(ae),Ao(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 5:return jo(t),null;case 13:if(j(B),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(k(340));an()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return j(B),null;case 4:return sn(),null;case 10:return Io(t.type._context),null;case 22:case 23:return Jo(),null;case 24:return null;default:return null}}var Lr=!1,oe=!1,op=typeof WeakSet=="function"?WeakSet:Set,N=null;function Jt(e,t){var n=e.ref;if(n!==null)if(typeof n=="function")try{n(null)}catch(r){W(e,t,r)}else n.current=null}function Ji(e,t,n){try{n()}catch(r){W(e,t,r)}}var uu=!1;function ap(e,t){if(Oi=Zr,e=Rs(),_o(e)){if("selectionStart"in e)var n={start:e.selectionStart,end:e.selectionEnd};else e:{n=(n=e.ownerDocument)&&n.defaultView||window;var r=n.getSelection&&n.getSelection();if(r&&r.rangeCount!==0){n=r.anchorNode;var l=r.anchorOffset,i=r.focusNode;r=r.focusOffset;try{n.nodeType,i.nodeType}catch{n=null;break e}var o=0,a=-1,u=-1,c=0,h=0,p=e,m=null;t:for(;;){for(var g;p!==n||l!==0&&p.nodeType!==3||(a=o+l),p!==i||r!==0&&p.nodeType!==3||(u=o+r),p.nodeType===3&&(o+=p.nodeValue.length),(g=p.firstChild)!==null;)m=p,p=g;for(;;){if(p===e)break t;if(m===n&&++c===l&&(a=o),m===i&&++h===r&&(u=o),(g=p.nextSibling)!==null)break;p=m,m=p.parentNode}p=g}n=a===-1||u===-1?null:{start:a,end:u}}else n=null}n=n||{start:0,end:0}}else n=null;for(Ii={focusedElem:e,selectionRange:n},Zr=!1,N=t;N!==null;)if(t=N,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,N=e;else for(;N!==null;){t=N;try{var y=t.alternate;if(t.flags&1024)switch(t.tag){case 0:case 11:case 15:break;case 1:if(y!==null){var E=y.memoizedProps,x=y.memoizedState,f=t.stateNode,d=f.getSnapshotBeforeUpdate(t.elementType===t.type?E:Te(t.type,E),x);f.__reactInternalSnapshotBeforeUpdate=d}break;case 3:var v=t.stateNode.containerInfo;v.nodeType===1?v.textContent="":v.nodeType===9&&v.documentElement&&v.removeChild(v.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(k(163))}}catch(w){W(t,t.return,w)}if(e=t.sibling,e!==null){e.return=t.return,N=e;break}N=t.return}return y=uu,uu=!1,y}function Bn(e,t,n){var r=t.updateQueue;if(r=r!==null?r.lastEffect:null,r!==null){var l=r=r.next;do{if((l.tag&e)===e){var i=l.destroy;l.destroy=void 0,i!==void 0&&Ji(t,n,i)}l=l.next}while(l!==r)}}function zl(e,t){if(t=t.updateQueue,t=t!==null?t.lastEffect:null,t!==null){var n=t=t.next;do{if((n.tag&e)===e){var r=n.create;n.destroy=r()}n=n.next}while(n!==t)}}function Zi(e){var t=e.ref;if(t!==null){var n=e.stateNode;switch(e.tag){case 5:e=n;break;default:e=n}typeof t=="function"?t(e):t.current=e}}function zc(e){var t=e.alternate;t!==null&&(e.alternate=null,zc(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[Ae],delete t[bn],delete t[Fi],delete t[Hf],delete t[Wf])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function _c(e){return e.tag===5||e.tag===3||e.tag===4}function su(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||_c(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function qi(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.nodeType===8?n.parentNode.insertBefore(e,t):n.insertBefore(e,t):(n.nodeType===8?(t=n.parentNode,t.insertBefore(e,n)):(t=n,t.appendChild(e)),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=el));else if(r!==4&&(e=e.child,e!==null))for(qi(e,t,n),e=e.sibling;e!==null;)qi(e,t,n),e=e.sibling}function bi(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(r!==4&&(e=e.child,e!==null))for(bi(e,t,n),e=e.sibling;e!==null;)bi(e,t,n),e=e.sibling}var te=null,Me=!1;function be(e,t,n){for(n=n.child;n!==null;)Lc(e,t,n),n=n.sibling}function Lc(e,t,n){if(Be&&typeof Be.onCommitFiberUnmount=="function")try{Be.onCommitFiberUnmount(El,n)}catch{}switch(n.tag){case 5:oe||Jt(n,t);case 6:var r=te,l=Me;te=null,be(e,t,n),te=r,Me=l,te!==null&&(Me?(e=te,n=n.stateNode,e.nodeType===8?e.parentNode.removeChild(n):e.removeChild(n)):te.removeChild(n.stateNode));break;case 18:te!==null&&(Me?(e=te,n=n.stateNode,e.nodeType===8?ei(e.parentNode,n):e.nodeType===1&&ei(e,n),Gn(e)):ei(te,n.stateNode));break;case 4:r=te,l=Me,te=n.stateNode.containerInfo,Me=!0,be(e,t,n),te=r,Me=l;break;case 0:case 11:case 14:case 15:if(!oe&&(r=n.updateQueue,r!==null&&(r=r.lastEffect,r!==null))){l=r=r.next;do{var i=l,o=i.destroy;i=i.tag,o!==void 0&&(i&2||i&4)&&Ji(n,t,o),l=l.next}while(l!==r)}be(e,t,n);break;case 1:if(!oe&&(Jt(n,t),r=n.stateNode,typeof r.componentWillUnmount=="function"))try{r.props=n.memoizedProps,r.state=n.memoizedState,r.componentWillUnmount()}catch(a){W(n,t,a)}be(e,t,n);break;case 21:be(e,t,n);break;case 22:n.mode&1?(oe=(r=oe)||n.memoizedState!==null,be(e,t,n),oe=r):be(e,t,n);break;default:be(e,t,n)}}function cu(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var n=e.stateNode;n===null&&(n=e.stateNode=new op),t.forEach(function(r){var l=vp.bind(null,e,r);n.has(r)||(n.add(r),r.then(l,l))})}}function Re(e,t){var n=t.deletions;if(n!==null)for(var r=0;rl&&(l=o),r&=~i}if(r=l,r=Y()-r,r=(120>r?120:480>r?480:1080>r?1080:1920>r?1920:3e3>r?3e3:4320>r?4320:1960*sp(r/1960))-r,10e?16:e,it===null)var r=!1;else{if(e=it,it=null,pl=0,I&6)throw Error(k(331));var l=I;for(I|=4,N=e.current;N!==null;){var i=N,o=i.child;if(N.flags&16){var a=i.deletions;if(a!==null){for(var u=0;uY()-Go?Rt(e,0):Yo|=n),ve(e,t)}function Fc(e,t){t===0&&(e.mode&1?(t=wr,wr<<=1,!(wr&130023424)&&(wr=4194304)):t=1);var n=se();e=Je(e,t),e!==null&&(sr(e,t,n),ve(e,n))}function hp(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),Fc(e,n)}function vp(e,t){var n=0;switch(e.tag){case 13:var r=e.stateNode,l=e.memoizedState;l!==null&&(n=l.retryLane);break;case 19:r=e.stateNode;break;default:throw Error(k(314))}r!==null&&r.delete(t),Fc(e,n)}var jc;jc=function(e,t,n){if(e!==null)if(e.memoizedProps!==t.pendingProps||me.current)pe=!0;else{if(!(e.lanes&n)&&!(t.flags&128))return pe=!1,rp(e,t,n);pe=!!(e.flags&131072)}else pe=!1,A&&t.flags&1048576&&$s(t,ll,t.index);switch(t.lanes=0,t.tag){case 2:var r=t.type;$r(e,t),e=t.pendingProps;var l=on(t,ae.current);nn(t,n),l=$o(null,t,r,e,l,n);var i=Vo();return t.flags|=1,typeof l=="object"&&l!==null&&typeof l.render=="function"&&l.$$typeof===void 0?(t.tag=1,t.memoizedState=null,t.updateQueue=null,he(r)?(i=!0,nl(t)):i=!1,t.memoizedState=l.state!==null&&l.state!==void 0?l.state:null,Uo(t),l.updater=xl,t.stateNode=l,l._reactInternals=t,Hi(t,r,e,n),t=Ki(null,t,r,!0,i,n)):(t.tag=0,A&&i&&Lo(t),ue(null,t,l,n),t=t.child),t;case 16:r=t.elementType;e:{switch($r(e,t),e=t.pendingProps,l=r._init,r=l(r._payload),t.type=r,l=t.tag=yp(r),e=Te(r,e),l){case 0:t=Qi(null,t,r,e,n);break e;case 1:t=iu(null,t,r,e,n);break e;case 11:t=ru(null,t,r,e,n);break e;case 14:t=lu(null,t,r,Te(r.type,e),n);break e}throw Error(k(306,r,""))}return t;case 0:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:Te(r,l),Qi(e,t,r,l,n);case 1:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:Te(r,l),iu(e,t,r,l,n);case 3:e:{if(Sc(t),e===null)throw Error(k(387));r=t.pendingProps,i=t.memoizedState,l=i.element,Qs(e,t),al(t,r,null,n);var o=t.memoizedState;if(r=o.element,i.isDehydrated)if(i={element:r,isDehydrated:!1,cache:o.cache,pendingSuspenseBoundaries:o.pendingSuspenseBoundaries,transitions:o.transitions},t.updateQueue.baseState=i,t.memoizedState=i,t.flags&256){l=cn(Error(k(423)),t),t=ou(e,t,r,n,l);break e}else if(r!==l){l=cn(Error(k(424)),t),t=ou(e,t,r,n,l);break e}else for(ye=ct(t.stateNode.containerInfo.firstChild),Ee=t,A=!0,Oe=null,n=Xs(t,null,r,n),t.child=n;n;)n.flags=n.flags&-3|4096,n=n.sibling;else{if(an(),r===l){t=Ze(e,t,n);break e}ue(e,t,r,n)}t=t.child}return t;case 5:return Js(t),e===null&&Bi(t),r=t.type,l=t.pendingProps,i=e!==null?e.memoizedProps:null,o=l.children,Di(r,l)?o=null:i!==null&&Di(r,i)&&(t.flags|=32),wc(e,t),ue(e,t,o,n),t.child;case 6:return e===null&&Bi(t),null;case 13:return kc(e,t,n);case 4:return Fo(t,t.stateNode.containerInfo),r=t.pendingProps,e===null?t.child=un(t,null,r,n):ue(e,t,r,n),t.child;case 11:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:Te(r,l),ru(e,t,r,l,n);case 7:return ue(e,t,t.pendingProps,n),t.child;case 8:return ue(e,t,t.pendingProps.children,n),t.child;case 12:return ue(e,t,t.pendingProps.children,n),t.child;case 10:e:{if(r=t.type._context,l=t.pendingProps,i=t.memoizedProps,o=l.value,U(il,r._currentValue),r._currentValue=o,i!==null)if(Ue(i.value,o)){if(i.children===l.children&&!me.current){t=Ze(e,t,n);break e}}else for(i=t.child,i!==null&&(i.return=t);i!==null;){var a=i.dependencies;if(a!==null){o=i.child;for(var u=a.firstContext;u!==null;){if(u.context===r){if(i.tag===1){u=Ye(-1,n&-n),u.tag=2;var c=i.updateQueue;if(c!==null){c=c.shared;var h=c.pending;h===null?u.next=u:(u.next=h.next,h.next=u),c.pending=u}}i.lanes|=n,u=i.alternate,u!==null&&(u.lanes|=n),$i(i.return,n,t),a.lanes|=n;break}u=u.next}}else if(i.tag===10)o=i.type===t.type?null:i.child;else if(i.tag===18){if(o=i.return,o===null)throw Error(k(341));o.lanes|=n,a=o.alternate,a!==null&&(a.lanes|=n),$i(o,n,t),o=i.sibling}else o=i.child;if(o!==null)o.return=i;else for(o=i;o!==null;){if(o===t){o=null;break}if(i=o.sibling,i!==null){i.return=o.return,o=i;break}o=o.return}i=o}ue(e,t,l.children,n),t=t.child}return t;case 9:return l=t.type,r=t.pendingProps.children,nn(t,n),l=ze(l),r=r(l),t.flags|=1,ue(e,t,r,n),t.child;case 14:return r=t.type,l=Te(r,t.pendingProps),l=Te(r.type,l),lu(e,t,r,l,n);case 15:return yc(e,t,t.type,t.pendingProps,n);case 17:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:Te(r,l),$r(e,t),t.tag=1,he(r)?(e=!0,nl(t)):e=!1,nn(t,n),Ys(t,r,l),Hi(t,r,l,n),Ki(null,t,r,!0,e,n);case 19:return Cc(e,t,n);case 22:return Ec(e,t,n)}throw Error(k(156,t.tag))};function Ac(e,t){return ds(e,t)}function gp(e,t,n,r){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function xe(e,t,n,r){return new gp(e,t,n,r)}function qo(e){return e=e.prototype,!(!e||!e.isReactComponent)}function yp(e){if(typeof e=="function")return qo(e)?1:0;if(e!=null){if(e=e.$$typeof,e===go)return 11;if(e===yo)return 14}return 2}function mt(e,t){var n=e.alternate;return n===null?(n=xe(e.tag,t,e.key,e.mode),n.elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.subtreeFlags=0,n.deletions=null),n.flags=e.flags&14680064,n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function Wr(e,t,n,r,l,i){var o=2;if(r=e,typeof e=="function")qo(e)&&(o=1);else if(typeof e=="string")o=5;else e:switch(e){case $t:return Tt(n.children,l,i,t);case vo:o=8,l|=8;break;case pi:return e=xe(12,n,t,l|2),e.elementType=pi,e.lanes=i,e;case mi:return e=xe(13,n,t,l),e.elementType=mi,e.lanes=i,e;case hi:return e=xe(19,n,t,l),e.elementType=hi,e.lanes=i,e;case Gu:return Ll(n,l,i,t);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case Ku:o=10;break e;case Yu:o=9;break e;case go:o=11;break e;case yo:o=14;break e;case et:o=16,r=null;break e}throw Error(k(130,e==null?e:typeof e,""))}return t=xe(o,n,t,l),t.elementType=e,t.type=r,t.lanes=i,t}function Tt(e,t,n,r){return e=xe(7,e,r,t),e.lanes=n,e}function Ll(e,t,n,r){return e=xe(22,e,r,t),e.elementType=Gu,e.lanes=n,e.stateNode={isHidden:!1},e}function ui(e,t,n){return e=xe(6,e,null,t),e.lanes=n,e}function si(e,t,n){return t=xe(4,e.children!==null?e.children:[],e.key,t),t.lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function Ep(e,t,n,r,l){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=Hl(0),this.expirationTimes=Hl(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=Hl(0),this.identifierPrefix=r,this.onRecoverableError=l,this.mutableSourceEagerHydrationData=null}function bo(e,t,n,r,l,i,o,a,u){return e=new Ep(e,t,n,a,u),t===1?(t=1,i===!0&&(t|=8)):t=0,i=xe(3,null,null,t),e.current=i,i.stateNode=e,i.memoizedState={element:r,isDehydrated:n,cache:null,transitions:null,pendingSuspenseBoundaries:null},Uo(i),e}function wp(e,t,n){var r=3"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(Hc)}catch(e){console.error(e)}}Hc(),$u.exports=Se;var xp=$u.exports,Wc,yu=xp;Wc=yu.createRoot,yu.hydrateRoot;/** + * @remix-run/router v1.7.2 + * + * Copyright (c) Remix Software Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE.md file in the root directory of this source tree. + * + * @license MIT + */function or(){return or=Object.assign?Object.assign.bind():function(e){for(var t=1;t"u")throw new Error(t)}function ra(e,t){if(!e){typeof console<"u"&&console.warn(t);try{throw new Error(t)}catch{}}}function zp(){return Math.random().toString(36).substr(2,8)}function wu(e,t){return{usr:e.state,key:e.key,idx:t}}function lo(e,t,n,r){return n===void 0&&(n=null),or({pathname:typeof e=="string"?e:e.pathname,search:"",hash:""},typeof t=="string"?hn(t):t,{state:n,key:t&&t.key||r||zp()})}function vl(e){let{pathname:t="/",search:n="",hash:r=""}=e;return n&&n!=="?"&&(t+=n.charAt(0)==="?"?n:"?"+n),r&&r!=="#"&&(t+=r.charAt(0)==="#"?r:"#"+r),t}function hn(e){let t={};if(e){let n=e.indexOf("#");n>=0&&(t.hash=e.substr(n),e=e.substr(0,n));let r=e.indexOf("?");r>=0&&(t.search=e.substr(r),e=e.substr(0,r)),e&&(t.pathname=e)}return t}function _p(e,t,n,r){r===void 0&&(r={});let{window:l=document.defaultView,v5Compat:i=!1}=r,o=l.history,a=ot.Pop,u=null,c=h();c==null&&(c=0,o.replaceState(or({},o.state,{idx:c}),""));function h(){return(o.state||{idx:null}).idx}function p(){a=ot.Pop;let x=h(),f=x==null?null:x-c;c=x,u&&u({action:a,location:E.location,delta:f})}function m(x,f){a=ot.Push;let d=lo(E.location,x,f);n&&n(d,x),c=h()+1;let v=wu(d,c),w=E.createHref(d);try{o.pushState(v,"",w)}catch(C){if(C instanceof DOMException&&C.name==="DataCloneError")throw C;l.location.assign(w)}i&&u&&u({action:a,location:E.location,delta:1})}function g(x,f){a=ot.Replace;let d=lo(E.location,x,f);n&&n(d,x),c=h();let v=wu(d,c),w=E.createHref(d);o.replaceState(v,"",w),i&&u&&u({action:a,location:E.location,delta:0})}function y(x){let f=l.location.origin!=="null"?l.location.origin:l.location.href,d=typeof x=="string"?x:vl(x);return G(f,"No window.location.(origin|href) available to create URL for href: "+d),new URL(d,f)}let E={get action(){return a},get location(){return e(l,o)},listen(x){if(u)throw new Error("A history only accepts one active listener");return l.addEventListener(Eu,p),u=x,()=>{l.removeEventListener(Eu,p),u=null}},createHref(x){return t(l,x)},createURL:y,encodeLocation(x){let f=y(x);return{pathname:f.pathname,search:f.search,hash:f.hash}},push:m,replace:g,go(x){return o.go(x)}};return E}var Su;(function(e){e.data="data",e.deferred="deferred",e.redirect="redirect",e.error="error"})(Su||(Su={}));function Lp(e,t,n){n===void 0&&(n="/");let r=typeof t=="string"?hn(t):t,l=la(r.pathname||"/",n);if(l==null)return null;let i=Qc(e);Rp(i);let o=null;for(let a=0;o==null&&a{let u={relativePath:a===void 0?i.path||"":a,caseSensitive:i.caseSensitive===!0,childrenIndex:o,route:i};u.relativePath.startsWith("/")&&(G(u.relativePath.startsWith(r),'Absolute route path "'+u.relativePath+'" nested under path '+('"'+r+'" is not valid. An absolute child route path ')+"must start with the combined path of all its parent routes."),u.relativePath=u.relativePath.slice(r.length));let c=ht([r,u.relativePath]),h=n.concat(u);i.children&&i.children.length>0&&(G(i.index!==!0,"Index routes must not have child routes. Please remove "+('all child routes from route path "'+c+'".')),Qc(i.children,t,h,c)),!(i.path==null&&!i.index)&&t.push({path:c,score:Fp(c,i.index),routesMeta:h})};return e.forEach((i,o)=>{var a;if(i.path===""||!((a=i.path)!=null&&a.includes("?")))l(i,o);else for(let u of Kc(i.path))l(i,o,u)}),t}function Kc(e){let t=e.split("/");if(t.length===0)return[];let[n,...r]=t,l=n.endsWith("?"),i=n.replace(/\?$/,"");if(r.length===0)return l?[i,""]:[i];let o=Kc(r.join("/")),a=[];return a.push(...o.map(u=>u===""?i:[i,u].join("/"))),l&&a.push(...o),a.map(u=>e.startsWith("/")&&u===""?"/":u)}function Rp(e){e.sort((t,n)=>t.score!==n.score?n.score-t.score:jp(t.routesMeta.map(r=>r.childrenIndex),n.routesMeta.map(r=>r.childrenIndex)))}const Tp=/^:\w+$/,Mp=3,Op=2,Ip=1,Dp=10,Up=-2,ku=e=>e==="*";function Fp(e,t){let n=e.split("/"),r=n.length;return n.some(ku)&&(r+=Up),t&&(r+=Op),n.filter(l=>!ku(l)).reduce((l,i)=>l+(Tp.test(i)?Mp:i===""?Ip:Dp),r)}function jp(e,t){return e.length===t.length&&e.slice(0,-1).every((r,l)=>r===t[l])?e[e.length-1]-t[t.length-1]:0}function Ap(e,t){let{routesMeta:n}=e,r={},l="/",i=[];for(let o=0;o{if(h==="*"){let m=a[p]||"";o=i.slice(0,i.length-m.length).replace(/(.)\/+$/,"$1")}return c[h]=Hp(a[p]||"",h),c},{}),pathname:i,pathnameBase:o,pattern:e}}function $p(e,t,n){t===void 0&&(t=!1),n===void 0&&(n=!0),ra(e==="*"||!e.endsWith("*")||e.endsWith("/*"),'Route path "'+e+'" will be treated as if it were '+('"'+e.replace(/\*$/,"/*")+'" because the `*` character must ')+"always follow a `/` in the pattern. To get rid of this warning, "+('please change the route path to "'+e.replace(/\*$/,"/*")+'".'));let r=[],l="^"+e.replace(/\/*\*?$/,"").replace(/^\/*/,"/").replace(/[\\.*+^$?{}|()[\]]/g,"\\$&").replace(/\/:(\w+)/g,(o,a)=>(r.push(a),"/([^\\/]+)"));return e.endsWith("*")?(r.push("*"),l+=e==="*"||e==="/*"?"(.*)$":"(?:\\/(.+)|\\/*)$"):n?l+="\\/*$":e!==""&&e!=="/"&&(l+="(?:(?=\\/|$))"),[new RegExp(l,t?void 0:"i"),r]}function Vp(e){try{return decodeURI(e)}catch(t){return ra(!1,'The URL path "'+e+'" could not be decoded because it is is a malformed URL segment. This is probably due to a bad percent '+("encoding ("+t+").")),e}}function Hp(e,t){try{return decodeURIComponent(e)}catch(n){return ra(!1,'The value for the URL param "'+t+'" will not be decoded because'+(' the string "'+e+'" is a malformed URL segment. This is probably')+(" due to a bad percent encoding ("+n+").")),e}}function la(e,t){if(t==="/")return e;if(!e.toLowerCase().startsWith(t.toLowerCase()))return null;let n=t.endsWith("/")?t.length-1:t.length,r=e.charAt(n);return r&&r!=="/"?null:e.slice(n)||"/"}function Wp(e,t){t===void 0&&(t="/");let{pathname:n,search:r="",hash:l=""}=typeof e=="string"?hn(e):e;return{pathname:n?n.startsWith("/")?n:Qp(n,t):t,search:Yp(r),hash:Gp(l)}}function Qp(e,t){let n=t.replace(/\/+$/,"").split("/");return e.split("/").forEach(l=>{l===".."?n.length>1&&n.pop():l!=="."&&n.push(l)}),n.length>1?n.join("/"):"/"}function ci(e,t,n,r){return"Cannot include a '"+e+"' character in a manually specified "+("`to."+t+"` field ["+JSON.stringify(r)+"]. Please separate it out to the ")+("`to."+n+"` field. Alternatively you may provide the full path as ")+'a string in and the router will parse it for you.'}function ia(e){return e.filter((t,n)=>n===0||t.route.path&&t.route.path.length>0)}function oa(e,t,n,r){r===void 0&&(r=!1);let l;typeof e=="string"?l=hn(e):(l=or({},e),G(!l.pathname||!l.pathname.includes("?"),ci("?","pathname","search",l)),G(!l.pathname||!l.pathname.includes("#"),ci("#","pathname","hash",l)),G(!l.search||!l.search.includes("#"),ci("#","search","hash",l)));let i=e===""||l.pathname==="",o=i?"/":l.pathname,a;if(r||o==null)a=n;else{let p=t.length-1;if(o.startsWith("..")){let m=o.split("/");for(;m[0]==="..";)m.shift(),p-=1;l.pathname=m.join("/")}a=p>=0?t[p]:"/"}let u=Wp(l,a),c=o&&o!=="/"&&o.endsWith("/"),h=(i||o===".")&&n.endsWith("/");return!u.pathname.endsWith("/")&&(c||h)&&(u.pathname+="/"),u}const ht=e=>e.join("/").replace(/\/\/+/g,"/"),Kp=e=>e.replace(/\/+$/,"").replace(/^\/*/,"/"),Yp=e=>!e||e==="?"?"":e.startsWith("?")?e:"?"+e,Gp=e=>!e||e==="#"?"":e.startsWith("#")?e:"#"+e;function Xp(e){return e!=null&&typeof e.status=="number"&&typeof e.statusText=="string"&&typeof e.internal=="boolean"&&"data"in e}const Yc=["post","put","patch","delete"];new Set(Yc);const Jp=["get",...Yc];new Set(Jp);/** + * React Router v6.14.2 + * + * Copyright (c) Remix Software Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE.md file in the root directory of this source tree. + * + * @license MIT + */function gl(){return gl=Object.assign?Object.assign.bind():function(e){for(var t=1;tu.pathnameBase)),o=S.useRef(!1);return Xc(()=>{o.current=!0}),S.useCallback(function(u,c){if(c===void 0&&(c={}),!o.current)return;if(typeof u=="number"){n.go(u);return}let h=oa(u,JSON.parse(i),l,c.relative==="path");e==null&&t!=="/"&&(h.pathname=h.pathname==="/"?t:ht([t,h.pathname])),(c.replace?n.replace:n.push)(h,c.state,c)},[t,n,i,l,e])}function Jc(e,t){let{relative:n}=t===void 0?{}:t,{matches:r}=S.useContext(kt),{pathname:l}=yn(),i=JSON.stringify(ia(r).map(o=>o.pathnameBase));return S.useMemo(()=>oa(e,JSON.parse(i),l,n==="path"),[e,i,l,n])}function em(e,t){return tm(e,t)}function tm(e,t,n){gn()||G(!1);let{navigator:r}=S.useContext(vn),{matches:l}=S.useContext(kt),i=l[l.length-1],o=i?i.params:{};i&&i.pathname;let a=i?i.pathnameBase:"/";i&&i.route;let u=yn(),c;if(t){var h;let E=typeof t=="string"?hn(t):t;a==="/"||(h=E.pathname)!=null&&h.startsWith(a)||G(!1),c=E}else c=u;let p=c.pathname||"/",m=a==="/"?p:p.slice(a.length)||"/",g=Lp(e,{pathname:m}),y=om(g&&g.map(E=>Object.assign({},E,{params:Object.assign({},o,E.params),pathname:ht([a,r.encodeLocation?r.encodeLocation(E.pathname).pathname:E.pathname]),pathnameBase:E.pathnameBase==="/"?a:ht([a,r.encodeLocation?r.encodeLocation(E.pathnameBase).pathname:E.pathnameBase])})),l,n);return t&&y?S.createElement(Il.Provider,{value:{location:gl({pathname:"/",search:"",hash:"",state:null,key:"default"},c),navigationType:ot.Pop}},y):y}function nm(){let e=cm(),t=Xp(e)?e.status+" "+e.statusText:e instanceof Error?e.message:JSON.stringify(e),n=e instanceof Error?e.stack:null,l={padding:"0.5rem",backgroundColor:"rgba(200,200,200, 0.5)"},i=null;return S.createElement(S.Fragment,null,S.createElement("h2",null,"Unexpected Application Error!"),S.createElement("h3",{style:{fontStyle:"italic"}},t),n?S.createElement("pre",{style:l},n):null,i)}const rm=S.createElement(nm,null);class lm extends S.Component{constructor(t){super(t),this.state={location:t.location,revalidation:t.revalidation,error:t.error}}static getDerivedStateFromError(t){return{error:t}}static getDerivedStateFromProps(t,n){return n.location!==t.location||n.revalidation!=="idle"&&t.revalidation==="idle"?{error:t.error,location:t.location,revalidation:t.revalidation}:{error:t.error||n.error,location:n.location,revalidation:t.revalidation||n.revalidation}}componentDidCatch(t,n){console.error("React Router caught the following error during render",t,n)}render(){return this.state.error?S.createElement(kt.Provider,{value:this.props.routeContext},S.createElement(Gc.Provider,{value:this.state.error,children:this.props.component})):this.props.children}}function im(e){let{routeContext:t,match:n,children:r}=e,l=S.useContext(aa);return l&&l.static&&l.staticContext&&(n.route.errorElement||n.route.ErrorBoundary)&&(l.staticContext._deepestRenderedBoundaryId=n.route.id),S.createElement(kt.Provider,{value:t},r)}function om(e,t,n){var r;if(t===void 0&&(t=[]),n===void 0&&(n=null),e==null){var l;if((l=n)!=null&&l.errors)e=n.matches;else return null}let i=e,o=(r=n)==null?void 0:r.errors;if(o!=null){let a=i.findIndex(u=>u.route.id&&(o==null?void 0:o[u.route.id]));a>=0||G(!1),i=i.slice(0,Math.min(i.length,a+1))}return i.reduceRight((a,u,c)=>{let h=u.route.id?o==null?void 0:o[u.route.id]:null,p=null;n&&(p=u.route.errorElement||rm);let m=t.concat(i.slice(0,c+1)),g=()=>{let y;return h?y=p:u.route.Component?y=S.createElement(u.route.Component,null):u.route.element?y=u.route.element:y=a,S.createElement(im,{match:u,routeContext:{outlet:a,matches:m,isDataRoute:n!=null},children:y})};return n&&(u.route.ErrorBoundary||u.route.errorElement||c===0)?S.createElement(lm,{location:n.location,revalidation:n.revalidation,component:p,error:h,children:g(),routeContext:{outlet:null,matches:m,isDataRoute:!0}}):g()},null)}var io;(function(e){e.UseBlocker="useBlocker",e.UseRevalidator="useRevalidator",e.UseNavigateStable="useNavigate"})(io||(io={}));var ar;(function(e){e.UseBlocker="useBlocker",e.UseLoaderData="useLoaderData",e.UseActionData="useActionData",e.UseRouteError="useRouteError",e.UseNavigation="useNavigation",e.UseRouteLoaderData="useRouteLoaderData",e.UseMatches="useMatches",e.UseRevalidator="useRevalidator",e.UseNavigateStable="useNavigate",e.UseRouteId="useRouteId"})(ar||(ar={}));function am(e){let t=S.useContext(aa);return t||G(!1),t}function um(e){let t=S.useContext(Zp);return t||G(!1),t}function sm(e){let t=S.useContext(kt);return t||G(!1),t}function Zc(e){let t=sm(),n=t.matches[t.matches.length-1];return n.route.id||G(!1),n.route.id}function cm(){var e;let t=S.useContext(Gc),n=um(ar.UseRouteError),r=Zc(ar.UseRouteError);return t||((e=n.errors)==null?void 0:e[r])}function dm(){let{router:e}=am(io.UseNavigateStable),t=Zc(ar.UseNavigateStable),n=S.useRef(!1);return Xc(()=>{n.current=!0}),S.useCallback(function(l,i){i===void 0&&(i={}),n.current&&(typeof l=="number"?e.navigate(l):e.navigate(l,gl({fromRouteId:t},i)))},[e,t])}function fm(e){let{to:t,replace:n,state:r,relative:l}=e;gn()||G(!1);let{matches:i}=S.useContext(kt),{pathname:o}=yn(),a=En(),u=oa(t,ia(i).map(h=>h.pathnameBase),o,l==="path"),c=JSON.stringify(u);return S.useEffect(()=>a(JSON.parse(c),{replace:n,state:r,relative:l}),[a,c,l,n,r]),null}function Ve(e){G(!1)}function pm(e){let{basename:t="/",children:n=null,location:r,navigationType:l=ot.Pop,navigator:i,static:o=!1}=e;gn()&&G(!1);let a=t.replace(/^\/*/,"/"),u=S.useMemo(()=>({basename:a,navigator:i,static:o}),[a,i,o]);typeof r=="string"&&(r=hn(r));let{pathname:c="/",search:h="",hash:p="",state:m=null,key:g="default"}=r,y=S.useMemo(()=>{let E=la(c,a);return E==null?null:{location:{pathname:E,search:h,hash:p,state:m,key:g},navigationType:l}},[a,c,h,p,m,g,l]);return y==null?null:S.createElement(vn.Provider,{value:u},S.createElement(Il.Provider,{children:n,value:y}))}function mm(e){let{children:t,location:n}=e;return em(oo(t),n)}var Cu;(function(e){e[e.pending=0]="pending",e[e.success=1]="success",e[e.error=2]="error"})(Cu||(Cu={}));new Promise(()=>{});function oo(e,t){t===void 0&&(t=[]);let n=[];return S.Children.forEach(e,(r,l)=>{if(!S.isValidElement(r))return;let i=[...t,l];if(r.type===S.Fragment){n.push.apply(n,oo(r.props.children,i));return}r.type!==Ve&&G(!1),!r.props.index||!r.props.children||G(!1);let o={id:r.props.id||i.join("-"),caseSensitive:r.props.caseSensitive,element:r.props.element,Component:r.props.Component,index:r.props.index,path:r.props.path,loader:r.props.loader,action:r.props.action,errorElement:r.props.errorElement,ErrorBoundary:r.props.ErrorBoundary,hasErrorBoundary:r.props.ErrorBoundary!=null||r.props.errorElement!=null,shouldRevalidate:r.props.shouldRevalidate,handle:r.props.handle,lazy:r.props.lazy};r.props.children&&(o.children=oo(r.props.children,i)),n.push(o)}),n}/** + * React Router DOM v6.14.2 + * + * Copyright (c) Remix Software Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE.md file in the root directory of this source tree. + * + * @license MIT + */function ao(){return ao=Object.assign?Object.assign.bind():function(e){for(var t=1;t=0)&&(n[l]=e[l]);return n}function vm(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}function gm(e,t){return e.button===0&&(!t||t==="_self")&&!vm(e)}const ym=["onClick","relative","reloadDocument","replace","state","target","to","preventScrollReset"],Em="startTransition",Nu=wd[Em];function wm(e){let{basename:t,children:n,future:r,window:l}=e,i=S.useRef();i.current==null&&(i.current=Pp({window:l,v5Compat:!0}));let o=i.current,[a,u]=S.useState({action:o.action,location:o.location}),{v7_startTransition:c}=r||{},h=S.useCallback(p=>{c&&Nu?Nu(()=>u(p)):u(p)},[u,c]);return S.useLayoutEffect(()=>o.listen(h),[o,h]),S.createElement(pm,{basename:t,children:n,location:a.location,navigationType:a.action,navigator:o})}const Sm=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u",km=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,Mr=S.forwardRef(function(t,n){let{onClick:r,relative:l,reloadDocument:i,replace:o,state:a,target:u,to:c,preventScrollReset:h}=t,p=hm(t,ym),{basename:m}=S.useContext(vn),g,y=!1;if(typeof c=="string"&&km.test(c)&&(g=c,Sm))try{let d=new URL(window.location.href),v=c.startsWith("//")?new URL(d.protocol+c):new URL(c),w=la(v.pathname,m);v.origin===d.origin&&w!=null?c=w+v.search+v.hash:y=!0}catch{}let E=qp(c,{relative:l}),x=Cm(c,{replace:o,state:a,target:u,preventScrollReset:h,relative:l});function f(d){r&&r(d),d.defaultPrevented||x(d)}return S.createElement("a",ao({},p,{href:g||E,onClick:y||i?r:f,ref:n,target:u}))});var xu;(function(e){e.UseScrollRestoration="useScrollRestoration",e.UseSubmit="useSubmit",e.UseSubmitFetcher="useSubmitFetcher",e.UseFetcher="useFetcher"})(xu||(xu={}));var Pu;(function(e){e.UseFetchers="useFetchers",e.UseScrollRestoration="useScrollRestoration"})(Pu||(Pu={}));function Cm(e,t){let{target:n,replace:r,state:l,preventScrollReset:i,relative:o}=t===void 0?{}:t,a=En(),u=yn(),c=Jc(e,{relative:o});return S.useCallback(h=>{if(gm(h,n)){h.preventDefault();let p=r!==void 0?r:vl(u)===vl(c);a(e,{replace:p,state:l,preventScrollReset:i,relative:o})}},[u,a,c,r,l,n,e,i,o])}var qc={color:void 0,size:void 0,className:void 0,style:void 0,attr:void 0},zu=s.createContext&&s.createContext(qc),vt=globalThis&&globalThis.__assign||function(){return vt=Object.assign||function(e){for(var t,n=1,r=arguments.length;n()=>{l.current&&clearTimeout(l.current)},[]);const i=En(),o=()=>{r(!0),t("Alert Sent! Officer Notified"),l.current=setTimeout(()=>t("Officer En Route (ETA: 2 min)"),2e3),l.current=setTimeout(()=>{t("Help Arrived"),r(!1)},6e3)};return s.createElement("div",{className:"safe-area"},s.createElement("header",{className:"header-row"},s.createElement("div",{style:{display:"flex",alignItems:"center"}},s.createElement("img",{src:"/assets/icon.png",alt:"icon",style:{width:32,height:32,marginRight:8},onError:a=>{a.target.onerror=null,a.target.style.display="none"}}),s.createElement(yl,{size:28,color:"#E53935",style:{marginRight:8}}),s.createElement("div",{className:"header-title"},"AI Police Alert")),s.createElement("button",{className:"header-icon"},s.createElement(ua,{size:18,color:"#222"}))),s.createElement("div",{className:`status-bar ${n?"panic":""}`},s.createElement("div",{style:{marginRight:8}},n?s.createElement(Qr,{size:18,color:"#E53935"}):s.createElement(Qr,{size:18,color:"#3ecf4a"})),s.createElement("div",{className:`status-text ${n?"panic":""}`},e)),s.createElement("div",{className:"sos-container"},s.createElement("button",{className:`sos-button ${n?"active":""}`,onClick:o,disabled:n},s.createElement(Qr,{size:56,color:n?"#E53935":"#fff"}),s.createElement("div",{className:`sos-text ${n?"active":""}`},"PANIC")),s.createElement("div",{className:"sos-subtext"},n?"Alert in progress...":"Tap to send instant police alert.")),s.createElement("div",{className:"quick-actions-section"},s.createElement("div",{className:"quick-actions-title"},"Quick Actions"),s.createElement("div",{className:"quick-actions-grid"},s.createElement("div",{className:"quick-action-box",role:"button",tabIndex:0,onClick:()=>i("/chat"),onKeyDown:a=>{a.key==="Enter"&&i("/chat")},"aria-label":"Open AI Chat Assistant"},s.createElement(ed,{size:28,color:"#E53935"}),s.createElement("div",{className:"quick-action-label"},"AI Chat Assistant")),s.createElement("div",{className:"quick-action-box",role:"button",tabIndex:0,onClick:()=>i("/location"),onKeyDown:a=>{a.key==="Enter"&&i("/location")},"aria-label":"Open Live GPS Map"},s.createElement(td,{size:28,color:"#E53935"}),s.createElement("div",{className:"quick-action-label"},"Live GPS Map"))),s.createElement("div",{className:"quick-actions-grid"},s.createElement("div",{className:"quick-action-box",role:"button",tabIndex:0,onClick:()=>i("/alerts"),onKeyDown:a=>{a.key==="Enter"&&i("/alerts")},"aria-label":"View Recent Alerts"},s.createElement(Rm,{size:28,color:"#E53935"}),s.createElement("div",{className:"quick-action-label"},"Recent Alerts")),s.createElement("div",{className:"quick-action-box",role:"button",tabIndex:0,onClick:()=>i("/alerts"),onKeyDown:a=>{a.key==="Enter"&&i("/alerts")},"aria-label":"Safety and Research"},s.createElement(yl,{size:26,color:"#E53935"}),s.createElement("div",{className:"quick-action-label"},"Safety & Research")))))}function Um(e){return H({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M504 256C504 119 393 8 256 8S8 119 8 256c0 123.78 90.69 226.38 209.25 245V327.69h-63V256h63v-54.64c0-62.15 37-96.48 93.67-96.48 27.14 0 55.52 4.84 55.52 4.84v61h-31.28c-30.8 0-40.41 19.12-40.41 38.73V256h68.78l-11 71.69h-57.78V501C413.31 482.38 504 379.78 504 256z"}}]})(e)}function Fm(e){return H({tag:"svg",attr:{viewBox:"0 0 488 512"},child:[{tag:"path",attr:{d:"M488 261.8C488 403.3 391.1 504 248 504 110.8 504 0 393.2 0 256S110.8 8 248 8c66.8 0 123 24.5 166.3 64.9l-67.5 64.9C258.5 52.6 94.3 116.6 94.3 256c0 86.5 69.1 156.6 153.7 156.6 98.2 0 135-70.4 140.8-106.9H248v-85.3h236.1c2.3 12.7 3.9 24.9 3.9 41.4z"}}]})(e)}function jm(e){return H({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M512 144v288c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V144c0-26.5 21.5-48 48-48h88l12.3-32.9c7-18.7 24.9-31.1 44.9-31.1h125.5c20 0 37.9 12.4 44.9 31.1L376 96h88c26.5 0 48 21.5 48 48zM376 288c0-66.2-53.8-120-120-120s-120 53.8-120 120 53.8 120 120 120 120-53.8 120-120zm-32 0c0 48.5-39.5 88-88 88s-88-39.5-88-88 39.5-88 88-88 88 39.5 88 88z"}}]})(e)}function Mu(e){return H({tag:"svg",attr:{viewBox:"0 0 576 512"},child:[{tag:"path",attr:{d:"M336.2 64H47.8C21.4 64 0 85.4 0 111.8v288.4C0 426.6 21.4 448 47.8 448h288.4c26.4 0 47.8-21.4 47.8-47.8V111.8c0-26.4-21.4-47.8-47.8-47.8zm189.4 37.7L416 177.3v157.4l109.6 75.5c21.2 14.6 50.4-.3 50.4-25.8V127.5c0-25.4-29.1-40.4-50.4-25.8z"}}]})(e)}function Am(){const[e,t]=S.useState(!1),n=En(),[r,l]=S.useState(""),[i,o]=S.useState(""),[a,u]=S.useState(null),[c,h]=S.useState(!1),p=async m=>{if(m&&typeof m.preventDefault=="function"&&m.preventDefault(),u(null),!r||!i){u("Enter username/email and password");return}const g=typeof import.meta<"u"&&{BASE_URL:"/",MODE:"production",DEV:!1,PROD:!0,SSR:!1}&&{}.VITE_API_URL||typeof process<"u"&&process.env&&{}.REACT_APP_API_URL||"http://localhost:4000";h(!0);try{const y=String(g).replace(/\/$/,""),E=await fetch(y+"/api/login",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:r,password:i})}),x=await E.json();if(!E.ok){u(x.message||"Login failed"),h(!1);return}localStorage.setItem("authUser",JSON.stringify({token:x.token,...x.user})),n("/home",{replace:!0})}catch(y){u("API error: "+(y.message||y))}finally{h(!1)}};return s.createElement("div",{className:"login-screen auth-screen"},s.createElement("div",{className:"header",style:{paddingTop:30,paddingBottom:20,textAlign:"center"}},s.createElement("div",{style:{fontSize:40,color:"red"}},s.createElement(yl,{size:26,color:"#E53935"})),s.createElement("div",{style:{fontSize:28,fontWeight:"700",color:"#300"}},"ShieldX"),s.createElement("div",{style:{fontSize:14,color:"#800",marginTop:4}},"Instant Police Alerts")),s.createElement("form",{style:{padding:10},onSubmit:p},a&&s.createElement("div",{style:{color:"red",marginBottom:8}},a),s.createElement("input",{name:"id",className:"input",placeholder:"Email or Username",value:r,onChange:m=>l(m.target.value)}),s.createElement("input",{name:"password",className:"input",placeholder:"Password",type:"password",value:i,onChange:m=>o(m.target.value)}),s.createElement("div",{className:"remember-row"},s.createElement("label",{style:{display:"flex",alignItems:"center",gap:8}},s.createElement("input",{type:"checkbox",checked:e,onChange:()=>t(!e)}),s.createElement("span",{style:{color:"#555"}},"Remember me")),s.createElement("button",{type:"button",className:"forgot"},"Forgot password?")),s.createElement("button",{className:"login-btn",type:"submit",disabled:c},c?"Logging in...":"Log In"),s.createElement("div",{className:"divider-row"},s.createElement("div",{className:"divider"}),s.createElement("div",{className:"or-text"},"Or continue with"),s.createElement("div",{className:"divider"})),s.createElement("div",{className:"social-row"},s.createElement("button",{type:"button",className:"social-btn"},s.createElement(Fm,{style:{marginRight:8}})," Google"),s.createElement("button",{type:"button",className:"social-btn"},s.createElement(Um,{style:{marginRight:8}})," Facebook")),s.createElement("div",{style:{textAlign:"center",marginTop:12}},s.createElement("button",{className:"link",type:"button",onClick:()=>n("/Signup")},"Don't have an account? ",s.createElement("span",{style:{color:"red"}},"Sign Up")))))}function Bm(){const[e,t]=S.useState(""),[n,r]=S.useState(""),[l,i]=S.useState(""),[o,a]=S.useState(null),[u,c]=S.useState(!1),h=En(),p=async m=>{if(m&&typeof m.preventDefault=="function"&&m.preventDefault(),a(null),!n||!l){a("Please enter email and password");return}const g=typeof import.meta<"u"&&{BASE_URL:"/",MODE:"production",DEV:!1,PROD:!0,SSR:!1}&&{}.VITE_API_URL||typeof process<"u"&&process.env&&{}.REACT_APP_API_URL||"http://localhost:4000";c(!0);try{const y=String(g).replace(/\/$/,""),E=await fetch(y+"/api/register",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:n,password:l,name:e})}),x=await E.json();if(!E.ok){a(x.message||"Signup failed"),c(!1);return}const f=await fetch(y+"/api/login",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:n,password:l})}),d=await f.json();if(!f.ok){a(d.message||"Auto-login failed"),c(!1),h("/login");return}localStorage.setItem("authUser",JSON.stringify({token:d.token,username:n,name:e||n&&n.split&&n.split("@")[0]})),h("/home",{replace:!0})}catch(y){a("API error: "+(y.message||y))}finally{c(!1)}};return s.createElement("div",{className:"signup-screen auth-screen"},s.createElement("button",{className:"back-btn",onClick:()=>window.history.back()},"←"),s.createElement("div",{style:{textAlign:"center"}},s.createElement("h2",{style:{margin:"12px 0"}},"Sign Up")),s.createElement("div",{style:{textAlign:"center",marginBottom:16}},s.createElement("div",{style:{display:"inline-block",background:"#ffe5e5",borderRadius:50,padding:20}},"ℹ️")),s.createElement("form",{style:{padding:10},onSubmit:p},o&&s.createElement("div",{style:{color:"red",marginBottom:8}},o),s.createElement("input",{name:"fullName",autoComplete:"name",className:"input",placeholder:"Full Name",value:e,onChange:m=>t(m.target.value)}),s.createElement("input",{name:"email",type:"email",autoComplete:"email",className:"input",placeholder:"Email",value:n,onChange:m=>r(m.target.value)}),s.createElement("input",{name:"password",type:"password",autoComplete:"new-password",className:"input",placeholder:"Password",value:l,onChange:m=>i(m.target.value)}),s.createElement("button",{className:"signup-btn",type:"submit",disabled:u},u?"Signing up...":"Sign Up"),s.createElement("div",{className:"dividerContainer"},s.createElement("div",{className:"line"}),s.createElement("div",{className:"orText"},"Or sign up with"),s.createElement("div",{className:"line"})),s.createElement("div",{className:"socialContainer"},s.createElement("button",{type:"button",className:"socialBtn"},"Google"),s.createElement("button",{type:"button",className:"socialBtn"},"Facebook")),s.createElement("div",{style:{textAlign:"center",marginTop:12}},s.createElement("button",{className:"link",type:"button",onClick:()=>h("/login")},"Already have an account? ",s.createElement("span",{style:{color:"red"}},"Sign In")))))}function $m({}){const[e,t]=S.useState([{id:"1",sender:"ai",text:"Hello, I'm your AI assistant. How can I help you today?"}]),[n,r]=S.useState(""),[l,i]=S.useState(!1),o=S.useRef(null);S.useEffect(()=>{a()},[]);const a=()=>{var c;(c=o.current)==null||c.scrollIntoView({behavior:"smooth"})},u=async()=>{if(!n.trim()||l)return;const c={id:Date.now().toString(),sender:"user",text:n};t(m=>[...m,c]),r(""),i(!0),setTimeout(a,100);let h="";const p=c.text.toLowerCase();/panic|sos|urgent|immediate|danger|attack|assault|robbery|theft|violence|shooting|gun|weapon/.test(p)?h="Emergency detected. Are you in immediate danger? Please confirm your safety and share your location.":/crime|report|help|emergency|police|officer|911/.test(p)?h="Please provide details about the incident, including your location, type of crime, and any injuries.":/location|where|address|gps|map/.test(p)?h="Can you share your current location or describe where the incident occurred? You can also use the Live GPS Map feature.":/injur|hurt|medical|ambulance|doctor/.test(p)?h="If anyone is injured, please describe the injuries and if medical help is needed. Emergency services can be dispatched.":/officer|response|eta|arrive|coming/.test(p)?h="An officer is being dispatched. You will receive live updates on their location and estimated arrival time.":/thank|thanks|grateful|appreciate/.test(p)?h="You are welcome. Stay safe! If you need further help, just type your question.":/cancel|mistake|false alarm/.test(p)?h="If this was a false alarm, please confirm so we can update the response team.":h="I'm here to assist you with emergencies, police alerts, and safety information. Please describe your situation or question.",setTimeout(()=>{t(m=>[...m,{id:Date.now().toString(),sender:"ai",text:h}]),i(!1),setTimeout(a,100)},1200)};return s.createElement("div",{className:"chat-screen"},s.createElement("header",{className:"chat-header"},s.createElement("button",{className:"back-btn",onClick:()=>window.history.back(),"aria-label":"back"},"←"),s.createElement("div",{className:"chat-title"},"AI Assistant"),s.createElement("div",{style:{width:40}})),s.createElement("div",{className:"avatar-row"},s.createElement("div",{className:"avatar-circle"},s.createElement("img",{src:"/assets/icon.png",alt:"avatar",style:{width:56,height:56,borderRadius:28},onError:c=>{c.target.onerror=null,c.target.style.display="none"}}),s.createElement(di,{size:36}),s.createElement("div",{className:"avatar-status"}))),s.createElement("div",{className:"chat-area"},e.map(c=>s.createElement("div",{key:c.id,className:`bubble-row ${c.sender==="user"?"user":"ai"}`},c.sender==="ai"&&s.createElement("div",{className:"bubble-avatar"},s.createElement(di,{size:20})),s.createElement("div",{className:c.sender==="ai"?"bubble-left":"bubble-right"},c.sender==="ai"&&s.createElement("div",{className:"bubble-sender"},"AI Assistant"),s.createElement("div",{className:c.sender==="ai"?"bubble-text":"bubble-text-user"},c.text)),c.sender==="user"&&s.createElement("div",{className:"bubble-avatar-user"},s.createElement(di,{size:20})))),l&&s.createElement("div",{className:"typing-indicator"},s.createElement("div",{className:"spinner"}),s.createElement("div",{className:"typing-text"},"AI is typing...")),s.createElement("div",{ref:o})),s.createElement("div",{className:"input-bar"},s.createElement("input",{className:"chat-input",placeholder:"Type a message...",value:n,onChange:c=>r(c.target.value),onKeyDown:c=>{c.key==="Enter"&&u()},disabled:l}),s.createElement("button",{className:"input-mic",disabled:!0},"🎤"),s.createElement("button",{className:"input-send",onClick:u,disabled:l||!n.trim()},s.createElement(Im,{color:"#fff",size:20}))))}const Vm=[{id:"1",name:"Police Station",address:"Sector 21, Main Road"},{id:"2",name:"Hospital",address:"City Hospital, Block B"},{id:"3",name:"Your Last Location",address:"Park Avenue, Sector 17"}],Hm=[{id:"1",name:"Police",phone:"100"},{id:"2",name:"Ambulance",phone:"102"},{id:"3",name:"Fire",phone:"101"}];function Wm(){const[e,t]=S.useState(""),[n,r]=S.useState("No active alert"),l=()=>{r("Officer dispatched (ETA: 2 min)"),window.alert(`Police Alert Sent +An officer is being dispatched to your location.`),setTimeout(()=>r("Officer en route (ETA: 1 min)"),2e3),setTimeout(()=>r("Officer arrived"),6e3)},i=()=>{window.open("https://maps.google.com","_blank")},o=a=>window.alert(`Call ${a}`);return s.createElement("div",{className:"location-screen"},s.createElement("header",{className:"header-row"},s.createElement("div",{className:"header-title"},"Location"),s.createElement("button",{className:"header-icon"},s.createElement(ua,{size:18,color:"#222"}))),s.createElement("div",{className:"search-bar"},s.createElement("input",{className:"search-input",placeholder:"Search places or address...",value:e,onChange:a=>t(a.target.value)})),s.createElement("div",{className:"map-view"},s.createElement("div",{style:{textAlign:"center"}},s.createElement(Lu,{size:64,color:"#E53935"}),s.createElement("div",{style:{color:"#888",fontSize:16,marginTop:8}},"Map placeholder for web. Use mobile app for live map features."))),s.createElement("div",{className:`status-bar ${n!=="No active alert"?"alert":""}`},s.createElement("div",{style:{marginRight:8}},"🛡️"),s.createElement("div",{className:"status-text"},n)),s.createElement("div",{className:"action-row"},s.createElement("button",{className:"action-btn",onClick:i},"Share Location"),s.createElement("button",{className:"action-btn",onClick:()=>window.open("https://www.google.com/maps","_blank")},"Directions"),s.createElement("button",{className:"action-btn alt",onClick:l},"Police Alert")),s.createElement("div",{className:"emergency-section"},s.createElement("div",{className:"list-title"},"Emergency Contacts"),s.createElement("div",{className:"emergency-row"},Hm.map(a=>s.createElement("button",{key:a.id,className:"emergency-btn",onClick:()=>o(a.phone)},s.createElement("div",{style:{fontSize:20,color:"#E53935"}},s.createElement(Mm,null)),s.createElement("div",{className:"emergency-btn-text"},a.name))))),s.createElement("div",{className:"list-section"},s.createElement("div",{className:"list-title"},"Nearby & Recent Locations"),Vm.map(a=>s.createElement("div",{key:a.id,className:"list-item"},s.createElement("div",{style:{marginRight:12,fontSize:20,color:"#E53935"}},s.createElement(Lu,null)),s.createElement("div",null,s.createElement("div",{className:"list-item-name"},a.name),s.createElement("div",{className:"list-item-address"},a.address))))))}function Qm({center:e,onDispatch:t=()=>{},onClose:n=()=>{}}){const r={lat:28.70406,lon:77.102493},[l,i]=S.useState(r),[o,a]=S.useState([]),[u,c]=S.useState(null);S.useEffect(()=>{if(e)if(typeof e=="string"&&e.includes(",")){const[p,m]=e.split(",").map(g=>parseFloat(g.trim()));!Number.isNaN(p)&&!Number.isNaN(m)&&i({lat:p,lon:m})}else e.lat&&e.lon&&i(e)},[e]),S.useEffect(()=>{e||navigator.geolocation&&navigator.geolocation.getCurrentPosition(p=>{const{latitude:m,longitude:g}=p.coords;i({lat:m,lon:g})},()=>{},{timeout:8e3})},[e]),S.useEffect(()=>{const p=l,g=[{dLat:.0012,dLon:8e-4},{dLat:-9e-4,dLon:.001},{dLat:6e-4,dLon:-.0011},{dLat:-.0015,dLon:-6e-4},{dLat:.0018,dLon:-3e-4}].map((y,E)=>{const x=p.lat+y.dLat,f=p.lon+y.dLon;return{id:`U-${E+1}`,name:`Unit ${E+1}`,lat:x,lon:f,eta:`${2+E} min`,distanceKm:Math.abs(y.dLat*111).toFixed(2)}});a(g)},[l]);const h=(p,m)=>{const g=p-l.lat,y=m-l.lon,E=50-g/.002*50,x=50+y/.002*50;return{top:`${Math.max(6,Math.min(94,E))}%`,left:`${Math.max(6,Math.min(94,x))}%`}};return s.createElement("div",{className:"map-panel"},s.createElement("div",{className:"map-panel-header"},s.createElement("div",{style:{fontWeight:700}},"Nearby Police Units"),s.createElement("div",{style:{display:"flex",gap:8,alignItems:"center"}},s.createElement("button",{className:"btn small",onClick:()=>{c(null),n()}},"Close"))),s.createElement("div",{className:"map-panel-body"},s.createElement("div",{className:"map-area",role:"img","aria-label":"Mock map showing nearby police units"},o.map(p=>{const m=h(p.lat,p.lon),g=u&&u.id===p.id;return s.createElement("button",{key:p.id,className:`marker ${g?"selected":""}`,style:{top:m.top,left:m.left},onClick:()=>c(p),title:`${p.name} — ${p.distanceKm} km — ETA ${p.eta}`,"aria-label":`${p.name}, distance ${p.distanceKm} kilometers`},s.createElement("div",{className:"marker-dot"}))}),s.createElement("div",{className:"center-dot",style:{top:"50%",left:"50%"},title:"Your location"})),s.createElement("div",{className:"unit-list"},s.createElement("div",{className:"unit-list-title"},"Units"),o.map(p=>s.createElement("div",{key:p.id,className:`unit-item ${u&&u.id===p.id?"active":""}`,onClick:()=>c(p),role:"button",tabIndex:0,onKeyDown:m=>{m.key==="Enter"&&c(p)}},s.createElement("div",null,s.createElement("div",{style:{fontWeight:700}},p.name),s.createElement("div",{style:{color:"#666",fontSize:13}},p.distanceKm," km • ETA ",p.eta)),s.createElement("div",null,s.createElement("button",{className:"btn tiny",onClick:m=>{m.stopPropagation(),t(p),window.alert(`Dispatch requested to ${p.name} (simulation)`)}},"Dispatch")))),u&&s.createElement("div",{className:"selected-details"},s.createElement("div",{style:{fontWeight:700,marginBottom:6}},u.name),s.createElement("div",{style:{color:"#666",marginBottom:8}},u.distanceKm," km away • ETA ",u.eta),s.createElement("div",{style:{display:"flex",gap:8}},s.createElement("button",{className:"btn",onClick:()=>{t(u),window.alert("Dispatch requested (simulation)")}},"Dispatch"),s.createElement("button",{className:"btn outline",onClick:()=>c(null)},"Deselect"))))))}function Km(){const[e,t]=S.useState("online"),[n,r]=S.useState([]),l=()=>{const g=Date.now().toString(),y=new Date().toLocaleString();r(E=>[{id:g,time:y,type:"Panic",details:"Demo: Panic pressed at Park Avenue."},...E])},[i,o]=S.useState(null),a=()=>{if(!navigator.geolocation){window.alert("Geolocation is not supported in this browser.");return}navigator.geolocation.getCurrentPosition(g=>{const{latitude:y,longitude:E}=g.coords,x=`${y.toFixed(6)}, ${E.toFixed(6)}`,f=Date.now().toString(),d=new Date().toLocaleString();r(v=>[{id:f,time:d,type:"Location Share",details:`Shared location: ${x}`},...v]),o(x),window.alert("Location shared: "+x)},g=>{window.alert("Unable to get location: "+((g==null?void 0:g.message)||"error"))},{enableHighAccuracy:!0,timeout:1e4})},u=()=>{t(e==="online"?"offline":e==="offline"?"mesh":"online")},c=()=>{r([]),t("online"),window.alert(`Alerts Sent +All queued alerts have been sent to authorities.`)},[h,p]=S.useState(!1),m=g=>{const y=Date.now().toString(),E=new Date().toLocaleString();r(x=>[{id:y,time:E,type:"Dispatch",details:`Dispatch requested to ${g.name} (ETA ${g.eta})`},...x])};return s.createElement("div",{className:"alerts-screen"},s.createElement("header",{className:"header-row"},s.createElement("div",{style:{display:"flex",alignItems:"center",gap:12}},s.createElement("div",{className:"header-title"},"Alert System"),s.createElement("div",{className:`status-pill ${e}`},e==="online"?"Online":e==="mesh"?"Mesh":"Offline")),s.createElement("div",{style:{display:"flex",alignItems:"center",gap:8}},s.createElement("button",{className:"icon-btn",title:"Toggle status",onClick:u},s.createElement(ua,{size:18})))),s.createElement("div",{className:`status-card ${e}`},s.createElement("div",{style:{display:"flex",alignItems:"center",gap:12}},s.createElement("div",{className:"status-icon"},e==="online"?s.createElement(Dm,{size:22,color:"#3ecf4a"}):e==="mesh"?s.createElement(Ru,{size:22,color:"#1976d2"}):s.createElement(Lm,{size:22,color:"#E53935"})),s.createElement("div",null,s.createElement("div",{style:{fontWeight:"700",fontSize:16,color:"#222"}},e==="online"?"Online":e==="mesh"?"Mesh Fallback":"Offline"),s.createElement("div",{style:{color:"#444",marginTop:6}},e==="online"&&"All alerts are sent instantly to authorities.",e==="offline"&&"No internet. Alerts will be queued and sent via SMS or mesh when possible.",e==="mesh"&&"Mesh fallback active. Alerts are relayed via nearby users/devices."))),s.createElement("div",{className:"alert-controls"},s.createElement("button",{className:"btn",onClick:l},s.createElement(_u,{style:{marginRight:8}}),"Push Demo Alert"),s.createElement("button",{className:"btn outline",onClick:()=>window.alert("Test alert sent (simulation)")},"Send Test Alert"))),h&&s.createElement(Qm,{center:i,onDispatch:g=>{m(g)},onClose:()=>p(!1)}),s.createElement("div",{className:"queued-section"},s.createElement("div",{className:"queued-header"},s.createElement("div",{className:"queued-title"},"Queued Alerts"),s.createElement("div",{className:"queued-actions"},s.createElement("button",{className:"btn small",onClick:()=>r([])},"Clear"),s.createElement("button",{className:"btn small primary",onClick:c,disabled:n.length===0},s.createElement(_u,null)))),n.length===0?s.createElement("div",{className:"empty-queued"},"No alerts queued."):s.createElement("div",{className:"queued-list"},n.map(g=>s.createElement("div",{key:g.id,className:"queued-alert-box"},s.createElement("div",{className:"queued-left"},s.createElement(Qr,{size:18,color:"#E53935"})),s.createElement("div",{className:"queued-body"},s.createElement("div",{className:"queued-type"},g.type," Alert"),s.createElement("div",{className:"queued-details"},g.details),s.createElement("div",{className:"queued-time"},g.time)),s.createElement("div",{className:"queued-actions"},s.createElement("button",{className:"btn tiny",onClick:()=>window.alert("Retry send (simulation)")},"Retry"),s.createElement("button",{className:"btn tiny outline",onClick:()=>r(y=>y.filter(E=>E.id!==g.id))},"Delete")))))),s.createElement("div",{className:"features-section"},s.createElement("div",{className:"features-title"},"Features"),s.createElement("div",{className:"features-grid"},s.createElement("div",{className:"feature-box",role:"button",tabIndex:0,onClick:a,onKeyDown:g=>{g.key==="Enter"&&a()}},s.createElement(_m,{size:28,color:"#E53935"}),s.createElement("div",{className:"feature-label"},"Share Location"),i&&s.createElement("div",{className:"feature-subtext"},"Last: ",i)),s.createElement("div",{className:"feature-box",role:"button",tabIndex:0,onClick:()=>p(!0),onKeyDown:g=>{g.key==="Enter"&&p(!0)}},s.createElement(yl,{size:26,color:"#E53935"}),s.createElement("div",{className:"feature-label"},"Nearby Police",s.createElement("br",null),"Units"),s.createElement("div",{className:"feature-subtext"},"Tap to view nearby units")),s.createElement("div",{className:"feature-box"},s.createElement(Pm,{size:28,color:"#E53935"}),s.createElement("div",{className:"feature-label"},"Video/Audio",s.createElement("br",null),"Recording")),s.createElement("div",{className:"feature-box"},s.createElement(zm,{size:28,color:"#E53935"}),s.createElement("div",{className:"feature-label"},"Silent Alert")),s.createElement("div",{className:"feature-box"},s.createElement(Ru,{size:28,color:"#E53935"}),s.createElement("div",{className:"feature-label"},"Mesh",s.createElement("br",null),"Communication")))),s.createElement("div",{className:"research-section"},s.createElement("div",{className:"research-title"},"Research & About"),s.createElement("div",{className:"research-text"},"This app uses advanced mesh networking and SMS fallback to ensure alerts reach authorities even without internet. Mesh communication relays alerts via nearby users/devices, while SMS queue ensures delivery when back online. Your privacy is protected—no personal data is shared without consent."),s.createElement("div",{className:"research-text"},"For more info, visit our website or read the research on mesh networks and emergency response.")))}function Ym(){const[e,t]=S.useState([]),[n,r]=S.useState(!1),l=S.useRef(null),i=u=>{l.current&&l.current.click()},o=u=>{const c=u.target.files[0];if(!c)return;const h=URL.createObjectURL(c),p=c.type.startsWith("image")?"photo":"video";t(m=>[...m,{url:h,type:p}])},a=()=>{e.length!==0&&(r(!0),setTimeout(()=>{r(!1),t([]),window.alert(`Evidence Uploaded +Your evidence has been securely sent to authorities.`)},1800))};return s.createElement("div",{className:"evidence-screen"},s.createElement("header",{className:"header-row"},s.createElement("button",{className:"back-btn",onClick:()=>window.history.back()},"←"),s.createElement("div",{className:"header-title"},"Upload Evidence"),s.createElement("div",{style:{width:40}})),s.createElement("div",{className:"actions-row"},s.createElement("input",{ref:l,type:"file",style:{display:"none"},accept:"image/*,video/*",onChange:o}),s.createElement("button",{className:"action-btn",onClick:()=>i()},s.createElement(jm,{style:{marginRight:8}})," Take / Pick"),s.createElement("button",{className:"action-btn",onClick:()=>i()},s.createElement(Mu,{style:{marginRight:8}})," Record / Pick")),s.createElement("div",{className:"media-preview"},e.length===0?s.createElement("div",{style:{color:"#888",fontStyle:"italic",textAlign:"center"}},"No evidence selected."):e.map((u,c)=>s.createElement("div",{className:"media-box",key:c},u.type==="photo"?s.createElement("img",{src:u.url,alt:"media",className:"media-img"}):s.createElement(Mu,{size:48,color:"#1976d2",style:{marginTop:12}}),s.createElement("div",{className:"media-type"},u.type==="photo"?"Photo":"Video")))),s.createElement("button",{className:"upload-btn",onClick:a,disabled:e.length===0||n},n?"Uploading...":"Upload Evidence"))}function Gm(){const e=yn(),t=r=>e.pathname===r,n=En();return s.createElement("nav",{className:"bottom-tabs"},s.createElement(Mr,{to:"/home",className:`tab ${t("/home")||t("/")?"active":""}`},s.createElement(Om,{size:20})," ",s.createElement("div",{className:"tab-label"},"Home")),s.createElement(Mr,{to:"/chat",className:`tab ${t("/chat")?"active":""}`},s.createElement(ed,{size:20})," ",s.createElement("div",{className:"tab-label"},"Chat")),s.createElement(Mr,{to:"/location",className:`tab ${t("/location")?"active":""}`},s.createElement(td,{size:20})," ",s.createElement("div",{className:"tab-label"},"Location")),s.createElement(Mr,{to:"/alerts",className:`tab ${t("/alerts")?"active":""}`},s.createElement(Tm,{size:20})," ",s.createElement("div",{className:"tab-label"},"Alerts")),s.createElement("button",{className:"tab",style:{background:"none",border:0,cursor:"pointer"},onClick:()=>{localStorage.removeItem("authUser"),n("/login")}},"Logout"))}function Xm(){const e=()=>!!localStorage.getItem("authUser"),t=({children:n})=>e()?n:s.createElement(fm,{to:"/login",replace:!0});return s.createElement("div",{className:"app-root"},s.createElement("main",{className:"main-content"},s.createElement(mm,null,s.createElement(Ve,{path:"/",element:s.createElement(t,null,s.createElement(Tu,null))}),s.createElement(Ve,{path:"/home",element:s.createElement(t,null,s.createElement(Tu,null))}),s.createElement(Ve,{path:"/login",element:s.createElement(Am,null)}),s.createElement(Ve,{path:"/signup",element:s.createElement(Bm,null)}),s.createElement(Ve,{path:"/chat",element:s.createElement(t,null,s.createElement($m,null))}),s.createElement(Ve,{path:"/location",element:s.createElement(t,null,s.createElement(Wm,null))}),s.createElement(Ve,{path:"/alerts",element:s.createElement(t,null,s.createElement(Km,null))}),s.createElement(Ve,{path:"/evidence",element:s.createElement(t,null,s.createElement(Ym,null))}))),e()&&s.createElement(Gm,null))}Wc(document.getElementById("root")).render(s.createElement(s.StrictMode,null,s.createElement(wm,null,s.createElement(Xm,null)))); diff --git a/ShieldX- Web/dist/index.html b/ShieldX- Web/dist/index.html new file mode 100644 index 0000000..754ee4f --- /dev/null +++ b/ShieldX- Web/dist/index.html @@ -0,0 +1,15 @@ + + + + + + SafeCam Converted Web + + + + + +
+ + + diff --git a/index.html b/ShieldX- Web/index.html similarity index 100% rename from index.html rename to ShieldX- Web/index.html diff --git a/package-lock.json b/ShieldX- Web/package-lock.json similarity index 100% rename from package-lock.json rename to ShieldX- Web/package-lock.json diff --git a/package.json b/ShieldX- Web/package.json similarity index 100% rename from package.json rename to ShieldX- Web/package.json diff --git a/src/App.jsx b/ShieldX- Web/src/App.jsx similarity index 100% rename from src/App.jsx rename to ShieldX- Web/src/App.jsx diff --git a/src/components/BottomTabs.jsx b/ShieldX- Web/src/components/BottomTabs.jsx similarity index 76% rename from src/components/BottomTabs.jsx rename to ShieldX- Web/src/components/BottomTabs.jsx index 0ff600b..52ee901 100644 --- a/src/components/BottomTabs.jsx +++ b/ShieldX- Web/src/components/BottomTabs.jsx @@ -1,17 +1,19 @@ import React from 'react' -import { Link, useLocation } from 'react-router-dom' +import { Link, useLocation, useNavigate } from 'react-router-dom' import { IoMdHome, IoMdLocate } from 'react-icons/io' import { MdChat, MdNotifications } from 'react-icons/md' export default function BottomTabs(){ const loc = useLocation() const active = (p) => loc.pathname === p + const navigate = useNavigate() return ( ) } diff --git a/src/components/PoliceMap.jsx b/ShieldX- Web/src/components/PoliceMap.jsx similarity index 100% rename from src/components/PoliceMap.jsx rename to ShieldX- Web/src/components/PoliceMap.jsx diff --git a/src/main.jsx b/ShieldX- Web/src/main.jsx similarity index 100% rename from src/main.jsx rename to ShieldX- Web/src/main.jsx diff --git a/src/pages/Alerts.jsx b/ShieldX- Web/src/pages/Alerts.jsx similarity index 100% rename from src/pages/Alerts.jsx rename to ShieldX- Web/src/pages/Alerts.jsx diff --git a/src/pages/Chat.jsx b/ShieldX- Web/src/pages/Chat.jsx similarity index 100% rename from src/pages/Chat.jsx rename to ShieldX- Web/src/pages/Chat.jsx diff --git a/src/pages/Evidence.jsx b/ShieldX- Web/src/pages/Evidence.jsx similarity index 100% rename from src/pages/Evidence.jsx rename to ShieldX- Web/src/pages/Evidence.jsx diff --git a/src/pages/Home.jsx b/ShieldX- Web/src/pages/Home.jsx similarity index 100% rename from src/pages/Home.jsx rename to ShieldX- Web/src/pages/Home.jsx diff --git a/src/pages/Location.jsx b/ShieldX- Web/src/pages/Location.jsx similarity index 100% rename from src/pages/Location.jsx rename to ShieldX- Web/src/pages/Location.jsx diff --git a/ShieldX- Web/src/pages/Login.jsx b/ShieldX- Web/src/pages/Login.jsx new file mode 100644 index 0000000..8a10638 --- /dev/null +++ b/ShieldX- Web/src/pages/Login.jsx @@ -0,0 +1,90 @@ +import React, { useState } from 'react'; +import { FaGoogle, FaFacebook } from 'react-icons/fa'; +import { IoMdHome, IoMdMap } from 'react-icons/io'; +import { MdNotifications } from 'react-icons/md'; +import { FaUser } from 'react-icons/fa'; +import { useNavigate } from 'react-router-dom'; +import { FiShield } from 'react-icons/fi'; + +export default function Login() { + const [remember, setRemember] = useState(false); + const navigate = useNavigate(); + const [id, setId] = useState(''); + const [password, setPassword] = useState(''); + const [error, setError] = useState(null); + const [loading, setLoading] = useState(false); + + + const doLogin = async (e) => { + if (e && typeof e.preventDefault === 'function') e.preventDefault() + setError(null) + if (!id || !password) { setError('Enter username/email and password'); return } + // prefer Vite env, then CRA env, fallback to localhost for local dev + const api = (typeof import.meta !== 'undefined' && import.meta.env && import.meta.env.VITE_API_URL) + || (typeof process !== 'undefined' && process.env && process.env.REACT_APP_API_URL) + || 'http://localhost:4000' + + setLoading(true) + try { + const base = String(api).replace(/\/$/, '') + const res = await fetch(base + '/api/login', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ username: id, password }) + }) + const data = await res.json() + if (!res.ok) { setError(data.message || 'Login failed'); setLoading(false); return } + localStorage.setItem('authUser', JSON.stringify({ token: data.token, ...data.user })) + navigate('/home', { replace: true }) + } catch (err) { + setError('API error: ' + (err.message || err)) + } finally { + setLoading(false) + } + } + + return ( +
+
+
+
ShieldX
+
Instant Police Alerts
+
+ +
+ {error &&
{error}
} + setId(e.target.value)} /> + setPassword(e.target.value)} /> + +
+ + +
+ + + +
+
+
Or continue with
+
+
+ +
+ + +
+ + + +
+ +
+ + + +
+ ) +} diff --git a/ShieldX- Web/src/pages/Signup.jsx b/ShieldX- Web/src/pages/Signup.jsx new file mode 100644 index 0000000..dbfe1fd --- /dev/null +++ b/ShieldX- Web/src/pages/Signup.jsx @@ -0,0 +1,87 @@ +import React, { useState } from 'react' +import { useNavigate } from 'react-router-dom' + +export default function Signup() { + const [fullName, setFullName] = useState('') + const [email, setEmail] = useState('') + const [password, setPassword] = useState('') + const [error, setError] = useState(null) + const [loading, setLoading] = useState(false) + const navigate = useNavigate() + + const doSignup = async (e) => { + if (e && typeof e.preventDefault === 'function') e.preventDefault() + setError(null) + if (!email || !password) { setError('Please enter email and password'); return } + // prefer Vite env, then CRA env, fallback to localhost for local dev + const api = (typeof import.meta !== 'undefined' && import.meta.env && import.meta.env.VITE_API_URL) + || (typeof process !== 'undefined' && process.env && process.env.REACT_APP_API_URL) + || 'http://localhost:4000' + + setLoading(true) + try { + const base = String(api).replace(/\/$/, '') + const res = await fetch(base + '/api/register', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ username: email, password, name: fullName }) + }) + const data = await res.json() + if (!res.ok) { setError(data.message || 'Signup failed'); setLoading(false); return } + + const loginRes = await fetch(base + '/api/login', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ username: email, password }) + }) + const loginData = await loginRes.json() + if (!loginRes.ok) { setError(loginData.message || 'Auto-login failed'); setLoading(false); navigate('/login'); return } + + localStorage.setItem('authUser', JSON.stringify({ token: loginData.token, username: email, name: fullName || (email && email.split && email.split('@')[0]) })) + navigate('/home', { replace: true }) + } catch (err) { + setError('API error: ' + (err.message || err)) + } finally { + setLoading(false) + } + } + + return ( +
+ +
+

Sign Up

+
+ +
+
+ ℹ️ +
+
+ +
+ {error &&
{error}
} + setFullName(e.target.value)} /> + setEmail(e.target.value)} /> + setPassword(e.target.value)} /> + + + +
+
+
Or sign up with
+
+
+ +
+ + +
+ +
+ +
+ +
+ ) +} diff --git a/src/styles/index.css b/ShieldX- Web/src/styles/index.css similarity index 99% rename from src/styles/index.css rename to ShieldX- Web/src/styles/index.css index 4fda5b6..ac31539 100644 --- a/src/styles/index.css +++ b/ShieldX- Web/src/styles/index.css @@ -868,7 +868,8 @@ body, .social-row { display: flex; - gap: 12px + gap: 12px; + justify-content: center; } .social-btn { diff --git a/server/.gitignore b/server/.gitignore new file mode 100644 index 0000000..594a924 --- /dev/null +++ b/server/.gitignore @@ -0,0 +1,4 @@ +# Environment files +.env +.env.local +.env.*.local diff --git a/server/README.md b/server/README.md new file mode 100644 index 0000000..2056f0e --- /dev/null +++ b/server/README.md @@ -0,0 +1,26 @@ +# ShieldX Server (minimal) + +This folder contains a minimal Express + MongoDB backend for authentication. + +Quick start + +1. Copy `.env.example` to `.env` and edit `MONGODB_URI` and `JWT_SECRET`. +2. Install and run: + +```bash +cd server +npm install + +# On macOS / Linux +npm run dev + +# On Windows (cmd.exe) +npm run dev:win +``` + +3. API endpoints: +- POST /api/signup { name, email, password } +- POST /api/login { email, password } +- GET /api/ping + +The server returns a JWT token on successful auth. diff --git a/server/config/db.js b/server/config/db.js new file mode 100644 index 0000000..705d0b4 --- /dev/null +++ b/server/config/db.js @@ -0,0 +1,15 @@ +import mongoose from "mongoose"; +import dotenv from "dotenv"; +dotenv.config(); + +const connectDB = async () => { + try { + await mongoose.connect(process.env.MONGODB_URI); + console.log("MongoDb Connected"); + } catch (err) { + console.error("MongoDB connection failed", err.message); + process.exit(1); + } +}; + +export default connectDB; diff --git a/server/middleware/authMiddleware.js b/server/middleware/authMiddleware.js new file mode 100644 index 0000000..d8c9606 --- /dev/null +++ b/server/middleware/authMiddleware.js @@ -0,0 +1,16 @@ +import jwt from 'jsonwebtoken'; + +const authMiddleware = (req, res, next) => { + const token = req.headers['authorization']?.split(' ')[1]; + if (!token) return res.status(401).json({ message: 'Unauthorized' }); + + try { + const decoded = jwt.verify(token, process.env.JWT_SECRET); + req.user = decoded; + next(); + } catch (err) { + res.status(401).json({ message: 'Invalid token' }); + } +}; + +export default authMiddleware; diff --git a/server/models/UserR.js b/server/models/UserR.js new file mode 100644 index 0000000..73b2c4f --- /dev/null +++ b/server/models/UserR.js @@ -0,0 +1,19 @@ +import mongoose from 'mongoose'; + +const userSchema = new mongoose.Schema({ + name: { + type: String, + default: '' + }, + username: { + type: String, + required: true, + unique: true + }, + password: { + type: String, + required: true + } +}); + +export default mongoose.model('UserR', userSchema); diff --git a/server/package-lock.json b/server/package-lock.json new file mode 100644 index 0000000..9d009ab --- /dev/null +++ b/server/package-lock.json @@ -0,0 +1,2210 @@ +{ + "name": "shieldx-server", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "shieldx-server", + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "bcrypt": "^5.1.0", + "cors": "^2.8.5", + "dotenv": "^16.0.3", + "express": "^4.18.2", + "jsonwebtoken": "^9.0.0", + "mongoose": "^7.3.1" + }, + "devDependencies": { + "nodemon": "^2.0.22" + } + }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", + "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", + "license": "BSD-3-Clause", + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/@mongodb-js/saslprep": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.3.0.tgz", + "integrity": "sha512-zlayKCsIjYb7/IdfqxorK5+xUMyi4vOKcFy10wKJYc63NSdKI8mNME+uJqfatkPmOSMMUiojrL58IePKBm3gvQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "sparse-bitfield": "^3.0.3" + } + }, + "node_modules/@types/node": { + "version": "24.5.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.5.2.tgz", + "integrity": "sha512-FYxk1I7wPv3K2XBaoyH2cTnocQEu8AOZ60hPbsyukMPLv5/5qr7V1i8PLHdl6Zf87I+xZXFvPCXYjiTFq+YSDQ==", + "license": "MIT", + "dependencies": { + "undici-types": "~7.12.0" + } + }, + "node_modules/@types/webidl-conversions": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz", + "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==", + "license": "MIT" + }, + "node_modules/@types/whatwg-url": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.2.tgz", + "integrity": "sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/webidl-conversions": "*" + } + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "license": "ISC" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agent-base/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/agent-base/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/aproba": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.1.0.tgz", + "integrity": "sha512-tLIEcj5GuR2RSTnxNKdkK0dJ/GrC7P38sUkiDmDuHfsHmbagTFAxDVIBltoklXEVIQ/f14IL8IMJ5pn9Hez1Ew==", + "license": "ISC" + }, + "node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "deprecated": "This package is no longer supported.", + "license": "ISC", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/bcrypt": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.1.tgz", + "integrity": "sha512-AGBHOG5hPYZ5Xl9KXzU5iKq9516yEmvCKDg3ecP5kX2aB6UqTeXZxk2ELnDgDm6BQSMlLt9rDB4LoSMx0rYwww==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.11", + "node-addon-api": "^5.0.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/bson": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/bson/-/bson-5.5.1.tgz", + "integrity": "sha512-ix0EwukN2EpC0SRWIj/7B5+A6uQMQy6KMREI9qQqvgpkV2frH63T0UDVd1SYedL6dNCmDBYB3QtXi4ISk9YT+g==", + "license": "Apache-2.0", + "engines": { + "node": ">=14.20.1" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", + "license": "BSD-3-Clause" + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "license": "ISC", + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "license": "MIT" + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "license": "ISC" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "license": "MIT" + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "license": "MIT" + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.0.tgz", + "integrity": "sha512-vEtk+OcP7VBRtQZ1EJ3bdgzSfBjgnEalLTp5zjJrS+2Z1w2KZly4SBdac/WDU3hhsNAZ9E8SC96ME4Ey8MZ7cg==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "deprecated": "This package is no longer supported.", + "license": "ISC", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "license": "ISC" + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/https-proxy-agent/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true, + "license": "ISC" + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ip-address": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.0.1.tgz", + "integrity": "sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/jsonwebtoken": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", + "license": "MIT", + "dependencies": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jsonwebtoken/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/jwa": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.2.tgz", + "integrity": "sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==", + "license": "MIT", + "dependencies": { + "buffer-equal-constant-time": "^1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "license": "MIT", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/kareem": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.5.1.tgz", + "integrity": "sha512-7jFxRVm+jD+rkq3kY0iZDJfsO2/t4BBPeEb2qKn2lR/9KhuksYk5hxzfRYWMPV8P/x2d0kHD306YyWLzjjH+uA==", + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", + "license": "MIT" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", + "license": "MIT" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", + "license": "MIT" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", + "license": "MIT" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "license": "MIT" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", + "license": "MIT" + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "license": "MIT" + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "license": "MIT", + "optional": true + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mongodb": { + "version": "5.9.2", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-5.9.2.tgz", + "integrity": "sha512-H60HecKO4Bc+7dhOv4sJlgvenK4fQNqqUIlXxZYQNbfEWSALGAwGoyJd/0Qwk4TttFXUOHJ2ZJQe/52ScaUwtQ==", + "license": "Apache-2.0", + "dependencies": { + "bson": "^5.5.0", + "mongodb-connection-string-url": "^2.6.0", + "socks": "^2.7.1" + }, + "engines": { + "node": ">=14.20.1" + }, + "optionalDependencies": { + "@mongodb-js/saslprep": "^1.1.0" + }, + "peerDependencies": { + "@aws-sdk/credential-providers": "^3.188.0", + "@mongodb-js/zstd": "^1.0.0", + "kerberos": "^1.0.0 || ^2.0.0", + "mongodb-client-encryption": ">=2.3.0 <3", + "snappy": "^7.2.2" + }, + "peerDependenciesMeta": { + "@aws-sdk/credential-providers": { + "optional": true + }, + "@mongodb-js/zstd": { + "optional": true + }, + "kerberos": { + "optional": true + }, + "mongodb-client-encryption": { + "optional": true + }, + "snappy": { + "optional": true + } + } + }, + "node_modules/mongodb-connection-string-url": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.6.0.tgz", + "integrity": "sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==", + "license": "Apache-2.0", + "dependencies": { + "@types/whatwg-url": "^8.2.1", + "whatwg-url": "^11.0.0" + } + }, + "node_modules/mongoose": { + "version": "7.8.7", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-7.8.7.tgz", + "integrity": "sha512-5Bo4CrUxrPITrhMKsqUTOkXXo2CoRC5tXxVQhnddCzqDMwRXfyStrxj1oY865g8gaekSBhxAeNkYyUSJvGm9Hw==", + "license": "MIT", + "dependencies": { + "bson": "^5.5.0", + "kareem": "2.5.1", + "mongodb": "5.9.2", + "mpath": "0.9.0", + "mquery": "5.0.0", + "ms": "2.1.3", + "sift": "16.0.1" + }, + "engines": { + "node": ">=14.20.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mongoose" + } + }, + "node_modules/mongoose/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/mpath": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz", + "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mquery": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-5.0.0.tgz", + "integrity": "sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==", + "license": "MIT", + "dependencies": { + "debug": "4.x" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/mquery/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/mquery/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-addon-api": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", + "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==", + "license": "MIT" + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, + "node_modules/node-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, + "node_modules/node-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/nodemon": { + "version": "2.0.22", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.22.tgz", + "integrity": "sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^5.7.1", + "simple-update-notifier": "^1.0.7", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=8.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/nodemon/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nodemon/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "license": "ISC", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "deprecated": "This package is no longer supported.", + "license": "ISC", + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "license": "MIT" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true, + "license": "MIT" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "license": "ISC" + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sift": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/sift/-/sift-16.0.1.tgz", + "integrity": "sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ==", + "license": "MIT" + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, + "node_modules/simple-update-notifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", + "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "~7.0.0" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/simple-update-notifier/node_modules/semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", + "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", + "license": "MIT", + "dependencies": { + "ip-address": "^10.0.1", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "memory-pager": "^1.0.2" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/touch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", + "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", + "dev": true, + "license": "ISC", + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "license": "MIT", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true, + "license": "MIT" + }, + "node_modules/undici-types": { + "version": "7.12.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.12.0.tgz", + "integrity": "sha512-goOacqME2GYyOZZfb5Lgtu+1IDmAlAEu5xnD3+xTzS10hT0vzpf0SPjkXwAw9Jm+4n/mQGDP3LO8CPbYROeBfQ==", + "license": "MIT" + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "license": "MIT", + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "license": "ISC", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" + } + } +} diff --git a/server/package.json b/server/package.json new file mode 100644 index 0000000..53d788b --- /dev/null +++ b/server/package.json @@ -0,0 +1,25 @@ +{ + "name": "shieldx-server", + "version": "1.0.0", + "description": "Minimal Express API for ShieldX - user auth and MongoDB connection", + "main": "src/index.js", + "type": "module", + "scripts": { + "start": "node src/index.js", + "dev": "NODE_ENV=development nodemon src/index.js", + "dev:win": "set NODE_ENV=development&& nodemon src/index.js" + }, + "author": "", + "license": "MIT", + "dependencies": { + "bcrypt": "^5.1.0", + "cors": "^2.8.5", + "dotenv": "^16.0.3", + "express": "^4.18.2", + "jsonwebtoken": "^9.0.0", + "mongoose": "^7.3.1" + }, + "devDependencies": { + "nodemon": "^2.0.22" + } +} diff --git a/server/routes/auth.js b/server/routes/auth.js new file mode 100644 index 0000000..3b5fae7 --- /dev/null +++ b/server/routes/auth.js @@ -0,0 +1,50 @@ +import express from 'express'; +import bcrypt from 'bcrypt'; +import jwt from 'jsonwebtoken'; +import User from '../models/UserR.js'; +import authMiddleware from '../middleware/authmiddleware.js'; + + + +const router = express.Router(); + +// Register +router.post('/register', async (req, res) => { + const { username, password, name } = req.body; + if (!username || !password) return res.status(400).json({ message: 'username and password required' }); + const hashed = await bcrypt.hash(password, 10); + try { + const nameVal = (typeof name === 'string' && name.trim().length > 0) ? name.trim() : username; + const user = await User.create({ username, password: hashed, name: nameVal }); + return res.status(201).json({ message: 'User registered', user: { id: user._id, username: user.username, name: user.name } }); + } catch (e) { + console.error('Register error', e && e.message ? e.message : e); + // Duplicate key (username) -> 409 + if (e && e.code === 11000) { + return res.status(409).json({ message: 'Username already exists' }); + } + return res.status(400).json({ message: e.message || 'Registration failed' }); + } +}); + +// Debug: list mongoose models +// ...existing code... + +// Login +router.post('/login', async (req, res) => { + const { username, password } = req.body; + const user = await User.findOne({ username }); + if (!user || !(await bcrypt.compare(password, user.password))) { + return res.status(401).json({ message: 'Invalid credentials' }); + } + if (!process.env.JWT_SECRET) { + console.error('JWT_SECRET not set in environment'); + return res.status(500).json({ message: 'Server misconfiguration' }); + } + const token = jwt.sign({ id: user._id }, process.env.JWT_SECRET, { expiresIn: '1h' }); // After 1 hour, the token becomes invalid + res.json({ token, user: { id: user._id, username: user.username, name: user.name } }); +}); + + + +export default router; diff --git a/server/src/index.js b/server/src/index.js new file mode 100644 index 0000000..4276056 --- /dev/null +++ b/server/src/index.js @@ -0,0 +1,31 @@ +import express from 'express'; +import cors from 'cors'; +import dotenv from 'dotenv'; +import connectDB from '../config/db.js'; +import authRoutes from '../routes/auth.js'; +import path from 'path'; +import { fileURLToPath } from 'url'; + +dotenv.config(); +connectDB(); + +const app = express(); +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + +const PORT = process.env.PORT || 5000; + +app.use(express.json()); +// Allow cross-origin requests during development (Vite runs on :5174) +app.use(cors()); +// serve public from project root (/server/public) +app.use(express.static(path.join(__dirname, '..', 'public'))); +app.use('/api', authRoutes); + +app.get('/', (req, res) => { + res.sendFile(path.join(__dirname, '..', 'public', 'index.html')); +}); + +app.listen(PORT, () => { + console.log(`Server running on http://localhost:${PORT}`); +}); diff --git a/server/test_register.js b/server/test_register.js new file mode 100644 index 0000000..e288d8d --- /dev/null +++ b/server/test_register.js @@ -0,0 +1,25 @@ +(async () => { + try { + const base = 'http://localhost:4000'; + const username = 'auto_test_' + Date.now(); + console.log('Trying register', username); + const r = await fetch(base + '/api/register', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ username, password: 'pass123', name: 'Auto Test' }) + }); + const text = await r.text(); + console.log('REGISTER', r.status, text); + + console.log('Trying login', username); + const lr = await fetch(base + '/api/login', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ username, password: 'pass123' }) + }); + const ltxt = await lr.text(); + console.log('LOGIN', lr.status, ltxt); + } catch (e) { + console.error('TEST ERROR', e && e.message ? e.message : e); + } +})(); diff --git a/src/pages/Login.jsx b/src/pages/Login.jsx deleted file mode 100644 index 7c3b0c4..0000000 --- a/src/pages/Login.jsx +++ /dev/null @@ -1,75 +0,0 @@ -import React, { useState } from 'react' -import { FaGoogle, FaFacebook } from 'react-icons/fa' -import { IoMdHome, IoMdMap } from 'react-icons/io' -import { MdNotifications } from 'react-icons/md' -import { FaUser } from 'react-icons/fa' -import { useNavigate } from 'react-router-dom' - -export default function Login() { - const [remember, setRemember] = useState(false) - const navigate = useNavigate() - - const doLogin = (e) => { - e?.preventDefault() - // Basic auth simulation: store a flag - localStorage.setItem('authUser', JSON.stringify({ loggedIn: true })) - navigate('/home', { replace: true }) - } - - return ( -
-
-
⚠️
-
ShieldX
-
Instant Police Alerts
-
- -
- - - -
- - -
- - - -
-
-
Or continue with
-
-
- -
- - -
-
- -
- -
-
- -
Home
-
-
- -
Map
-
-
- -
Alert
-
-
- -
Profile
-
-
-
- ) -} diff --git a/src/pages/Signup.jsx b/src/pages/Signup.jsx deleted file mode 100644 index 3496e5d..0000000 --- a/src/pages/Signup.jsx +++ /dev/null @@ -1,53 +0,0 @@ -import React, { useState } from 'react' -import { useNavigate } from 'react-router-dom' - -export default function Signup() { - const [fullName, setFullName] = useState('') - const [email, setEmail] = useState('') - const [password, setPassword] = useState('') - const navigate = useNavigate() - - const doSignup = (e) => { - e?.preventDefault() - localStorage.setItem('authUser', JSON.stringify({ loggedIn: true, name: fullName || 'User' })) - navigate('/home', { replace: true }) - } - - return ( -
- -
-

Sign Up

-
- -
-
- ℹ️ -
-
- -
- setFullName(e.target.value)} /> - setEmail(e.target.value)} /> - setPassword(e.target.value)} /> - - - -
-
-
Or sign up with
-
-
- -
- - -
- -
- -
-
-
- ) -} From 1fe9b59d284fae4f18a2baa77d5145c46b3926d9 Mon Sep 17 00:00:00 2001 From: Mohit Kumhar Date: Wed, 24 Sep 2025 00:45:13 +0530 Subject: [PATCH 05/13] chore: updated ci jobs (#18) * chore: added labeler * fix: fix minor issues * feat: #01 Auth Working and complete signup and login Funtionallity * fix : Fix Bugs or error * Fix : Env Variable Hided * Fix * init * chore: update workflows * chore: update workflows * chore: fix ci jobs * chore: Trigger CI re-run --------- Co-authored-by: kushal --- .github/workflows/lint_test.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/lint_test.yml b/.github/workflows/lint_test.yml index c0ea240..96f6851 100644 --- a/.github/workflows/lint_test.yml +++ b/.github/workflows/lint_test.yml @@ -20,9 +20,10 @@ jobs: run: npm ci working-directory: ShieldX-Web - - name: Run lint (frontend) - run: npm run lint - working-directory: ShieldX-Web + # - name: Run lint (frontend) + # run: npm run lint + # working-directory: ShieldX-Web + build: runs-on: ubuntu-latest From 515cbc141c7373568343ae99a72b0177380bd75a Mon Sep 17 00:00:00 2001 From: Kushal mahawar Date: Wed, 24 Sep 2025 01:26:26 +0530 Subject: [PATCH 06/13] Kushal (#19) * feat: #01 Auth Working and complete signup and login Funtionallity * fix : Fix Bugs or error * Fix : Env Variable Hided * Fix * init * chore: fix file name * chore: Trigger CI re-run * fix: updated package json * fix: added eslint * chore(web): run eslint on src and add minimal config * fix : eslint --------- Co-authored-by: Mohit Kumhar --- ShieldX-Web/.eslintrc.json | 23 + ShieldX-Web/.gitignore | 1 + ShieldX-Web/README.md | 40 + ShieldX-Web/dist/assets/index-16523284.css | 1 + ShieldX-Web/dist/assets/index-96984a42.js | 62 + ShieldX-Web/dist/index.html | 15 + ShieldX-Web/eslint.config.cjs | 19 + ShieldX-Web/index.html | 13 + ShieldX-Web/package-lock.json | 4252 ++++++++++++++++++++ ShieldX-Web/package.json | 22 + ShieldX-Web/src/App.jsx | 36 + ShieldX-Web/src/components/BottomTabs.jsx | 19 + ShieldX-Web/src/components/PoliceMap.jsx | 143 + ShieldX-Web/src/main.jsx | 13 + ShieldX-Web/src/pages/Alerts.jsx | 177 + ShieldX-Web/src/pages/Chat.jsx | 112 + ShieldX-Web/src/pages/Evidence.jsx | 67 + ShieldX-Web/src/pages/Home.jsx | 76 + ShieldX-Web/src/pages/Location.jsx | 88 + ShieldX-Web/src/pages/Login.jsx | 90 + ShieldX-Web/src/pages/Signup.jsx | 87 + ShieldX-Web/src/styles/index.css | 949 +++++ server/package-lock.json | 1101 ++++- server/package.json | 10 +- 24 files changed, 7374 insertions(+), 42 deletions(-) create mode 100644 ShieldX-Web/.eslintrc.json create mode 100644 ShieldX-Web/.gitignore create mode 100644 ShieldX-Web/README.md create mode 100644 ShieldX-Web/dist/assets/index-16523284.css create mode 100644 ShieldX-Web/dist/assets/index-96984a42.js create mode 100644 ShieldX-Web/dist/index.html create mode 100644 ShieldX-Web/eslint.config.cjs create mode 100644 ShieldX-Web/index.html create mode 100644 ShieldX-Web/package-lock.json create mode 100644 ShieldX-Web/package.json create mode 100644 ShieldX-Web/src/App.jsx create mode 100644 ShieldX-Web/src/components/BottomTabs.jsx create mode 100644 ShieldX-Web/src/components/PoliceMap.jsx create mode 100644 ShieldX-Web/src/main.jsx create mode 100644 ShieldX-Web/src/pages/Alerts.jsx create mode 100644 ShieldX-Web/src/pages/Chat.jsx create mode 100644 ShieldX-Web/src/pages/Evidence.jsx create mode 100644 ShieldX-Web/src/pages/Home.jsx create mode 100644 ShieldX-Web/src/pages/Location.jsx create mode 100644 ShieldX-Web/src/pages/Login.jsx create mode 100644 ShieldX-Web/src/pages/Signup.jsx create mode 100644 ShieldX-Web/src/styles/index.css diff --git a/ShieldX-Web/.eslintrc.json b/ShieldX-Web/.eslintrc.json new file mode 100644 index 0000000..e34188d --- /dev/null +++ b/ShieldX-Web/.eslintrc.json @@ -0,0 +1,23 @@ +{ + "env": { + "browser": true, + "es2021": true + }, + "extends": [ + "eslint:recommended", + "plugin:react/recommended" + ], + "parserOptions": { + "ecmaFeatures": { + "jsx": true + }, + "ecmaVersion": 12, + "sourceType": "module" + }, + "settings": { + "react": { + "version": "detect" + } + }, + "rules": {} +} diff --git a/ShieldX-Web/.gitignore b/ShieldX-Web/.gitignore new file mode 100644 index 0000000..40b878d --- /dev/null +++ b/ShieldX-Web/.gitignore @@ -0,0 +1 @@ +node_modules/ \ No newline at end of file diff --git a/ShieldX-Web/README.md b/ShieldX-Web/README.md new file mode 100644 index 0000000..8aa9ea1 --- /dev/null +++ b/ShieldX-Web/README.md @@ -0,0 +1,40 @@ +Converted web app (first pass) + +This folder contains a Vite React app converted from the React Native project. It mirrors screens and styles closely using React + CSS. + +How to run (Windows cmd.exe): + +```cmd +cd "ShieldX- Web" +npm install +npm run dev +``` + +What I converted: +- Full `Home` screen (matching layout and panic button behavior) +- Basic pages for Login, Signup, Chat, Location, Alerts, Evidence as placeholders wired into the router +- Shared CSS closely matching the React Native styles + +Next steps I can do on request: +- Add exact icon replacements and interactive navigation bar +- Implement map (Location) using Leaflet or Google Maps +- Implement file upload for Evidence and integrate API endpoints +- Convert remaining screens with fidelity and accessibility improvements + +If you want me to continue and convert every RN screen precisely to web components (no RN imports), tell me and I will proceed screen-by-screen. + +## Backend API (optional) + +You can connect the frontend to the Node/Express backend to use real MongoDB-backed signup/login. + +1. Start the server in `server/` and set the API URL in your frontend environment. With Vite you should use a Vite-prefixed env var: + + - create a `.env` file in the frontend root with (Vite): + VITE_API_URL=http://localhost:4000 + + - or for older setups you can use the CRA-style var: + REACT_APP_API_URL=http://localhost:4000 + +2. Restart the dev server. Signup/Login will call the backend endpoints when `VITE_API_URL` or `REACT_APP_API_URL` is set. + +If not set, the app falls back to the local `localStorage`-based auth (demo mode). \ No newline at end of file diff --git a/ShieldX-Web/dist/assets/index-16523284.css b/ShieldX-Web/dist/assets/index-16523284.css new file mode 100644 index 0000000..3d1a59c --- /dev/null +++ b/ShieldX-Web/dist/assets/index-16523284.css @@ -0,0 +1 @@ +:root{--red: #E53935;--muted: #888;--bg: #fff }*{box-sizing:border-box}html,body,#root{height:100%;margin:0;font-family:Inter,system-ui,-apple-system,Segoe UI,Roboto,Helvetica Neue,Arial}.app-root{min-height:100vh;background:var(--bg)}.main-content{padding:16px}.bottom-tabs{position:fixed;left:0;right:0;bottom:0;height:64px;background:#fff;border-top:1px solid #eee;display:flex;align-items:center;justify-content:space-around;padding:8px 12px}.bottom-tabs .tab{display:flex;flex-direction:column;align-items:center;color:#777;text-decoration:none}.bottom-tabs .tab.active{color:var(--red)}.bottom-tabs .tab-label{font-size:12px;margin-top:4px}.main-content{padding-bottom:88px}.safe-area{min-height:80vh;padding:8px}.header-row{display:flex;align-items:center;justify-content:space-between;padding:8px 12px;margin-bottom:8px}.header-title{font-size:20px;font-weight:700;color:#222}.header-icon{background:#f5f5f5;border-radius:20px;padding:8px;border:none}.status-bar{display:flex;align-items:center;gap:8px;background:#f7f7fa;border-radius:12px;border:1px solid #e0e0e0;padding:10px 14px;margin:8px 0}.status-bar.panic{background:#fff3f3;border-color:var(--red)}.status-text{font-size:16px;color:#222;font-weight:600}.status-text.panic{color:var(--red);font-weight:700}.sos-container{text-align:center;margin:14px 0}.sos-button{width:220px;height:220px;border-radius:110px;background:var(--red);color:#fff;display:inline-flex;flex-direction:column;align-items:center;justify-content:center;border:0;box-shadow:0 8px 16px #e539352e;cursor:pointer}.sos-button:disabled{opacity:.85;cursor:default}.sos-button.active{background:#fff;border:4px solid var(--red)}.sos-text{color:#fff;font-size:36px;font-weight:700;margin-top:8px;letter-spacing:2px}.sos-text.active{color:var(--red)}.sos-subtext{color:var(--muted);font-size:16px;margin-top:10px}.quick-actions-section{margin-top:10px;padding:0 4px}.quick-actions-title{font-size:18px;font-weight:700;margin-bottom:12px}.quick-actions-grid{display:flex;gap:16px;margin-bottom:16px}.quick-action-box{flex:1;background:#f7f7fa;border-radius:18px;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:16px;min-height:96px;cursor:pointer;transition:box-shadow .15s ease,transform .12s ease;text-align:center}.quick-action-label{margin-top:10px;font-size:15px;font-weight:600;color:#222}.auth-screen{max-width:420px;margin:20px auto;padding:16px;background:#fff;border-radius:12px;box-shadow:0 4px 12px #0000000d}.auth-form{display:flex;flex-direction:column;gap:12px}.auth-form input{padding:10px;border-radius:8px;border:1px solid #e0e0e0}.auth-form button{background:var(--red);color:#fff;padding:10px;border-radius:8px;border:0;cursor:pointer}@media (max-width:600px){.quick-actions-grid{flex-direction:column}.quick-action-box{width:100%}}.quick-action-box:focus,.quick-action-box:hover{box-shadow:0 8px 20px #0000000f;transform:translateY(-4px);outline:none}.quick-action-box svg{display:block}.quick-action-label{line-height:1.1}.chat-screen{display:flex;flex-direction:column;height:calc(100vh - 64px);max-height:100vh}.chat-header{display:flex;align-items:center;justify-content:space-between;padding:10px}.back-btn{background:none;border:0;font-size:20px;cursor:pointer}.chat-title{font-size:20px;font-weight:700;color:#222}.avatar-row{display:flex;justify-content:center;margin-bottom:8px}.avatar-circle{width:60px;height:60px;border-radius:30px;background:#eee;display:flex;align-items:center;justify-content:center;position:relative}.avatar-status{position:absolute;right:8px;bottom:8px;width:12px;height:12px;border-radius:6px;background:#3ecf4a;border:2px solid #fff}.chat-area{flex:1;overflow:auto;padding:10px}.bubble-row{display:flex;align-items:flex-end;margin-bottom:12px}.bubble-row.user{justify-content:flex-end}.bubble-avatar,.bubble-avatar-user{width:36px;height:36px;border-radius:18px;background:#ddd;display:flex;align-items:center;justify-content:center}.bubble-avatar{margin-right:8px}.bubble-avatar-user{margin-left:8px}.bubble-left{background:#f7f7fa;border-radius:16px;padding:12px;max-width:70%}.bubble-right{background:#E53935;border-radius:16px;padding:12px;max-width:70%}.bubble-sender{font-size:12px;color:#b71c1c;font-weight:700;margin-bottom:6px}.bubble-text{font-size:15px;color:#222}.bubble-text-user{font-size:15px;color:#fff}.typing-indicator{display:flex;align-items:center;justify-content:center;margin:8px 0}.spinner{width:16px;height:16px;border-radius:8px;background:var(--red);animation:spin 1s linear infinite;margin-right:8px}.typing-text{color:var(--red);font-size:13px}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.input-bar{display:flex;align-items:center;padding:10px;border-top:1px solid #eee;background:#fff}.chat-input{flex:1;background:#f7f7fa;border-radius:20px;padding:10px 14px;font-size:15px;border:1px solid #eee;margin-right:8px}.input-mic{background:none;border:0;margin-right:8px}.input-send{background:var(--red);border:0;border-radius:20px;padding:8px;display:flex;align-items:center;justify-content:center;color:#fff;cursor:pointer}.status-card{background:#f7f7fa;border-radius:14px;padding:16px;margin:12px}.status-card.offline{background:#fff3f3}.status-card.mesh{background:#e3f2fd}.queued-section{background:#fff8f0;border-radius:14px;padding:14px;margin:12px}.queued-title{font-size:15px;font-weight:700;color:var(--red);margin-bottom:8px}.queued-alert-box{display:flex;align-items:flex-start;margin-bottom:8px}.send-btn{display:inline-flex;align-items:center;background:var(--red);color:#fff;border:0;padding:8px 12px;border-radius:20px;cursor:pointer}.status-pill{padding:6px 10px;border-radius:14px;font-weight:700;background:#f0f0f0;color:#222;font-size:13px}.status-pill.online{background:#e8f8ee;color:#0b8a39}.status-pill.offline{background:#fff3f3;color:#c62828}.status-pill.mesh{background:#eaf4ff;color:#1565c0}.icon-btn{background:#fff;border:1px solid #eee;padding:8px;border-radius:10px;cursor:pointer}.alert-controls{display:flex;gap:12px;margin-top:12px}.btn{background:var(--red);color:#fff;border:0;padding:8px 12px;border-radius:8px;cursor:pointer}.btn.outline{background:#fff;border:1px solid #ddd;color:#333}.btn.small{padding:6px 8px;border-radius:6px}.btn.primary{background:var(--red);padding:6px 8px}.btn.tiny{padding:6px 8px;font-size:12px}.queued-section{background:#fff;border-radius:12px;padding:12px;margin:12px 0}.queued-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:10px}.queued-title{font-size:16px;font-weight:700;color:#222}.queued-actions{display:flex;gap:8px}.empty-queued{color:#888;font-style:italic;padding:12px}.queued-list{display:flex;flex-direction:column;gap:10px}.queued-alert-box{display:flex;align-items:flex-start;gap:12px;padding:10px;border-radius:10px;background:#fff8f0;border:1px solid #ffe6e0}.queued-left{flex:0 0 36px;display:flex;align-items:center;justify-content:center}.queued-body{flex:1}.queued-type{font-weight:700;color:var(--red);margin-bottom:6px}.queued-details{color:#333}.queued-time{color:#888;font-size:12px;margin-top:6px}.queued-actions{display:flex;flex-direction:column;gap:6px}.features-section{margin-top:16px}.features-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(140px,1fr));gap:12px;margin-bottom:12px}.feature-box{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:16px;border-radius:12px;background:#f7f7fa;min-height:96px;text-align:center}.feature-box svg{width:36px;height:36px}.feature-label{text-align:center;margin-top:8px;font-weight:600;font-size:14px;color:#222}.feature-subtext{font-size:12px;color:#666;margin-top:6px}.feature-box{transition:box-shadow .18s ease,border-color .18s ease,transform .12s ease}.feature-box:focus,.feature-box:hover{box-shadow:0 6px 18px #0000000f;transform:translateY(-4px);outline:none}.map-panel{margin-top:12px;background:#fff;border-radius:12px;border:1px solid #eee;padding:12px}.map-panel-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px}.map-panel-body{display:flex;gap:12px}.map-area{flex:1;position:relative;background:linear-gradient(180deg,#eaf3ff,#fff);height:260px;border-radius:10px;overflow:hidden;border:1px solid #dcecff}.center-dot{position:absolute;width:14px;height:14px;border-radius:7px;background:#1976d2;border:2px solid #fff;transform:translate(-50%,-50%)}.marker{position:absolute;width:30px;height:30px;border-radius:15px;background:transparent;border:0;cursor:pointer;display:flex;align-items:center;justify-content:center}.marker .marker-dot{width:12px;height:12px;border-radius:6px;background:#E53935;border:2px solid #fff;box-shadow:0 2px 6px #0000001f}.marker.selected .marker-dot{background:#1976d2}.unit-list{width:280px;display:flex;flex-direction:column;gap:8px}.unit-list-title{font-weight:700;margin-bottom:6px}.unit-item{display:flex;justify-content:space-between;align-items:center;padding:8px;border-radius:8px;border:1px solid #f0f0f0;background:#fafcff;cursor:pointer}.unit-item.active{box-shadow:0 6px 18px #1976d214;border-color:#d0e8ff}.selected-details{margin-top:10px;padding:8px;border-radius:8px;background:#f7f7fa;border:1px solid #eee}@media (max-width:720px){.map-panel-body{flex-direction:column}.unit-list{width:100%}}.evidence-screen .actions-row{display:flex;gap:12px;justify-content:center;margin:16px}.action-btn{background:var(--red);color:#fff;border:0;padding:10px 14px;border-radius:20px;cursor:pointer}.media-preview{display:flex;flex-wrap:wrap;justify-content:center;margin:12px}.media-box{width:110px;height:110px;background:#f7f7fa;border-radius:14px;margin:8px;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:6px}.media-img{width:90px;height:90px;object-fit:cover;border-radius:10px}.media-type{color:#1976d2;font-weight:700;margin-top:6px}.upload-btn{background:#1976d2;color:#fff;border:0;padding:12px 20px;border-radius:22px;display:block;margin:16px auto;cursor:pointer}.map-view{height:28vh;border-radius:18px;margin:12px;padding:12px;background:#fff}.action-row{display:flex;gap:12px;justify-content:space-evenly;margin:12px}.action-btn.alt{background:#1976d2}.emergency-row{display:flex;gap:8px;margin-top:8px}.emergency-btn{flex:1;background:#fff0f0;border-radius:14px;padding:12px;border:0;cursor:pointer}.list-section{padding:12px}.list-item{display:flex;align-items:center;background:#f7f7fa;border-radius:14px;padding:12px;margin-bottom:10px}.list-item-name{font-size:15px;font-weight:600}.list-item-address{font-size:13px;color:#888}.input{display:block;width:100%;padding:10px;border-radius:8px;border:1px solid #e0e0e0;margin-bottom:12px}.remember-row{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px}.forgot{background:none;border:0;color:red;cursor:pointer}.login-btn{background:red;color:#fff;padding:12px;border-radius:30px;border:0;display:block;width:100%;cursor:pointer}.divider-row{display:flex;align-items:center;margin:12px 0}.divider{flex:1;height:1;background:#ddd}.or-text{margin:0 10px;color:#900}.social-row{display:flex;gap:12px;justify-content:center}.social-btn{border:1px solid #ddd;padding:10px 14px;border-radius:30px;background:#fff;cursor:pointer}.bottom-nav{display:flex;justify-content:space-around;padding:12px;border-top:1px solid #eee;background:#fff}.nav-text{font-size:12px;color:#777;text-align:center}.nav-text-active{font-size:12px;color:red;text-align:center}.signup-btn{background:red;color:#fff;padding:12px;border-radius:30px;border:0;display:block;width:100%;cursor:pointer}.dividerContainer{display:flex;align-items:center;margin:12px 0}.line{flex:1;height:1;background:#ccc}.orText{margin:0 10px;color:#777}.socialContainer{display:flex;justify-content:space-evenly;margin-bottom:20px}.socialBtn{border:1px solid #ccc;padding:10px 14px;border-radius:10px;background:#fff;cursor:pointer}.link{background:none;border:0;cursor:pointer} diff --git a/ShieldX-Web/dist/assets/index-96984a42.js b/ShieldX-Web/dist/assets/index-96984a42.js new file mode 100644 index 0000000..276eabb --- /dev/null +++ b/ShieldX-Web/dist/assets/index-96984a42.js @@ -0,0 +1,62 @@ +function rd(e,t){for(var n=0;nr[l]})}}}return Object.freeze(Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}))}(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const l of document.querySelectorAll('link[rel="modulepreload"]'))r(l);new MutationObserver(l=>{for(const i of l)if(i.type==="childList")for(const o of i.addedNodes)o.tagName==="LINK"&&o.rel==="modulepreload"&&r(o)}).observe(document,{childList:!0,subtree:!0});function n(l){const i={};return l.integrity&&(i.integrity=l.integrity),l.referrerPolicy&&(i.referrerPolicy=l.referrerPolicy),l.crossOrigin==="use-credentials"?i.credentials="include":l.crossOrigin==="anonymous"?i.credentials="omit":i.credentials="same-origin",i}function r(l){if(l.ep)return;l.ep=!0;const i=n(l);fetch(l.href,i)}})();function ld(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var Ou={exports:{}},M={};/** + * @license React + * react.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var ur=Symbol.for("react.element"),id=Symbol.for("react.portal"),od=Symbol.for("react.fragment"),ad=Symbol.for("react.strict_mode"),ud=Symbol.for("react.profiler"),sd=Symbol.for("react.provider"),cd=Symbol.for("react.context"),dd=Symbol.for("react.forward_ref"),fd=Symbol.for("react.suspense"),pd=Symbol.for("react.memo"),md=Symbol.for("react.lazy"),ca=Symbol.iterator;function hd(e){return e===null||typeof e!="object"?null:(e=ca&&e[ca]||e["@@iterator"],typeof e=="function"?e:null)}var Iu={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},Du=Object.assign,Uu={};function fn(e,t,n){this.props=e,this.context=t,this.refs=Uu,this.updater=n||Iu}fn.prototype.isReactComponent={};fn.prototype.setState=function(e,t){if(typeof e!="object"&&typeof e!="function"&&e!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")};fn.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")};function Fu(){}Fu.prototype=fn.prototype;function uo(e,t,n){this.props=e,this.context=t,this.refs=Uu,this.updater=n||Iu}var so=uo.prototype=new Fu;so.constructor=uo;Du(so,fn.prototype);so.isPureReactComponent=!0;var da=Array.isArray,ju=Object.prototype.hasOwnProperty,co={current:null},Au={key:!0,ref:!0,__self:!0,__source:!0};function Bu(e,t,n){var r,l={},i=null,o=null;if(t!=null)for(r in t.ref!==void 0&&(o=t.ref),t.key!==void 0&&(i=""+t.key),t)ju.call(t,r)&&!Au.hasOwnProperty(r)&&(l[r]=t[r]);var a=arguments.length-2;if(a===1)l.children=n;else if(1>>1,q=P[K];if(0>>1;Kl(Fl,T))Ntl(mr,Fl)?(P[K]=mr,P[Nt]=T,K=Nt):(P[K]=Fl,P[Ct]=T,K=Ct);else if(Ntl(mr,T))P[K]=mr,P[Nt]=T,K=Nt;else break e}}return R}function l(P,R){var T=P.sortIndex-R.sortIndex;return T!==0?T:P.id-R.id}if(typeof performance=="object"&&typeof performance.now=="function"){var i=performance;e.unstable_now=function(){return i.now()}}else{var o=Date,a=o.now();e.unstable_now=function(){return o.now()-a}}var u=[],c=[],h=1,p=null,m=3,g=!1,y=!1,E=!1,x=typeof setTimeout=="function"?setTimeout:null,f=typeof clearTimeout=="function"?clearTimeout:null,d=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function v(P){for(var R=n(c);R!==null;){if(R.callback===null)r(c);else if(R.startTime<=P)r(c),R.sortIndex=R.expirationTime,t(u,R);else break;R=n(c)}}function w(P){if(E=!1,v(P),!y)if(n(u)!==null)y=!0,Dl(C);else{var R=n(c);R!==null&&Ul(w,R.startTime-P)}}function C(P,R){y=!1,E&&(E=!1,f(L),L=-1),g=!0;var T=m;try{for(v(R),p=n(u);p!==null&&(!(p.expirationTime>R)||P&&!Le());){var K=p.callback;if(typeof K=="function"){p.callback=null,m=p.priorityLevel;var q=K(p.expirationTime<=R);R=e.unstable_now(),typeof q=="function"?p.callback=q:p===n(u)&&r(u),v(R)}else r(u);p=n(u)}if(p!==null)var pr=!0;else{var Ct=n(c);Ct!==null&&Ul(w,Ct.startTime-R),pr=!1}return pr}finally{p=null,m=T,g=!1}}var z=!1,_=null,L=-1,Q=5,O=-1;function Le(){return!(e.unstable_now()-OP||125K?(P.sortIndex=T,t(c,P),n(u)===null&&P===n(c)&&(E?(f(L),L=-1):E=!0,Ul(w,T-K))):(P.sortIndex=q,t(u,P),y||g||(y=!0,Dl(C))),P},e.unstable_shouldYield=Le,e.unstable_wrapCallback=function(P){var R=m;return function(){var T=m;m=R;try{return P.apply(this,arguments)}finally{m=T}}}})(Hu);Vu.exports=Hu;var Sd=Vu.exports;/** + * @license React + * react-dom.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var Wu=S,we=Sd;function k(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),fi=Object.prototype.hasOwnProperty,kd=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,pa={},ma={};function Cd(e){return fi.call(ma,e)?!0:fi.call(pa,e)?!1:kd.test(e)?ma[e]=!0:(pa[e]=!0,!1)}function Nd(e,t,n,r){if(n!==null&&n.type===0)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return r?!1:n!==null?!n.acceptsBooleans:(e=e.toLowerCase().slice(0,5),e!=="data-"&&e!=="aria-");default:return!1}}function xd(e,t,n,r){if(t===null||typeof t>"u"||Nd(e,t,n,r))return!0;if(r)return!1;if(n!==null)switch(n.type){case 3:return!t;case 4:return t===!1;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}function de(e,t,n,r,l,i,o){this.acceptsBooleans=t===2||t===3||t===4,this.attributeName=r,this.attributeNamespace=l,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=i,this.removeEmptyString=o}var re={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){re[e]=new de(e,0,!1,e,null,!1,!1)});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];re[t]=new de(t,1,!1,e[1],null,!1,!1)});["contentEditable","draggable","spellCheck","value"].forEach(function(e){re[e]=new de(e,2,!1,e.toLowerCase(),null,!1,!1)});["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){re[e]=new de(e,2,!1,e,null,!1,!1)});"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){re[e]=new de(e,3,!1,e.toLowerCase(),null,!1,!1)});["checked","multiple","muted","selected"].forEach(function(e){re[e]=new de(e,3,!0,e,null,!1,!1)});["capture","download"].forEach(function(e){re[e]=new de(e,4,!1,e,null,!1,!1)});["cols","rows","size","span"].forEach(function(e){re[e]=new de(e,6,!1,e,null,!1,!1)});["rowSpan","start"].forEach(function(e){re[e]=new de(e,5,!1,e.toLowerCase(),null,!1,!1)});var po=/[\-:]([a-z])/g;function mo(e){return e[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(e){var t=e.replace(po,mo);re[t]=new de(t,1,!1,e,null,!1,!1)});"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var t=e.replace(po,mo);re[t]=new de(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)});["xml:base","xml:lang","xml:space"].forEach(function(e){var t=e.replace(po,mo);re[t]=new de(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)});["tabIndex","crossOrigin"].forEach(function(e){re[e]=new de(e,1,!1,e.toLowerCase(),null,!1,!1)});re.xlinkHref=new de("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1);["src","href","action","formAction"].forEach(function(e){re[e]=new de(e,1,!1,e.toLowerCase(),null,!0,!0)});function ho(e,t,n,r){var l=re.hasOwnProperty(t)?re[t]:null;(l!==null?l.type!==0:r||!(2a||l[o]!==i[a]){var u=` +`+l[o].replace(" at new "," at ");return e.displayName&&u.includes("")&&(u=u.replace("",e.displayName)),u}while(1<=o&&0<=a);break}}}finally{Bl=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:"")?Rn(e):""}function Pd(e){switch(e.tag){case 5:return Rn(e.type);case 16:return Rn("Lazy");case 13:return Rn("Suspense");case 19:return Rn("SuspenseList");case 0:case 2:case 15:return e=$l(e.type,!1),e;case 11:return e=$l(e.type.render,!1),e;case 1:return e=$l(e.type,!0),e;default:return""}}function vi(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case $t:return"Fragment";case Bt:return"Portal";case pi:return"Profiler";case vo:return"StrictMode";case mi:return"Suspense";case hi:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case Yu:return(e.displayName||"Context")+".Consumer";case Ku:return(e._context.displayName||"Context")+".Provider";case go:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case yo:return t=e.displayName||null,t!==null?t:vi(e.type)||"Memo";case et:t=e._payload,e=e._init;try{return vi(e(t))}catch{}}return null}function zd(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=t.render,e=e.displayName||e.name||"",t.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return vi(t);case 8:return t===vo?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof t=="function")return t.displayName||t.name||null;if(typeof t=="string")return t}return null}function gt(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function Xu(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function _d(e){var t=Xu(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=""+e[t];if(!e.hasOwnProperty(t)&&typeof n<"u"&&typeof n.get=="function"&&typeof n.set=="function"){var l=n.get,i=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return l.call(this)},set:function(o){r=""+o,i.call(this,o)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return r},setValue:function(o){r=""+o},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function gr(e){e._valueTracker||(e._valueTracker=_d(e))}function Ju(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r="";return e&&(r=Xu(e)?e.checked?"true":"false":e.value),e=r,e!==n?(t.setValue(e),!0):!1}function Kr(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function gi(e,t){var n=t.checked;return V({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:n??e._wrapperState.initialChecked})}function va(e,t){var n=t.defaultValue==null?"":t.defaultValue,r=t.checked!=null?t.checked:t.defaultChecked;n=gt(t.value!=null?t.value:n),e._wrapperState={initialChecked:r,initialValue:n,controlled:t.type==="checkbox"||t.type==="radio"?t.checked!=null:t.value!=null}}function Zu(e,t){t=t.checked,t!=null&&ho(e,"checked",t,!1)}function yi(e,t){Zu(e,t);var n=gt(t.value),r=t.type;if(n!=null)r==="number"?(n===0&&e.value===""||e.value!=n)&&(e.value=""+n):e.value!==""+n&&(e.value=""+n);else if(r==="submit"||r==="reset"){e.removeAttribute("value");return}t.hasOwnProperty("value")?Ei(e,t.type,n):t.hasOwnProperty("defaultValue")&&Ei(e,t.type,gt(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function ga(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var r=t.type;if(!(r!=="submit"&&r!=="reset"||t.value!==void 0&&t.value!==null))return;t=""+e._wrapperState.initialValue,n||t===e.value||(e.value=t),e.defaultValue=t}n=e.name,n!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,n!==""&&(e.name=n)}function Ei(e,t,n){(t!=="number"||Kr(e.ownerDocument)!==e)&&(n==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+n&&(e.defaultValue=""+n))}var Tn=Array.isArray;function qt(e,t,n,r){if(e=e.options,t){t={};for(var l=0;l"+t.valueOf().toString()+"",t=yr.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function Wn(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&n.nodeType===3){n.nodeValue=t;return}}e.textContent=t}var In={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},Ld=["Webkit","ms","Moz","O"];Object.keys(In).forEach(function(e){Ld.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),In[t]=In[e]})});function ts(e,t,n){return t==null||typeof t=="boolean"||t===""?"":n||typeof t!="number"||t===0||In.hasOwnProperty(e)&&In[e]?(""+t).trim():t+"px"}function ns(e,t){e=e.style;for(var n in t)if(t.hasOwnProperty(n)){var r=n.indexOf("--")===0,l=ts(n,t[n],r);n==="float"&&(n="cssFloat"),r?e.setProperty(n,l):e[n]=l}}var Rd=V({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function ki(e,t){if(t){if(Rd[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(k(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(k(60));if(typeof t.dangerouslySetInnerHTML!="object"||!("__html"in t.dangerouslySetInnerHTML))throw Error(k(61))}if(t.style!=null&&typeof t.style!="object")throw Error(k(62))}}function Ci(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var Ni=null;function Eo(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var xi=null,bt=null,en=null;function wa(e){if(e=dr(e)){if(typeof xi!="function")throw Error(k(280));var t=e.stateNode;t&&(t=Cl(t),xi(e.stateNode,e.type,t))}}function rs(e){bt?en?en.push(e):en=[e]:bt=e}function ls(){if(bt){var e=bt,t=en;if(en=bt=null,wa(e),t)for(e=0;e>>=0,e===0?32:31-($d(e)/Vd|0)|0}var Er=64,wr=4194304;function Mn(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function Jr(e,t){var n=e.pendingLanes;if(n===0)return 0;var r=0,l=e.suspendedLanes,i=e.pingedLanes,o=n&268435455;if(o!==0){var a=o&~l;a!==0?r=Mn(a):(i&=o,i!==0&&(r=Mn(i)))}else o=n&~l,o!==0?r=Mn(o):i!==0&&(r=Mn(i));if(r===0)return 0;if(t!==0&&t!==r&&!(t&l)&&(l=r&-r,i=t&-t,l>=i||l===16&&(i&4194240)!==0))return t;if(r&4&&(r|=n&16),t=e.entangledLanes,t!==0)for(e=e.entanglements,t&=r;0n;n++)t.push(e);return t}function sr(e,t,n){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-Ie(t),e[t]=n}function Kd(e,t){var n=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var r=e.eventTimes;for(e=e.expirationTimes;0=Un),La=String.fromCharCode(32),Ra=!1;function Ns(e,t){switch(e){case"keyup":return Sf.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function xs(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var Vt=!1;function Cf(e,t){switch(e){case"compositionend":return xs(t);case"keypress":return t.which!==32?null:(Ra=!0,La);case"textInput":return e=t.data,e===La&&Ra?null:e;default:return null}}function Nf(e,t){if(Vt)return e==="compositionend"||!zo&&Ns(e,t)?(e=ks(),Ur=No=lt=null,Vt=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=r}e:{for(;n;){if(n.nextSibling){n=n.nextSibling;break e}n=n.parentNode}n=void 0}n=Ia(n)}}function Ls(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?Ls(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function Rs(){for(var e=window,t=Kr();t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href=="string"}catch{n=!1}if(n)e=t.contentWindow;else break;t=Kr(e.document)}return t}function _o(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}function Of(e){var t=Rs(),n=e.focusedElem,r=e.selectionRange;if(t!==n&&n&&n.ownerDocument&&Ls(n.ownerDocument.documentElement,n)){if(r!==null&&_o(n)){if(t=r.start,e=r.end,e===void 0&&(e=t),"selectionStart"in n)n.selectionStart=t,n.selectionEnd=Math.min(e,n.value.length);else if(e=(t=n.ownerDocument||document)&&t.defaultView||window,e.getSelection){e=e.getSelection();var l=n.textContent.length,i=Math.min(r.start,l);r=r.end===void 0?i:Math.min(r.end,l),!e.extend&&i>r&&(l=r,r=i,i=l),l=Da(n,i);var o=Da(n,r);l&&o&&(e.rangeCount!==1||e.anchorNode!==l.node||e.anchorOffset!==l.offset||e.focusNode!==o.node||e.focusOffset!==o.offset)&&(t=t.createRange(),t.setStart(l.node,l.offset),e.removeAllRanges(),i>r?(e.addRange(t),e.extend(o.node,o.offset)):(t.setEnd(o.node,o.offset),e.addRange(t)))}}for(t=[],e=n;e=e.parentNode;)e.nodeType===1&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof n.focus=="function"&&n.focus(),n=0;n=document.documentMode,Ht=null,Ti=null,jn=null,Mi=!1;function Ua(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;Mi||Ht==null||Ht!==Kr(r)||(r=Ht,"selectionStart"in r&&_o(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),jn&&Jn(jn,r)||(jn=r,r=br(Ti,"onSelect"),0Kt||(e.current=ji[Kt],ji[Kt]=null,Kt--)}function U(e,t){Kt++,ji[Kt]=e.current,e.current=t}var yt={},ae=wt(yt),me=wt(!1),Mt=yt;function on(e,t){var n=e.type.contextTypes;if(!n)return yt;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===t)return r.__reactInternalMemoizedMaskedChildContext;var l={},i;for(i in n)l[i]=t[i];return r&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=l),l}function he(e){return e=e.childContextTypes,e!=null}function tl(){j(me),j(ae)}function Ha(e,t,n){if(ae.current!==yt)throw Error(k(168));U(ae,t),U(me,n)}function As(e,t,n){var r=e.stateNode;if(t=t.childContextTypes,typeof r.getChildContext!="function")return n;r=r.getChildContext();for(var l in r)if(!(l in t))throw Error(k(108,zd(e)||"Unknown",l));return V({},n,r)}function nl(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||yt,Mt=ae.current,U(ae,e),U(me,me.current),!0}function Wa(e,t,n){var r=e.stateNode;if(!r)throw Error(k(169));n?(e=As(e,t,Mt),r.__reactInternalMemoizedMergedChildContext=e,j(me),j(ae),U(ae,e)):j(me),U(me,n)}var We=null,Nl=!1,ti=!1;function Bs(e){We===null?We=[e]:We.push(e)}function Qf(e){Nl=!0,Bs(e)}function St(){if(!ti&&We!==null){ti=!0;var e=0,t=D;try{var n=We;for(D=1;e>=o,l-=o,Qe=1<<32-Ie(t)+l|n<L?(Q=_,_=null):Q=_.sibling;var O=m(f,_,v[L],w);if(O===null){_===null&&(_=Q);break}e&&_&&O.alternate===null&&t(f,_),d=i(O,d,L),z===null?C=O:z.sibling=O,z=O,_=Q}if(L===v.length)return n(f,_),A&&xt(f,L),C;if(_===null){for(;LL?(Q=_,_=null):Q=_.sibling;var Le=m(f,_,O.value,w);if(Le===null){_===null&&(_=Q);break}e&&_&&Le.alternate===null&&t(f,_),d=i(Le,d,L),z===null?C=Le:z.sibling=Le,z=Le,_=Q}if(O.done)return n(f,_),A&&xt(f,L),C;if(_===null){for(;!O.done;L++,O=v.next())O=p(f,O.value,w),O!==null&&(d=i(O,d,L),z===null?C=O:z.sibling=O,z=O);return A&&xt(f,L),C}for(_=r(f,_);!O.done;L++,O=v.next())O=g(_,f,L,O.value,w),O!==null&&(e&&O.alternate!==null&&_.delete(O.key===null?L:O.key),d=i(O,d,L),z===null?C=O:z.sibling=O,z=O);return e&&_.forEach(function(wn){return t(f,wn)}),A&&xt(f,L),C}function x(f,d,v,w){if(typeof v=="object"&&v!==null&&v.type===$t&&v.key===null&&(v=v.props.children),typeof v=="object"&&v!==null){switch(v.$$typeof){case vr:e:{for(var C=v.key,z=d;z!==null;){if(z.key===C){if(C=v.type,C===$t){if(z.tag===7){n(f,z.sibling),d=l(z,v.props.children),d.return=f,f=d;break e}}else if(z.elementType===C||typeof C=="object"&&C!==null&&C.$$typeof===et&&Za(C)===z.type){n(f,z.sibling),d=l(z,v.props),d.ref=zn(f,z,v),d.return=f,f=d;break e}n(f,z);break}else t(f,z);z=z.sibling}v.type===$t?(d=Tt(v.props.children,f.mode,w,v.key),d.return=f,f=d):(w=Wr(v.type,v.key,v.props,null,f.mode,w),w.ref=zn(f,d,v),w.return=f,f=w)}return o(f);case Bt:e:{for(z=v.key;d!==null;){if(d.key===z)if(d.tag===4&&d.stateNode.containerInfo===v.containerInfo&&d.stateNode.implementation===v.implementation){n(f,d.sibling),d=l(d,v.children||[]),d.return=f,f=d;break e}else{n(f,d);break}else t(f,d);d=d.sibling}d=si(v,f.mode,w),d.return=f,f=d}return o(f);case et:return z=v._init,x(f,d,z(v._payload),w)}if(Tn(v))return y(f,d,v,w);if(kn(v))return E(f,d,v,w);zr(f,v)}return typeof v=="string"&&v!==""||typeof v=="number"?(v=""+v,d!==null&&d.tag===6?(n(f,d.sibling),d=l(d,v),d.return=f,f=d):(n(f,d),d=ui(v,f.mode,w),d.return=f,f=d),o(f)):n(f,d)}return x}var un=Gs(!0),Xs=Gs(!1),fr={},$e=wt(fr),er=wt(fr),tr=wt(fr);function Lt(e){if(e===fr)throw Error(k(174));return e}function Fo(e,t){switch(U(tr,t),U(er,e),U($e,fr),e=t.nodeType,e){case 9:case 11:t=(t=t.documentElement)?t.namespaceURI:Si(null,"");break;default:e=e===8?t.parentNode:t,t=e.namespaceURI||null,e=e.tagName,t=Si(t,e)}j($e),U($e,t)}function sn(){j($e),j(er),j(tr)}function Js(e){Lt(tr.current);var t=Lt($e.current),n=Si(t,e.type);t!==n&&(U(er,e),U($e,n))}function jo(e){er.current===e&&(j($e),j(er))}var B=wt(0);function ul(e){for(var t=e;t!==null;){if(t.tag===13){var n=t.memoizedState;if(n!==null&&(n=n.dehydrated,n===null||n.data==="$?"||n.data==="$!"))return t}else if(t.tag===19&&t.memoizedProps.revealOrder!==void 0){if(t.flags&128)return t}else if(t.child!==null){t.child.return=t,t=t.child;continue}if(t===e)break;for(;t.sibling===null;){if(t.return===null||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}var ni=[];function Ao(){for(var e=0;en?n:4,e(!0);var r=ri.transition;ri.transition={};try{e(!1),t()}finally{D=n,ri.transition=r}}function fc(){return _e().memoizedState}function Xf(e,t,n){var r=pt(e);if(n={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null},pc(e))mc(t,n);else if(n=Ws(e,t,n,r),n!==null){var l=se();De(n,e,r,l),hc(n,t,r)}}function Jf(e,t,n){var r=pt(e),l={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null};if(pc(e))mc(t,l);else{var i=e.alternate;if(e.lanes===0&&(i===null||i.lanes===0)&&(i=t.lastRenderedReducer,i!==null))try{var o=t.lastRenderedState,a=i(o,n);if(l.hasEagerState=!0,l.eagerState=a,Ue(a,o)){var u=t.interleaved;u===null?(l.next=l,Do(t)):(l.next=u.next,u.next=l),t.interleaved=l;return}}catch{}finally{}n=Ws(e,t,l,r),n!==null&&(l=se(),De(n,e,r,l),hc(n,t,r))}}function pc(e){var t=e.alternate;return e===$||t!==null&&t===$}function mc(e,t){An=sl=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function hc(e,t,n){if(n&4194240){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,So(e,n)}}var cl={readContext:ze,useCallback:le,useContext:le,useEffect:le,useImperativeHandle:le,useInsertionEffect:le,useLayoutEffect:le,useMemo:le,useReducer:le,useRef:le,useState:le,useDebugValue:le,useDeferredValue:le,useTransition:le,useMutableSource:le,useSyncExternalStore:le,useId:le,unstable_isNewReconciler:!1},Zf={readContext:ze,useCallback:function(e,t){return je().memoizedState=[e,t===void 0?null:t],e},useContext:ze,useEffect:ba,useImperativeHandle:function(e,t,n){return n=n!=null?n.concat([e]):null,Br(4194308,4,ac.bind(null,t,e),n)},useLayoutEffect:function(e,t){return Br(4194308,4,e,t)},useInsertionEffect:function(e,t){return Br(4,2,e,t)},useMemo:function(e,t){var n=je();return t=t===void 0?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var r=je();return t=n!==void 0?n(t):t,r.memoizedState=r.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},r.queue=e,e=e.dispatch=Xf.bind(null,$,e),[r.memoizedState,e]},useRef:function(e){var t=je();return e={current:e},t.memoizedState=e},useState:qa,useDebugValue:Wo,useDeferredValue:function(e){return je().memoizedState=e},useTransition:function(){var e=qa(!1),t=e[0];return e=Gf.bind(null,e[1]),je().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,n){var r=$,l=je();if(A){if(n===void 0)throw Error(k(407));n=n()}else{if(n=t(),ee===null)throw Error(k(349));It&30||bs(r,t,n)}l.memoizedState=n;var i={value:n,getSnapshot:t};return l.queue=i,ba(tc.bind(null,r,i,e),[e]),r.flags|=2048,lr(9,ec.bind(null,r,i,n,t),void 0,null),n},useId:function(){var e=je(),t=ee.identifierPrefix;if(A){var n=Ke,r=Qe;n=(r&~(1<<32-Ie(r)-1)).toString(32)+n,t=":"+t+"R"+n,n=nr++,0<\/script>",e=e.removeChild(e.firstChild)):typeof r.is=="string"?e=o.createElement(n,{is:r.is}):(e=o.createElement(n),n==="select"&&(o=e,r.multiple?o.multiple=!0:r.size&&(o.size=r.size))):e=o.createElementNS(e,n),e[Ae]=t,e[bn]=r,Nc(e,t,!1,!1),t.stateNode=e;e:{switch(o=Ci(n,r),n){case"dialog":F("cancel",e),F("close",e),l=r;break;case"iframe":case"object":case"embed":F("load",e),l=r;break;case"video":case"audio":for(l=0;ldn&&(t.flags|=128,r=!0,_n(i,!1),t.lanes=4194304)}else{if(!r)if(e=ul(o),e!==null){if(t.flags|=128,r=!0,n=e.updateQueue,n!==null&&(t.updateQueue=n,t.flags|=4),_n(i,!0),i.tail===null&&i.tailMode==="hidden"&&!o.alternate&&!A)return ie(t),null}else 2*Y()-i.renderingStartTime>dn&&n!==1073741824&&(t.flags|=128,r=!0,_n(i,!1),t.lanes=4194304);i.isBackwards?(o.sibling=t.child,t.child=o):(n=i.last,n!==null?n.sibling=o:t.child=o,i.last=o)}return i.tail!==null?(t=i.tail,i.rendering=t,i.tail=t.sibling,i.renderingStartTime=Y(),t.sibling=null,n=B.current,U(B,r?n&1|2:n&1),t):(ie(t),null);case 22:case 23:return Jo(),r=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==r&&(t.flags|=8192),r&&t.mode&1?ge&1073741824&&(ie(t),t.subtreeFlags&6&&(t.flags|=8192)):ie(t),null;case 24:return null;case 25:return null}throw Error(k(156,t.tag))}function ip(e,t){switch(Ro(t),t.tag){case 1:return he(t.type)&&tl(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return sn(),j(me),j(ae),Ao(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 5:return jo(t),null;case 13:if(j(B),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(k(340));an()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return j(B),null;case 4:return sn(),null;case 10:return Io(t.type._context),null;case 22:case 23:return Jo(),null;case 24:return null;default:return null}}var Lr=!1,oe=!1,op=typeof WeakSet=="function"?WeakSet:Set,N=null;function Jt(e,t){var n=e.ref;if(n!==null)if(typeof n=="function")try{n(null)}catch(r){W(e,t,r)}else n.current=null}function Ji(e,t,n){try{n()}catch(r){W(e,t,r)}}var uu=!1;function ap(e,t){if(Oi=Zr,e=Rs(),_o(e)){if("selectionStart"in e)var n={start:e.selectionStart,end:e.selectionEnd};else e:{n=(n=e.ownerDocument)&&n.defaultView||window;var r=n.getSelection&&n.getSelection();if(r&&r.rangeCount!==0){n=r.anchorNode;var l=r.anchorOffset,i=r.focusNode;r=r.focusOffset;try{n.nodeType,i.nodeType}catch{n=null;break e}var o=0,a=-1,u=-1,c=0,h=0,p=e,m=null;t:for(;;){for(var g;p!==n||l!==0&&p.nodeType!==3||(a=o+l),p!==i||r!==0&&p.nodeType!==3||(u=o+r),p.nodeType===3&&(o+=p.nodeValue.length),(g=p.firstChild)!==null;)m=p,p=g;for(;;){if(p===e)break t;if(m===n&&++c===l&&(a=o),m===i&&++h===r&&(u=o),(g=p.nextSibling)!==null)break;p=m,m=p.parentNode}p=g}n=a===-1||u===-1?null:{start:a,end:u}}else n=null}n=n||{start:0,end:0}}else n=null;for(Ii={focusedElem:e,selectionRange:n},Zr=!1,N=t;N!==null;)if(t=N,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,N=e;else for(;N!==null;){t=N;try{var y=t.alternate;if(t.flags&1024)switch(t.tag){case 0:case 11:case 15:break;case 1:if(y!==null){var E=y.memoizedProps,x=y.memoizedState,f=t.stateNode,d=f.getSnapshotBeforeUpdate(t.elementType===t.type?E:Te(t.type,E),x);f.__reactInternalSnapshotBeforeUpdate=d}break;case 3:var v=t.stateNode.containerInfo;v.nodeType===1?v.textContent="":v.nodeType===9&&v.documentElement&&v.removeChild(v.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(k(163))}}catch(w){W(t,t.return,w)}if(e=t.sibling,e!==null){e.return=t.return,N=e;break}N=t.return}return y=uu,uu=!1,y}function Bn(e,t,n){var r=t.updateQueue;if(r=r!==null?r.lastEffect:null,r!==null){var l=r=r.next;do{if((l.tag&e)===e){var i=l.destroy;l.destroy=void 0,i!==void 0&&Ji(t,n,i)}l=l.next}while(l!==r)}}function zl(e,t){if(t=t.updateQueue,t=t!==null?t.lastEffect:null,t!==null){var n=t=t.next;do{if((n.tag&e)===e){var r=n.create;n.destroy=r()}n=n.next}while(n!==t)}}function Zi(e){var t=e.ref;if(t!==null){var n=e.stateNode;switch(e.tag){case 5:e=n;break;default:e=n}typeof t=="function"?t(e):t.current=e}}function zc(e){var t=e.alternate;t!==null&&(e.alternate=null,zc(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[Ae],delete t[bn],delete t[Fi],delete t[Hf],delete t[Wf])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function _c(e){return e.tag===5||e.tag===3||e.tag===4}function su(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||_c(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function qi(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.nodeType===8?n.parentNode.insertBefore(e,t):n.insertBefore(e,t):(n.nodeType===8?(t=n.parentNode,t.insertBefore(e,n)):(t=n,t.appendChild(e)),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=el));else if(r!==4&&(e=e.child,e!==null))for(qi(e,t,n),e=e.sibling;e!==null;)qi(e,t,n),e=e.sibling}function bi(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(r!==4&&(e=e.child,e!==null))for(bi(e,t,n),e=e.sibling;e!==null;)bi(e,t,n),e=e.sibling}var te=null,Me=!1;function be(e,t,n){for(n=n.child;n!==null;)Lc(e,t,n),n=n.sibling}function Lc(e,t,n){if(Be&&typeof Be.onCommitFiberUnmount=="function")try{Be.onCommitFiberUnmount(El,n)}catch{}switch(n.tag){case 5:oe||Jt(n,t);case 6:var r=te,l=Me;te=null,be(e,t,n),te=r,Me=l,te!==null&&(Me?(e=te,n=n.stateNode,e.nodeType===8?e.parentNode.removeChild(n):e.removeChild(n)):te.removeChild(n.stateNode));break;case 18:te!==null&&(Me?(e=te,n=n.stateNode,e.nodeType===8?ei(e.parentNode,n):e.nodeType===1&&ei(e,n),Gn(e)):ei(te,n.stateNode));break;case 4:r=te,l=Me,te=n.stateNode.containerInfo,Me=!0,be(e,t,n),te=r,Me=l;break;case 0:case 11:case 14:case 15:if(!oe&&(r=n.updateQueue,r!==null&&(r=r.lastEffect,r!==null))){l=r=r.next;do{var i=l,o=i.destroy;i=i.tag,o!==void 0&&(i&2||i&4)&&Ji(n,t,o),l=l.next}while(l!==r)}be(e,t,n);break;case 1:if(!oe&&(Jt(n,t),r=n.stateNode,typeof r.componentWillUnmount=="function"))try{r.props=n.memoizedProps,r.state=n.memoizedState,r.componentWillUnmount()}catch(a){W(n,t,a)}be(e,t,n);break;case 21:be(e,t,n);break;case 22:n.mode&1?(oe=(r=oe)||n.memoizedState!==null,be(e,t,n),oe=r):be(e,t,n);break;default:be(e,t,n)}}function cu(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var n=e.stateNode;n===null&&(n=e.stateNode=new op),t.forEach(function(r){var l=vp.bind(null,e,r);n.has(r)||(n.add(r),r.then(l,l))})}}function Re(e,t){var n=t.deletions;if(n!==null)for(var r=0;rl&&(l=o),r&=~i}if(r=l,r=Y()-r,r=(120>r?120:480>r?480:1080>r?1080:1920>r?1920:3e3>r?3e3:4320>r?4320:1960*sp(r/1960))-r,10e?16:e,it===null)var r=!1;else{if(e=it,it=null,pl=0,I&6)throw Error(k(331));var l=I;for(I|=4,N=e.current;N!==null;){var i=N,o=i.child;if(N.flags&16){var a=i.deletions;if(a!==null){for(var u=0;uY()-Go?Rt(e,0):Yo|=n),ve(e,t)}function Fc(e,t){t===0&&(e.mode&1?(t=wr,wr<<=1,!(wr&130023424)&&(wr=4194304)):t=1);var n=se();e=Je(e,t),e!==null&&(sr(e,t,n),ve(e,n))}function hp(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),Fc(e,n)}function vp(e,t){var n=0;switch(e.tag){case 13:var r=e.stateNode,l=e.memoizedState;l!==null&&(n=l.retryLane);break;case 19:r=e.stateNode;break;default:throw Error(k(314))}r!==null&&r.delete(t),Fc(e,n)}var jc;jc=function(e,t,n){if(e!==null)if(e.memoizedProps!==t.pendingProps||me.current)pe=!0;else{if(!(e.lanes&n)&&!(t.flags&128))return pe=!1,rp(e,t,n);pe=!!(e.flags&131072)}else pe=!1,A&&t.flags&1048576&&$s(t,ll,t.index);switch(t.lanes=0,t.tag){case 2:var r=t.type;$r(e,t),e=t.pendingProps;var l=on(t,ae.current);nn(t,n),l=$o(null,t,r,e,l,n);var i=Vo();return t.flags|=1,typeof l=="object"&&l!==null&&typeof l.render=="function"&&l.$$typeof===void 0?(t.tag=1,t.memoizedState=null,t.updateQueue=null,he(r)?(i=!0,nl(t)):i=!1,t.memoizedState=l.state!==null&&l.state!==void 0?l.state:null,Uo(t),l.updater=xl,t.stateNode=l,l._reactInternals=t,Hi(t,r,e,n),t=Ki(null,t,r,!0,i,n)):(t.tag=0,A&&i&&Lo(t),ue(null,t,l,n),t=t.child),t;case 16:r=t.elementType;e:{switch($r(e,t),e=t.pendingProps,l=r._init,r=l(r._payload),t.type=r,l=t.tag=yp(r),e=Te(r,e),l){case 0:t=Qi(null,t,r,e,n);break e;case 1:t=iu(null,t,r,e,n);break e;case 11:t=ru(null,t,r,e,n);break e;case 14:t=lu(null,t,r,Te(r.type,e),n);break e}throw Error(k(306,r,""))}return t;case 0:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:Te(r,l),Qi(e,t,r,l,n);case 1:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:Te(r,l),iu(e,t,r,l,n);case 3:e:{if(Sc(t),e===null)throw Error(k(387));r=t.pendingProps,i=t.memoizedState,l=i.element,Qs(e,t),al(t,r,null,n);var o=t.memoizedState;if(r=o.element,i.isDehydrated)if(i={element:r,isDehydrated:!1,cache:o.cache,pendingSuspenseBoundaries:o.pendingSuspenseBoundaries,transitions:o.transitions},t.updateQueue.baseState=i,t.memoizedState=i,t.flags&256){l=cn(Error(k(423)),t),t=ou(e,t,r,n,l);break e}else if(r!==l){l=cn(Error(k(424)),t),t=ou(e,t,r,n,l);break e}else for(ye=ct(t.stateNode.containerInfo.firstChild),Ee=t,A=!0,Oe=null,n=Xs(t,null,r,n),t.child=n;n;)n.flags=n.flags&-3|4096,n=n.sibling;else{if(an(),r===l){t=Ze(e,t,n);break e}ue(e,t,r,n)}t=t.child}return t;case 5:return Js(t),e===null&&Bi(t),r=t.type,l=t.pendingProps,i=e!==null?e.memoizedProps:null,o=l.children,Di(r,l)?o=null:i!==null&&Di(r,i)&&(t.flags|=32),wc(e,t),ue(e,t,o,n),t.child;case 6:return e===null&&Bi(t),null;case 13:return kc(e,t,n);case 4:return Fo(t,t.stateNode.containerInfo),r=t.pendingProps,e===null?t.child=un(t,null,r,n):ue(e,t,r,n),t.child;case 11:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:Te(r,l),ru(e,t,r,l,n);case 7:return ue(e,t,t.pendingProps,n),t.child;case 8:return ue(e,t,t.pendingProps.children,n),t.child;case 12:return ue(e,t,t.pendingProps.children,n),t.child;case 10:e:{if(r=t.type._context,l=t.pendingProps,i=t.memoizedProps,o=l.value,U(il,r._currentValue),r._currentValue=o,i!==null)if(Ue(i.value,o)){if(i.children===l.children&&!me.current){t=Ze(e,t,n);break e}}else for(i=t.child,i!==null&&(i.return=t);i!==null;){var a=i.dependencies;if(a!==null){o=i.child;for(var u=a.firstContext;u!==null;){if(u.context===r){if(i.tag===1){u=Ye(-1,n&-n),u.tag=2;var c=i.updateQueue;if(c!==null){c=c.shared;var h=c.pending;h===null?u.next=u:(u.next=h.next,h.next=u),c.pending=u}}i.lanes|=n,u=i.alternate,u!==null&&(u.lanes|=n),$i(i.return,n,t),a.lanes|=n;break}u=u.next}}else if(i.tag===10)o=i.type===t.type?null:i.child;else if(i.tag===18){if(o=i.return,o===null)throw Error(k(341));o.lanes|=n,a=o.alternate,a!==null&&(a.lanes|=n),$i(o,n,t),o=i.sibling}else o=i.child;if(o!==null)o.return=i;else for(o=i;o!==null;){if(o===t){o=null;break}if(i=o.sibling,i!==null){i.return=o.return,o=i;break}o=o.return}i=o}ue(e,t,l.children,n),t=t.child}return t;case 9:return l=t.type,r=t.pendingProps.children,nn(t,n),l=ze(l),r=r(l),t.flags|=1,ue(e,t,r,n),t.child;case 14:return r=t.type,l=Te(r,t.pendingProps),l=Te(r.type,l),lu(e,t,r,l,n);case 15:return yc(e,t,t.type,t.pendingProps,n);case 17:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:Te(r,l),$r(e,t),t.tag=1,he(r)?(e=!0,nl(t)):e=!1,nn(t,n),Ys(t,r,l),Hi(t,r,l,n),Ki(null,t,r,!0,e,n);case 19:return Cc(e,t,n);case 22:return Ec(e,t,n)}throw Error(k(156,t.tag))};function Ac(e,t){return ds(e,t)}function gp(e,t,n,r){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function xe(e,t,n,r){return new gp(e,t,n,r)}function qo(e){return e=e.prototype,!(!e||!e.isReactComponent)}function yp(e){if(typeof e=="function")return qo(e)?1:0;if(e!=null){if(e=e.$$typeof,e===go)return 11;if(e===yo)return 14}return 2}function mt(e,t){var n=e.alternate;return n===null?(n=xe(e.tag,t,e.key,e.mode),n.elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.subtreeFlags=0,n.deletions=null),n.flags=e.flags&14680064,n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function Wr(e,t,n,r,l,i){var o=2;if(r=e,typeof e=="function")qo(e)&&(o=1);else if(typeof e=="string")o=5;else e:switch(e){case $t:return Tt(n.children,l,i,t);case vo:o=8,l|=8;break;case pi:return e=xe(12,n,t,l|2),e.elementType=pi,e.lanes=i,e;case mi:return e=xe(13,n,t,l),e.elementType=mi,e.lanes=i,e;case hi:return e=xe(19,n,t,l),e.elementType=hi,e.lanes=i,e;case Gu:return Ll(n,l,i,t);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case Ku:o=10;break e;case Yu:o=9;break e;case go:o=11;break e;case yo:o=14;break e;case et:o=16,r=null;break e}throw Error(k(130,e==null?e:typeof e,""))}return t=xe(o,n,t,l),t.elementType=e,t.type=r,t.lanes=i,t}function Tt(e,t,n,r){return e=xe(7,e,r,t),e.lanes=n,e}function Ll(e,t,n,r){return e=xe(22,e,r,t),e.elementType=Gu,e.lanes=n,e.stateNode={isHidden:!1},e}function ui(e,t,n){return e=xe(6,e,null,t),e.lanes=n,e}function si(e,t,n){return t=xe(4,e.children!==null?e.children:[],e.key,t),t.lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function Ep(e,t,n,r,l){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=Hl(0),this.expirationTimes=Hl(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=Hl(0),this.identifierPrefix=r,this.onRecoverableError=l,this.mutableSourceEagerHydrationData=null}function bo(e,t,n,r,l,i,o,a,u){return e=new Ep(e,t,n,a,u),t===1?(t=1,i===!0&&(t|=8)):t=0,i=xe(3,null,null,t),e.current=i,i.stateNode=e,i.memoizedState={element:r,isDehydrated:n,cache:null,transitions:null,pendingSuspenseBoundaries:null},Uo(i),e}function wp(e,t,n){var r=3"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(Hc)}catch(e){console.error(e)}}Hc(),$u.exports=Se;var xp=$u.exports,Wc,yu=xp;Wc=yu.createRoot,yu.hydrateRoot;/** + * @remix-run/router v1.7.2 + * + * Copyright (c) Remix Software Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE.md file in the root directory of this source tree. + * + * @license MIT + */function or(){return or=Object.assign?Object.assign.bind():function(e){for(var t=1;t"u")throw new Error(t)}function ra(e,t){if(!e){typeof console<"u"&&console.warn(t);try{throw new Error(t)}catch{}}}function zp(){return Math.random().toString(36).substr(2,8)}function wu(e,t){return{usr:e.state,key:e.key,idx:t}}function lo(e,t,n,r){return n===void 0&&(n=null),or({pathname:typeof e=="string"?e:e.pathname,search:"",hash:""},typeof t=="string"?hn(t):t,{state:n,key:t&&t.key||r||zp()})}function vl(e){let{pathname:t="/",search:n="",hash:r=""}=e;return n&&n!=="?"&&(t+=n.charAt(0)==="?"?n:"?"+n),r&&r!=="#"&&(t+=r.charAt(0)==="#"?r:"#"+r),t}function hn(e){let t={};if(e){let n=e.indexOf("#");n>=0&&(t.hash=e.substr(n),e=e.substr(0,n));let r=e.indexOf("?");r>=0&&(t.search=e.substr(r),e=e.substr(0,r)),e&&(t.pathname=e)}return t}function _p(e,t,n,r){r===void 0&&(r={});let{window:l=document.defaultView,v5Compat:i=!1}=r,o=l.history,a=ot.Pop,u=null,c=h();c==null&&(c=0,o.replaceState(or({},o.state,{idx:c}),""));function h(){return(o.state||{idx:null}).idx}function p(){a=ot.Pop;let x=h(),f=x==null?null:x-c;c=x,u&&u({action:a,location:E.location,delta:f})}function m(x,f){a=ot.Push;let d=lo(E.location,x,f);n&&n(d,x),c=h()+1;let v=wu(d,c),w=E.createHref(d);try{o.pushState(v,"",w)}catch(C){if(C instanceof DOMException&&C.name==="DataCloneError")throw C;l.location.assign(w)}i&&u&&u({action:a,location:E.location,delta:1})}function g(x,f){a=ot.Replace;let d=lo(E.location,x,f);n&&n(d,x),c=h();let v=wu(d,c),w=E.createHref(d);o.replaceState(v,"",w),i&&u&&u({action:a,location:E.location,delta:0})}function y(x){let f=l.location.origin!=="null"?l.location.origin:l.location.href,d=typeof x=="string"?x:vl(x);return G(f,"No window.location.(origin|href) available to create URL for href: "+d),new URL(d,f)}let E={get action(){return a},get location(){return e(l,o)},listen(x){if(u)throw new Error("A history only accepts one active listener");return l.addEventListener(Eu,p),u=x,()=>{l.removeEventListener(Eu,p),u=null}},createHref(x){return t(l,x)},createURL:y,encodeLocation(x){let f=y(x);return{pathname:f.pathname,search:f.search,hash:f.hash}},push:m,replace:g,go(x){return o.go(x)}};return E}var Su;(function(e){e.data="data",e.deferred="deferred",e.redirect="redirect",e.error="error"})(Su||(Su={}));function Lp(e,t,n){n===void 0&&(n="/");let r=typeof t=="string"?hn(t):t,l=la(r.pathname||"/",n);if(l==null)return null;let i=Qc(e);Rp(i);let o=null;for(let a=0;o==null&&a{let u={relativePath:a===void 0?i.path||"":a,caseSensitive:i.caseSensitive===!0,childrenIndex:o,route:i};u.relativePath.startsWith("/")&&(G(u.relativePath.startsWith(r),'Absolute route path "'+u.relativePath+'" nested under path '+('"'+r+'" is not valid. An absolute child route path ')+"must start with the combined path of all its parent routes."),u.relativePath=u.relativePath.slice(r.length));let c=ht([r,u.relativePath]),h=n.concat(u);i.children&&i.children.length>0&&(G(i.index!==!0,"Index routes must not have child routes. Please remove "+('all child routes from route path "'+c+'".')),Qc(i.children,t,h,c)),!(i.path==null&&!i.index)&&t.push({path:c,score:Fp(c,i.index),routesMeta:h})};return e.forEach((i,o)=>{var a;if(i.path===""||!((a=i.path)!=null&&a.includes("?")))l(i,o);else for(let u of Kc(i.path))l(i,o,u)}),t}function Kc(e){let t=e.split("/");if(t.length===0)return[];let[n,...r]=t,l=n.endsWith("?"),i=n.replace(/\?$/,"");if(r.length===0)return l?[i,""]:[i];let o=Kc(r.join("/")),a=[];return a.push(...o.map(u=>u===""?i:[i,u].join("/"))),l&&a.push(...o),a.map(u=>e.startsWith("/")&&u===""?"/":u)}function Rp(e){e.sort((t,n)=>t.score!==n.score?n.score-t.score:jp(t.routesMeta.map(r=>r.childrenIndex),n.routesMeta.map(r=>r.childrenIndex)))}const Tp=/^:\w+$/,Mp=3,Op=2,Ip=1,Dp=10,Up=-2,ku=e=>e==="*";function Fp(e,t){let n=e.split("/"),r=n.length;return n.some(ku)&&(r+=Up),t&&(r+=Op),n.filter(l=>!ku(l)).reduce((l,i)=>l+(Tp.test(i)?Mp:i===""?Ip:Dp),r)}function jp(e,t){return e.length===t.length&&e.slice(0,-1).every((r,l)=>r===t[l])?e[e.length-1]-t[t.length-1]:0}function Ap(e,t){let{routesMeta:n}=e,r={},l="/",i=[];for(let o=0;o{if(h==="*"){let m=a[p]||"";o=i.slice(0,i.length-m.length).replace(/(.)\/+$/,"$1")}return c[h]=Hp(a[p]||"",h),c},{}),pathname:i,pathnameBase:o,pattern:e}}function $p(e,t,n){t===void 0&&(t=!1),n===void 0&&(n=!0),ra(e==="*"||!e.endsWith("*")||e.endsWith("/*"),'Route path "'+e+'" will be treated as if it were '+('"'+e.replace(/\*$/,"/*")+'" because the `*` character must ')+"always follow a `/` in the pattern. To get rid of this warning, "+('please change the route path to "'+e.replace(/\*$/,"/*")+'".'));let r=[],l="^"+e.replace(/\/*\*?$/,"").replace(/^\/*/,"/").replace(/[\\.*+^$?{}|()[\]]/g,"\\$&").replace(/\/:(\w+)/g,(o,a)=>(r.push(a),"/([^\\/]+)"));return e.endsWith("*")?(r.push("*"),l+=e==="*"||e==="/*"?"(.*)$":"(?:\\/(.+)|\\/*)$"):n?l+="\\/*$":e!==""&&e!=="/"&&(l+="(?:(?=\\/|$))"),[new RegExp(l,t?void 0:"i"),r]}function Vp(e){try{return decodeURI(e)}catch(t){return ra(!1,'The URL path "'+e+'" could not be decoded because it is is a malformed URL segment. This is probably due to a bad percent '+("encoding ("+t+").")),e}}function Hp(e,t){try{return decodeURIComponent(e)}catch(n){return ra(!1,'The value for the URL param "'+t+'" will not be decoded because'+(' the string "'+e+'" is a malformed URL segment. This is probably')+(" due to a bad percent encoding ("+n+").")),e}}function la(e,t){if(t==="/")return e;if(!e.toLowerCase().startsWith(t.toLowerCase()))return null;let n=t.endsWith("/")?t.length-1:t.length,r=e.charAt(n);return r&&r!=="/"?null:e.slice(n)||"/"}function Wp(e,t){t===void 0&&(t="/");let{pathname:n,search:r="",hash:l=""}=typeof e=="string"?hn(e):e;return{pathname:n?n.startsWith("/")?n:Qp(n,t):t,search:Yp(r),hash:Gp(l)}}function Qp(e,t){let n=t.replace(/\/+$/,"").split("/");return e.split("/").forEach(l=>{l===".."?n.length>1&&n.pop():l!=="."&&n.push(l)}),n.length>1?n.join("/"):"/"}function ci(e,t,n,r){return"Cannot include a '"+e+"' character in a manually specified "+("`to."+t+"` field ["+JSON.stringify(r)+"]. Please separate it out to the ")+("`to."+n+"` field. Alternatively you may provide the full path as ")+'a string in and the router will parse it for you.'}function ia(e){return e.filter((t,n)=>n===0||t.route.path&&t.route.path.length>0)}function oa(e,t,n,r){r===void 0&&(r=!1);let l;typeof e=="string"?l=hn(e):(l=or({},e),G(!l.pathname||!l.pathname.includes("?"),ci("?","pathname","search",l)),G(!l.pathname||!l.pathname.includes("#"),ci("#","pathname","hash",l)),G(!l.search||!l.search.includes("#"),ci("#","search","hash",l)));let i=e===""||l.pathname==="",o=i?"/":l.pathname,a;if(r||o==null)a=n;else{let p=t.length-1;if(o.startsWith("..")){let m=o.split("/");for(;m[0]==="..";)m.shift(),p-=1;l.pathname=m.join("/")}a=p>=0?t[p]:"/"}let u=Wp(l,a),c=o&&o!=="/"&&o.endsWith("/"),h=(i||o===".")&&n.endsWith("/");return!u.pathname.endsWith("/")&&(c||h)&&(u.pathname+="/"),u}const ht=e=>e.join("/").replace(/\/\/+/g,"/"),Kp=e=>e.replace(/\/+$/,"").replace(/^\/*/,"/"),Yp=e=>!e||e==="?"?"":e.startsWith("?")?e:"?"+e,Gp=e=>!e||e==="#"?"":e.startsWith("#")?e:"#"+e;function Xp(e){return e!=null&&typeof e.status=="number"&&typeof e.statusText=="string"&&typeof e.internal=="boolean"&&"data"in e}const Yc=["post","put","patch","delete"];new Set(Yc);const Jp=["get",...Yc];new Set(Jp);/** + * React Router v6.14.2 + * + * Copyright (c) Remix Software Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE.md file in the root directory of this source tree. + * + * @license MIT + */function gl(){return gl=Object.assign?Object.assign.bind():function(e){for(var t=1;tu.pathnameBase)),o=S.useRef(!1);return Xc(()=>{o.current=!0}),S.useCallback(function(u,c){if(c===void 0&&(c={}),!o.current)return;if(typeof u=="number"){n.go(u);return}let h=oa(u,JSON.parse(i),l,c.relative==="path");e==null&&t!=="/"&&(h.pathname=h.pathname==="/"?t:ht([t,h.pathname])),(c.replace?n.replace:n.push)(h,c.state,c)},[t,n,i,l,e])}function Jc(e,t){let{relative:n}=t===void 0?{}:t,{matches:r}=S.useContext(kt),{pathname:l}=yn(),i=JSON.stringify(ia(r).map(o=>o.pathnameBase));return S.useMemo(()=>oa(e,JSON.parse(i),l,n==="path"),[e,i,l,n])}function em(e,t){return tm(e,t)}function tm(e,t,n){gn()||G(!1);let{navigator:r}=S.useContext(vn),{matches:l}=S.useContext(kt),i=l[l.length-1],o=i?i.params:{};i&&i.pathname;let a=i?i.pathnameBase:"/";i&&i.route;let u=yn(),c;if(t){var h;let E=typeof t=="string"?hn(t):t;a==="/"||(h=E.pathname)!=null&&h.startsWith(a)||G(!1),c=E}else c=u;let p=c.pathname||"/",m=a==="/"?p:p.slice(a.length)||"/",g=Lp(e,{pathname:m}),y=om(g&&g.map(E=>Object.assign({},E,{params:Object.assign({},o,E.params),pathname:ht([a,r.encodeLocation?r.encodeLocation(E.pathname).pathname:E.pathname]),pathnameBase:E.pathnameBase==="/"?a:ht([a,r.encodeLocation?r.encodeLocation(E.pathnameBase).pathname:E.pathnameBase])})),l,n);return t&&y?S.createElement(Il.Provider,{value:{location:gl({pathname:"/",search:"",hash:"",state:null,key:"default"},c),navigationType:ot.Pop}},y):y}function nm(){let e=cm(),t=Xp(e)?e.status+" "+e.statusText:e instanceof Error?e.message:JSON.stringify(e),n=e instanceof Error?e.stack:null,l={padding:"0.5rem",backgroundColor:"rgba(200,200,200, 0.5)"},i=null;return S.createElement(S.Fragment,null,S.createElement("h2",null,"Unexpected Application Error!"),S.createElement("h3",{style:{fontStyle:"italic"}},t),n?S.createElement("pre",{style:l},n):null,i)}const rm=S.createElement(nm,null);class lm extends S.Component{constructor(t){super(t),this.state={location:t.location,revalidation:t.revalidation,error:t.error}}static getDerivedStateFromError(t){return{error:t}}static getDerivedStateFromProps(t,n){return n.location!==t.location||n.revalidation!=="idle"&&t.revalidation==="idle"?{error:t.error,location:t.location,revalidation:t.revalidation}:{error:t.error||n.error,location:n.location,revalidation:t.revalidation||n.revalidation}}componentDidCatch(t,n){console.error("React Router caught the following error during render",t,n)}render(){return this.state.error?S.createElement(kt.Provider,{value:this.props.routeContext},S.createElement(Gc.Provider,{value:this.state.error,children:this.props.component})):this.props.children}}function im(e){let{routeContext:t,match:n,children:r}=e,l=S.useContext(aa);return l&&l.static&&l.staticContext&&(n.route.errorElement||n.route.ErrorBoundary)&&(l.staticContext._deepestRenderedBoundaryId=n.route.id),S.createElement(kt.Provider,{value:t},r)}function om(e,t,n){var r;if(t===void 0&&(t=[]),n===void 0&&(n=null),e==null){var l;if((l=n)!=null&&l.errors)e=n.matches;else return null}let i=e,o=(r=n)==null?void 0:r.errors;if(o!=null){let a=i.findIndex(u=>u.route.id&&(o==null?void 0:o[u.route.id]));a>=0||G(!1),i=i.slice(0,Math.min(i.length,a+1))}return i.reduceRight((a,u,c)=>{let h=u.route.id?o==null?void 0:o[u.route.id]:null,p=null;n&&(p=u.route.errorElement||rm);let m=t.concat(i.slice(0,c+1)),g=()=>{let y;return h?y=p:u.route.Component?y=S.createElement(u.route.Component,null):u.route.element?y=u.route.element:y=a,S.createElement(im,{match:u,routeContext:{outlet:a,matches:m,isDataRoute:n!=null},children:y})};return n&&(u.route.ErrorBoundary||u.route.errorElement||c===0)?S.createElement(lm,{location:n.location,revalidation:n.revalidation,component:p,error:h,children:g(),routeContext:{outlet:null,matches:m,isDataRoute:!0}}):g()},null)}var io;(function(e){e.UseBlocker="useBlocker",e.UseRevalidator="useRevalidator",e.UseNavigateStable="useNavigate"})(io||(io={}));var ar;(function(e){e.UseBlocker="useBlocker",e.UseLoaderData="useLoaderData",e.UseActionData="useActionData",e.UseRouteError="useRouteError",e.UseNavigation="useNavigation",e.UseRouteLoaderData="useRouteLoaderData",e.UseMatches="useMatches",e.UseRevalidator="useRevalidator",e.UseNavigateStable="useNavigate",e.UseRouteId="useRouteId"})(ar||(ar={}));function am(e){let t=S.useContext(aa);return t||G(!1),t}function um(e){let t=S.useContext(Zp);return t||G(!1),t}function sm(e){let t=S.useContext(kt);return t||G(!1),t}function Zc(e){let t=sm(),n=t.matches[t.matches.length-1];return n.route.id||G(!1),n.route.id}function cm(){var e;let t=S.useContext(Gc),n=um(ar.UseRouteError),r=Zc(ar.UseRouteError);return t||((e=n.errors)==null?void 0:e[r])}function dm(){let{router:e}=am(io.UseNavigateStable),t=Zc(ar.UseNavigateStable),n=S.useRef(!1);return Xc(()=>{n.current=!0}),S.useCallback(function(l,i){i===void 0&&(i={}),n.current&&(typeof l=="number"?e.navigate(l):e.navigate(l,gl({fromRouteId:t},i)))},[e,t])}function fm(e){let{to:t,replace:n,state:r,relative:l}=e;gn()||G(!1);let{matches:i}=S.useContext(kt),{pathname:o}=yn(),a=En(),u=oa(t,ia(i).map(h=>h.pathnameBase),o,l==="path"),c=JSON.stringify(u);return S.useEffect(()=>a(JSON.parse(c),{replace:n,state:r,relative:l}),[a,c,l,n,r]),null}function Ve(e){G(!1)}function pm(e){let{basename:t="/",children:n=null,location:r,navigationType:l=ot.Pop,navigator:i,static:o=!1}=e;gn()&&G(!1);let a=t.replace(/^\/*/,"/"),u=S.useMemo(()=>({basename:a,navigator:i,static:o}),[a,i,o]);typeof r=="string"&&(r=hn(r));let{pathname:c="/",search:h="",hash:p="",state:m=null,key:g="default"}=r,y=S.useMemo(()=>{let E=la(c,a);return E==null?null:{location:{pathname:E,search:h,hash:p,state:m,key:g},navigationType:l}},[a,c,h,p,m,g,l]);return y==null?null:S.createElement(vn.Provider,{value:u},S.createElement(Il.Provider,{children:n,value:y}))}function mm(e){let{children:t,location:n}=e;return em(oo(t),n)}var Cu;(function(e){e[e.pending=0]="pending",e[e.success=1]="success",e[e.error=2]="error"})(Cu||(Cu={}));new Promise(()=>{});function oo(e,t){t===void 0&&(t=[]);let n=[];return S.Children.forEach(e,(r,l)=>{if(!S.isValidElement(r))return;let i=[...t,l];if(r.type===S.Fragment){n.push.apply(n,oo(r.props.children,i));return}r.type!==Ve&&G(!1),!r.props.index||!r.props.children||G(!1);let o={id:r.props.id||i.join("-"),caseSensitive:r.props.caseSensitive,element:r.props.element,Component:r.props.Component,index:r.props.index,path:r.props.path,loader:r.props.loader,action:r.props.action,errorElement:r.props.errorElement,ErrorBoundary:r.props.ErrorBoundary,hasErrorBoundary:r.props.ErrorBoundary!=null||r.props.errorElement!=null,shouldRevalidate:r.props.shouldRevalidate,handle:r.props.handle,lazy:r.props.lazy};r.props.children&&(o.children=oo(r.props.children,i)),n.push(o)}),n}/** + * React Router DOM v6.14.2 + * + * Copyright (c) Remix Software Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE.md file in the root directory of this source tree. + * + * @license MIT + */function ao(){return ao=Object.assign?Object.assign.bind():function(e){for(var t=1;t=0)&&(n[l]=e[l]);return n}function vm(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}function gm(e,t){return e.button===0&&(!t||t==="_self")&&!vm(e)}const ym=["onClick","relative","reloadDocument","replace","state","target","to","preventScrollReset"],Em="startTransition",Nu=wd[Em];function wm(e){let{basename:t,children:n,future:r,window:l}=e,i=S.useRef();i.current==null&&(i.current=Pp({window:l,v5Compat:!0}));let o=i.current,[a,u]=S.useState({action:o.action,location:o.location}),{v7_startTransition:c}=r||{},h=S.useCallback(p=>{c&&Nu?Nu(()=>u(p)):u(p)},[u,c]);return S.useLayoutEffect(()=>o.listen(h),[o,h]),S.createElement(pm,{basename:t,children:n,location:a.location,navigationType:a.action,navigator:o})}const Sm=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u",km=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,Mr=S.forwardRef(function(t,n){let{onClick:r,relative:l,reloadDocument:i,replace:o,state:a,target:u,to:c,preventScrollReset:h}=t,p=hm(t,ym),{basename:m}=S.useContext(vn),g,y=!1;if(typeof c=="string"&&km.test(c)&&(g=c,Sm))try{let d=new URL(window.location.href),v=c.startsWith("//")?new URL(d.protocol+c):new URL(c),w=la(v.pathname,m);v.origin===d.origin&&w!=null?c=w+v.search+v.hash:y=!0}catch{}let E=qp(c,{relative:l}),x=Cm(c,{replace:o,state:a,target:u,preventScrollReset:h,relative:l});function f(d){r&&r(d),d.defaultPrevented||x(d)}return S.createElement("a",ao({},p,{href:g||E,onClick:y||i?r:f,ref:n,target:u}))});var xu;(function(e){e.UseScrollRestoration="useScrollRestoration",e.UseSubmit="useSubmit",e.UseSubmitFetcher="useSubmitFetcher",e.UseFetcher="useFetcher"})(xu||(xu={}));var Pu;(function(e){e.UseFetchers="useFetchers",e.UseScrollRestoration="useScrollRestoration"})(Pu||(Pu={}));function Cm(e,t){let{target:n,replace:r,state:l,preventScrollReset:i,relative:o}=t===void 0?{}:t,a=En(),u=yn(),c=Jc(e,{relative:o});return S.useCallback(h=>{if(gm(h,n)){h.preventDefault();let p=r!==void 0?r:vl(u)===vl(c);a(e,{replace:p,state:l,preventScrollReset:i,relative:o})}},[u,a,c,r,l,n,e,i,o])}var qc={color:void 0,size:void 0,className:void 0,style:void 0,attr:void 0},zu=s.createContext&&s.createContext(qc),vt=globalThis&&globalThis.__assign||function(){return vt=Object.assign||function(e){for(var t,n=1,r=arguments.length;n()=>{l.current&&clearTimeout(l.current)},[]);const i=En(),o=()=>{r(!0),t("Alert Sent! Officer Notified"),l.current=setTimeout(()=>t("Officer En Route (ETA: 2 min)"),2e3),l.current=setTimeout(()=>{t("Help Arrived"),r(!1)},6e3)};return s.createElement("div",{className:"safe-area"},s.createElement("header",{className:"header-row"},s.createElement("div",{style:{display:"flex",alignItems:"center"}},s.createElement("img",{src:"/assets/icon.png",alt:"icon",style:{width:32,height:32,marginRight:8},onError:a=>{a.target.onerror=null,a.target.style.display="none"}}),s.createElement(yl,{size:28,color:"#E53935",style:{marginRight:8}}),s.createElement("div",{className:"header-title"},"AI Police Alert")),s.createElement("button",{className:"header-icon"},s.createElement(ua,{size:18,color:"#222"}))),s.createElement("div",{className:`status-bar ${n?"panic":""}`},s.createElement("div",{style:{marginRight:8}},n?s.createElement(Qr,{size:18,color:"#E53935"}):s.createElement(Qr,{size:18,color:"#3ecf4a"})),s.createElement("div",{className:`status-text ${n?"panic":""}`},e)),s.createElement("div",{className:"sos-container"},s.createElement("button",{className:`sos-button ${n?"active":""}`,onClick:o,disabled:n},s.createElement(Qr,{size:56,color:n?"#E53935":"#fff"}),s.createElement("div",{className:`sos-text ${n?"active":""}`},"PANIC")),s.createElement("div",{className:"sos-subtext"},n?"Alert in progress...":"Tap to send instant police alert.")),s.createElement("div",{className:"quick-actions-section"},s.createElement("div",{className:"quick-actions-title"},"Quick Actions"),s.createElement("div",{className:"quick-actions-grid"},s.createElement("div",{className:"quick-action-box",role:"button",tabIndex:0,onClick:()=>i("/chat"),onKeyDown:a=>{a.key==="Enter"&&i("/chat")},"aria-label":"Open AI Chat Assistant"},s.createElement(ed,{size:28,color:"#E53935"}),s.createElement("div",{className:"quick-action-label"},"AI Chat Assistant")),s.createElement("div",{className:"quick-action-box",role:"button",tabIndex:0,onClick:()=>i("/location"),onKeyDown:a=>{a.key==="Enter"&&i("/location")},"aria-label":"Open Live GPS Map"},s.createElement(td,{size:28,color:"#E53935"}),s.createElement("div",{className:"quick-action-label"},"Live GPS Map"))),s.createElement("div",{className:"quick-actions-grid"},s.createElement("div",{className:"quick-action-box",role:"button",tabIndex:0,onClick:()=>i("/alerts"),onKeyDown:a=>{a.key==="Enter"&&i("/alerts")},"aria-label":"View Recent Alerts"},s.createElement(Rm,{size:28,color:"#E53935"}),s.createElement("div",{className:"quick-action-label"},"Recent Alerts")),s.createElement("div",{className:"quick-action-box",role:"button",tabIndex:0,onClick:()=>i("/alerts"),onKeyDown:a=>{a.key==="Enter"&&i("/alerts")},"aria-label":"Safety and Research"},s.createElement(yl,{size:26,color:"#E53935"}),s.createElement("div",{className:"quick-action-label"},"Safety & Research")))))}function Um(e){return H({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M504 256C504 119 393 8 256 8S8 119 8 256c0 123.78 90.69 226.38 209.25 245V327.69h-63V256h63v-54.64c0-62.15 37-96.48 93.67-96.48 27.14 0 55.52 4.84 55.52 4.84v61h-31.28c-30.8 0-40.41 19.12-40.41 38.73V256h68.78l-11 71.69h-57.78V501C413.31 482.38 504 379.78 504 256z"}}]})(e)}function Fm(e){return H({tag:"svg",attr:{viewBox:"0 0 488 512"},child:[{tag:"path",attr:{d:"M488 261.8C488 403.3 391.1 504 248 504 110.8 504 0 393.2 0 256S110.8 8 248 8c66.8 0 123 24.5 166.3 64.9l-67.5 64.9C258.5 52.6 94.3 116.6 94.3 256c0 86.5 69.1 156.6 153.7 156.6 98.2 0 135-70.4 140.8-106.9H248v-85.3h236.1c2.3 12.7 3.9 24.9 3.9 41.4z"}}]})(e)}function jm(e){return H({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M512 144v288c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V144c0-26.5 21.5-48 48-48h88l12.3-32.9c7-18.7 24.9-31.1 44.9-31.1h125.5c20 0 37.9 12.4 44.9 31.1L376 96h88c26.5 0 48 21.5 48 48zM376 288c0-66.2-53.8-120-120-120s-120 53.8-120 120 53.8 120 120 120 120-53.8 120-120zm-32 0c0 48.5-39.5 88-88 88s-88-39.5-88-88 39.5-88 88-88 88 39.5 88 88z"}}]})(e)}function Mu(e){return H({tag:"svg",attr:{viewBox:"0 0 576 512"},child:[{tag:"path",attr:{d:"M336.2 64H47.8C21.4 64 0 85.4 0 111.8v288.4C0 426.6 21.4 448 47.8 448h288.4c26.4 0 47.8-21.4 47.8-47.8V111.8c0-26.4-21.4-47.8-47.8-47.8zm189.4 37.7L416 177.3v157.4l109.6 75.5c21.2 14.6 50.4-.3 50.4-25.8V127.5c0-25.4-29.1-40.4-50.4-25.8z"}}]})(e)}function Am(){const[e,t]=S.useState(!1),n=En(),[r,l]=S.useState(""),[i,o]=S.useState(""),[a,u]=S.useState(null),[c,h]=S.useState(!1),p=async m=>{if(m&&typeof m.preventDefault=="function"&&m.preventDefault(),u(null),!r||!i){u("Enter username/email and password");return}const g=typeof import.meta<"u"&&{BASE_URL:"/",MODE:"production",DEV:!1,PROD:!0,SSR:!1}&&{}.VITE_API_URL||typeof process<"u"&&process.env&&{}.REACT_APP_API_URL||"http://localhost:4000";h(!0);try{const y=String(g).replace(/\/$/,""),E=await fetch(y+"/api/login",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:r,password:i})}),x=await E.json();if(!E.ok){u(x.message||"Login failed"),h(!1);return}localStorage.setItem("authUser",JSON.stringify({token:x.token,...x.user})),n("/home",{replace:!0})}catch(y){u("API error: "+(y.message||y))}finally{h(!1)}};return s.createElement("div",{className:"login-screen auth-screen"},s.createElement("div",{className:"header",style:{paddingTop:30,paddingBottom:20,textAlign:"center"}},s.createElement("div",{style:{fontSize:40,color:"red"}},s.createElement(yl,{size:26,color:"#E53935"})),s.createElement("div",{style:{fontSize:28,fontWeight:"700",color:"#300"}},"ShieldX"),s.createElement("div",{style:{fontSize:14,color:"#800",marginTop:4}},"Instant Police Alerts")),s.createElement("form",{style:{padding:10},onSubmit:p},a&&s.createElement("div",{style:{color:"red",marginBottom:8}},a),s.createElement("input",{name:"id",className:"input",placeholder:"Email or Username",value:r,onChange:m=>l(m.target.value)}),s.createElement("input",{name:"password",className:"input",placeholder:"Password",type:"password",value:i,onChange:m=>o(m.target.value)}),s.createElement("div",{className:"remember-row"},s.createElement("label",{style:{display:"flex",alignItems:"center",gap:8}},s.createElement("input",{type:"checkbox",checked:e,onChange:()=>t(!e)}),s.createElement("span",{style:{color:"#555"}},"Remember me")),s.createElement("button",{type:"button",className:"forgot"},"Forgot password?")),s.createElement("button",{className:"login-btn",type:"submit",disabled:c},c?"Logging in...":"Log In"),s.createElement("div",{className:"divider-row"},s.createElement("div",{className:"divider"}),s.createElement("div",{className:"or-text"},"Or continue with"),s.createElement("div",{className:"divider"})),s.createElement("div",{className:"social-row"},s.createElement("button",{type:"button",className:"social-btn"},s.createElement(Fm,{style:{marginRight:8}})," Google"),s.createElement("button",{type:"button",className:"social-btn"},s.createElement(Um,{style:{marginRight:8}})," Facebook")),s.createElement("div",{style:{textAlign:"center",marginTop:12}},s.createElement("button",{className:"link",type:"button",onClick:()=>n("/Signup")},"Don't have an account? ",s.createElement("span",{style:{color:"red"}},"Sign Up")))))}function Bm(){const[e,t]=S.useState(""),[n,r]=S.useState(""),[l,i]=S.useState(""),[o,a]=S.useState(null),[u,c]=S.useState(!1),h=En(),p=async m=>{if(m&&typeof m.preventDefault=="function"&&m.preventDefault(),a(null),!n||!l){a("Please enter email and password");return}const g=typeof import.meta<"u"&&{BASE_URL:"/",MODE:"production",DEV:!1,PROD:!0,SSR:!1}&&{}.VITE_API_URL||typeof process<"u"&&process.env&&{}.REACT_APP_API_URL||"http://localhost:4000";c(!0);try{const y=String(g).replace(/\/$/,""),E=await fetch(y+"/api/register",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:n,password:l,name:e})}),x=await E.json();if(!E.ok){a(x.message||"Signup failed"),c(!1);return}const f=await fetch(y+"/api/login",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:n,password:l})}),d=await f.json();if(!f.ok){a(d.message||"Auto-login failed"),c(!1),h("/login");return}localStorage.setItem("authUser",JSON.stringify({token:d.token,username:n,name:e||n&&n.split&&n.split("@")[0]})),h("/home",{replace:!0})}catch(y){a("API error: "+(y.message||y))}finally{c(!1)}};return s.createElement("div",{className:"signup-screen auth-screen"},s.createElement("button",{className:"back-btn",onClick:()=>window.history.back()},"←"),s.createElement("div",{style:{textAlign:"center"}},s.createElement("h2",{style:{margin:"12px 0"}},"Sign Up")),s.createElement("div",{style:{textAlign:"center",marginBottom:16}},s.createElement("div",{style:{display:"inline-block",background:"#ffe5e5",borderRadius:50,padding:20}},"ℹ️")),s.createElement("form",{style:{padding:10},onSubmit:p},o&&s.createElement("div",{style:{color:"red",marginBottom:8}},o),s.createElement("input",{name:"fullName",autoComplete:"name",className:"input",placeholder:"Full Name",value:e,onChange:m=>t(m.target.value)}),s.createElement("input",{name:"email",type:"email",autoComplete:"email",className:"input",placeholder:"Email",value:n,onChange:m=>r(m.target.value)}),s.createElement("input",{name:"password",type:"password",autoComplete:"new-password",className:"input",placeholder:"Password",value:l,onChange:m=>i(m.target.value)}),s.createElement("button",{className:"signup-btn",type:"submit",disabled:u},u?"Signing up...":"Sign Up"),s.createElement("div",{className:"dividerContainer"},s.createElement("div",{className:"line"}),s.createElement("div",{className:"orText"},"Or sign up with"),s.createElement("div",{className:"line"})),s.createElement("div",{className:"socialContainer"},s.createElement("button",{type:"button",className:"socialBtn"},"Google"),s.createElement("button",{type:"button",className:"socialBtn"},"Facebook")),s.createElement("div",{style:{textAlign:"center",marginTop:12}},s.createElement("button",{className:"link",type:"button",onClick:()=>h("/login")},"Already have an account? ",s.createElement("span",{style:{color:"red"}},"Sign In")))))}function $m({}){const[e,t]=S.useState([{id:"1",sender:"ai",text:"Hello, I'm your AI assistant. How can I help you today?"}]),[n,r]=S.useState(""),[l,i]=S.useState(!1),o=S.useRef(null);S.useEffect(()=>{a()},[]);const a=()=>{var c;(c=o.current)==null||c.scrollIntoView({behavior:"smooth"})},u=async()=>{if(!n.trim()||l)return;const c={id:Date.now().toString(),sender:"user",text:n};t(m=>[...m,c]),r(""),i(!0),setTimeout(a,100);let h="";const p=c.text.toLowerCase();/panic|sos|urgent|immediate|danger|attack|assault|robbery|theft|violence|shooting|gun|weapon/.test(p)?h="Emergency detected. Are you in immediate danger? Please confirm your safety and share your location.":/crime|report|help|emergency|police|officer|911/.test(p)?h="Please provide details about the incident, including your location, type of crime, and any injuries.":/location|where|address|gps|map/.test(p)?h="Can you share your current location or describe where the incident occurred? You can also use the Live GPS Map feature.":/injur|hurt|medical|ambulance|doctor/.test(p)?h="If anyone is injured, please describe the injuries and if medical help is needed. Emergency services can be dispatched.":/officer|response|eta|arrive|coming/.test(p)?h="An officer is being dispatched. You will receive live updates on their location and estimated arrival time.":/thank|thanks|grateful|appreciate/.test(p)?h="You are welcome. Stay safe! If you need further help, just type your question.":/cancel|mistake|false alarm/.test(p)?h="If this was a false alarm, please confirm so we can update the response team.":h="I'm here to assist you with emergencies, police alerts, and safety information. Please describe your situation or question.",setTimeout(()=>{t(m=>[...m,{id:Date.now().toString(),sender:"ai",text:h}]),i(!1),setTimeout(a,100)},1200)};return s.createElement("div",{className:"chat-screen"},s.createElement("header",{className:"chat-header"},s.createElement("button",{className:"back-btn",onClick:()=>window.history.back(),"aria-label":"back"},"←"),s.createElement("div",{className:"chat-title"},"AI Assistant"),s.createElement("div",{style:{width:40}})),s.createElement("div",{className:"avatar-row"},s.createElement("div",{className:"avatar-circle"},s.createElement("img",{src:"/assets/icon.png",alt:"avatar",style:{width:56,height:56,borderRadius:28},onError:c=>{c.target.onerror=null,c.target.style.display="none"}}),s.createElement(di,{size:36}),s.createElement("div",{className:"avatar-status"}))),s.createElement("div",{className:"chat-area"},e.map(c=>s.createElement("div",{key:c.id,className:`bubble-row ${c.sender==="user"?"user":"ai"}`},c.sender==="ai"&&s.createElement("div",{className:"bubble-avatar"},s.createElement(di,{size:20})),s.createElement("div",{className:c.sender==="ai"?"bubble-left":"bubble-right"},c.sender==="ai"&&s.createElement("div",{className:"bubble-sender"},"AI Assistant"),s.createElement("div",{className:c.sender==="ai"?"bubble-text":"bubble-text-user"},c.text)),c.sender==="user"&&s.createElement("div",{className:"bubble-avatar-user"},s.createElement(di,{size:20})))),l&&s.createElement("div",{className:"typing-indicator"},s.createElement("div",{className:"spinner"}),s.createElement("div",{className:"typing-text"},"AI is typing...")),s.createElement("div",{ref:o})),s.createElement("div",{className:"input-bar"},s.createElement("input",{className:"chat-input",placeholder:"Type a message...",value:n,onChange:c=>r(c.target.value),onKeyDown:c=>{c.key==="Enter"&&u()},disabled:l}),s.createElement("button",{className:"input-mic",disabled:!0},"🎤"),s.createElement("button",{className:"input-send",onClick:u,disabled:l||!n.trim()},s.createElement(Im,{color:"#fff",size:20}))))}const Vm=[{id:"1",name:"Police Station",address:"Sector 21, Main Road"},{id:"2",name:"Hospital",address:"City Hospital, Block B"},{id:"3",name:"Your Last Location",address:"Park Avenue, Sector 17"}],Hm=[{id:"1",name:"Police",phone:"100"},{id:"2",name:"Ambulance",phone:"102"},{id:"3",name:"Fire",phone:"101"}];function Wm(){const[e,t]=S.useState(""),[n,r]=S.useState("No active alert"),l=()=>{r("Officer dispatched (ETA: 2 min)"),window.alert(`Police Alert Sent +An officer is being dispatched to your location.`),setTimeout(()=>r("Officer en route (ETA: 1 min)"),2e3),setTimeout(()=>r("Officer arrived"),6e3)},i=()=>{window.open("https://maps.google.com","_blank")},o=a=>window.alert(`Call ${a}`);return s.createElement("div",{className:"location-screen"},s.createElement("header",{className:"header-row"},s.createElement("div",{className:"header-title"},"Location"),s.createElement("button",{className:"header-icon"},s.createElement(ua,{size:18,color:"#222"}))),s.createElement("div",{className:"search-bar"},s.createElement("input",{className:"search-input",placeholder:"Search places or address...",value:e,onChange:a=>t(a.target.value)})),s.createElement("div",{className:"map-view"},s.createElement("div",{style:{textAlign:"center"}},s.createElement(Lu,{size:64,color:"#E53935"}),s.createElement("div",{style:{color:"#888",fontSize:16,marginTop:8}},"Map placeholder for web. Use mobile app for live map features."))),s.createElement("div",{className:`status-bar ${n!=="No active alert"?"alert":""}`},s.createElement("div",{style:{marginRight:8}},"🛡️"),s.createElement("div",{className:"status-text"},n)),s.createElement("div",{className:"action-row"},s.createElement("button",{className:"action-btn",onClick:i},"Share Location"),s.createElement("button",{className:"action-btn",onClick:()=>window.open("https://www.google.com/maps","_blank")},"Directions"),s.createElement("button",{className:"action-btn alt",onClick:l},"Police Alert")),s.createElement("div",{className:"emergency-section"},s.createElement("div",{className:"list-title"},"Emergency Contacts"),s.createElement("div",{className:"emergency-row"},Hm.map(a=>s.createElement("button",{key:a.id,className:"emergency-btn",onClick:()=>o(a.phone)},s.createElement("div",{style:{fontSize:20,color:"#E53935"}},s.createElement(Mm,null)),s.createElement("div",{className:"emergency-btn-text"},a.name))))),s.createElement("div",{className:"list-section"},s.createElement("div",{className:"list-title"},"Nearby & Recent Locations"),Vm.map(a=>s.createElement("div",{key:a.id,className:"list-item"},s.createElement("div",{style:{marginRight:12,fontSize:20,color:"#E53935"}},s.createElement(Lu,null)),s.createElement("div",null,s.createElement("div",{className:"list-item-name"},a.name),s.createElement("div",{className:"list-item-address"},a.address))))))}function Qm({center:e,onDispatch:t=()=>{},onClose:n=()=>{}}){const r={lat:28.70406,lon:77.102493},[l,i]=S.useState(r),[o,a]=S.useState([]),[u,c]=S.useState(null);S.useEffect(()=>{if(e)if(typeof e=="string"&&e.includes(",")){const[p,m]=e.split(",").map(g=>parseFloat(g.trim()));!Number.isNaN(p)&&!Number.isNaN(m)&&i({lat:p,lon:m})}else e.lat&&e.lon&&i(e)},[e]),S.useEffect(()=>{e||navigator.geolocation&&navigator.geolocation.getCurrentPosition(p=>{const{latitude:m,longitude:g}=p.coords;i({lat:m,lon:g})},()=>{},{timeout:8e3})},[e]),S.useEffect(()=>{const p=l,g=[{dLat:.0012,dLon:8e-4},{dLat:-9e-4,dLon:.001},{dLat:6e-4,dLon:-.0011},{dLat:-.0015,dLon:-6e-4},{dLat:.0018,dLon:-3e-4}].map((y,E)=>{const x=p.lat+y.dLat,f=p.lon+y.dLon;return{id:`U-${E+1}`,name:`Unit ${E+1}`,lat:x,lon:f,eta:`${2+E} min`,distanceKm:Math.abs(y.dLat*111).toFixed(2)}});a(g)},[l]);const h=(p,m)=>{const g=p-l.lat,y=m-l.lon,E=50-g/.002*50,x=50+y/.002*50;return{top:`${Math.max(6,Math.min(94,E))}%`,left:`${Math.max(6,Math.min(94,x))}%`}};return s.createElement("div",{className:"map-panel"},s.createElement("div",{className:"map-panel-header"},s.createElement("div",{style:{fontWeight:700}},"Nearby Police Units"),s.createElement("div",{style:{display:"flex",gap:8,alignItems:"center"}},s.createElement("button",{className:"btn small",onClick:()=>{c(null),n()}},"Close"))),s.createElement("div",{className:"map-panel-body"},s.createElement("div",{className:"map-area",role:"img","aria-label":"Mock map showing nearby police units"},o.map(p=>{const m=h(p.lat,p.lon),g=u&&u.id===p.id;return s.createElement("button",{key:p.id,className:`marker ${g?"selected":""}`,style:{top:m.top,left:m.left},onClick:()=>c(p),title:`${p.name} — ${p.distanceKm} km — ETA ${p.eta}`,"aria-label":`${p.name}, distance ${p.distanceKm} kilometers`},s.createElement("div",{className:"marker-dot"}))}),s.createElement("div",{className:"center-dot",style:{top:"50%",left:"50%"},title:"Your location"})),s.createElement("div",{className:"unit-list"},s.createElement("div",{className:"unit-list-title"},"Units"),o.map(p=>s.createElement("div",{key:p.id,className:`unit-item ${u&&u.id===p.id?"active":""}`,onClick:()=>c(p),role:"button",tabIndex:0,onKeyDown:m=>{m.key==="Enter"&&c(p)}},s.createElement("div",null,s.createElement("div",{style:{fontWeight:700}},p.name),s.createElement("div",{style:{color:"#666",fontSize:13}},p.distanceKm," km • ETA ",p.eta)),s.createElement("div",null,s.createElement("button",{className:"btn tiny",onClick:m=>{m.stopPropagation(),t(p),window.alert(`Dispatch requested to ${p.name} (simulation)`)}},"Dispatch")))),u&&s.createElement("div",{className:"selected-details"},s.createElement("div",{style:{fontWeight:700,marginBottom:6}},u.name),s.createElement("div",{style:{color:"#666",marginBottom:8}},u.distanceKm," km away • ETA ",u.eta),s.createElement("div",{style:{display:"flex",gap:8}},s.createElement("button",{className:"btn",onClick:()=>{t(u),window.alert("Dispatch requested (simulation)")}},"Dispatch"),s.createElement("button",{className:"btn outline",onClick:()=>c(null)},"Deselect"))))))}function Km(){const[e,t]=S.useState("online"),[n,r]=S.useState([]),l=()=>{const g=Date.now().toString(),y=new Date().toLocaleString();r(E=>[{id:g,time:y,type:"Panic",details:"Demo: Panic pressed at Park Avenue."},...E])},[i,o]=S.useState(null),a=()=>{if(!navigator.geolocation){window.alert("Geolocation is not supported in this browser.");return}navigator.geolocation.getCurrentPosition(g=>{const{latitude:y,longitude:E}=g.coords,x=`${y.toFixed(6)}, ${E.toFixed(6)}`,f=Date.now().toString(),d=new Date().toLocaleString();r(v=>[{id:f,time:d,type:"Location Share",details:`Shared location: ${x}`},...v]),o(x),window.alert("Location shared: "+x)},g=>{window.alert("Unable to get location: "+((g==null?void 0:g.message)||"error"))},{enableHighAccuracy:!0,timeout:1e4})},u=()=>{t(e==="online"?"offline":e==="offline"?"mesh":"online")},c=()=>{r([]),t("online"),window.alert(`Alerts Sent +All queued alerts have been sent to authorities.`)},[h,p]=S.useState(!1),m=g=>{const y=Date.now().toString(),E=new Date().toLocaleString();r(x=>[{id:y,time:E,type:"Dispatch",details:`Dispatch requested to ${g.name} (ETA ${g.eta})`},...x])};return s.createElement("div",{className:"alerts-screen"},s.createElement("header",{className:"header-row"},s.createElement("div",{style:{display:"flex",alignItems:"center",gap:12}},s.createElement("div",{className:"header-title"},"Alert System"),s.createElement("div",{className:`status-pill ${e}`},e==="online"?"Online":e==="mesh"?"Mesh":"Offline")),s.createElement("div",{style:{display:"flex",alignItems:"center",gap:8}},s.createElement("button",{className:"icon-btn",title:"Toggle status",onClick:u},s.createElement(ua,{size:18})))),s.createElement("div",{className:`status-card ${e}`},s.createElement("div",{style:{display:"flex",alignItems:"center",gap:12}},s.createElement("div",{className:"status-icon"},e==="online"?s.createElement(Dm,{size:22,color:"#3ecf4a"}):e==="mesh"?s.createElement(Ru,{size:22,color:"#1976d2"}):s.createElement(Lm,{size:22,color:"#E53935"})),s.createElement("div",null,s.createElement("div",{style:{fontWeight:"700",fontSize:16,color:"#222"}},e==="online"?"Online":e==="mesh"?"Mesh Fallback":"Offline"),s.createElement("div",{style:{color:"#444",marginTop:6}},e==="online"&&"All alerts are sent instantly to authorities.",e==="offline"&&"No internet. Alerts will be queued and sent via SMS or mesh when possible.",e==="mesh"&&"Mesh fallback active. Alerts are relayed via nearby users/devices."))),s.createElement("div",{className:"alert-controls"},s.createElement("button",{className:"btn",onClick:l},s.createElement(_u,{style:{marginRight:8}}),"Push Demo Alert"),s.createElement("button",{className:"btn outline",onClick:()=>window.alert("Test alert sent (simulation)")},"Send Test Alert"))),h&&s.createElement(Qm,{center:i,onDispatch:g=>{m(g)},onClose:()=>p(!1)}),s.createElement("div",{className:"queued-section"},s.createElement("div",{className:"queued-header"},s.createElement("div",{className:"queued-title"},"Queued Alerts"),s.createElement("div",{className:"queued-actions"},s.createElement("button",{className:"btn small",onClick:()=>r([])},"Clear"),s.createElement("button",{className:"btn small primary",onClick:c,disabled:n.length===0},s.createElement(_u,null)))),n.length===0?s.createElement("div",{className:"empty-queued"},"No alerts queued."):s.createElement("div",{className:"queued-list"},n.map(g=>s.createElement("div",{key:g.id,className:"queued-alert-box"},s.createElement("div",{className:"queued-left"},s.createElement(Qr,{size:18,color:"#E53935"})),s.createElement("div",{className:"queued-body"},s.createElement("div",{className:"queued-type"},g.type," Alert"),s.createElement("div",{className:"queued-details"},g.details),s.createElement("div",{className:"queued-time"},g.time)),s.createElement("div",{className:"queued-actions"},s.createElement("button",{className:"btn tiny",onClick:()=>window.alert("Retry send (simulation)")},"Retry"),s.createElement("button",{className:"btn tiny outline",onClick:()=>r(y=>y.filter(E=>E.id!==g.id))},"Delete")))))),s.createElement("div",{className:"features-section"},s.createElement("div",{className:"features-title"},"Features"),s.createElement("div",{className:"features-grid"},s.createElement("div",{className:"feature-box",role:"button",tabIndex:0,onClick:a,onKeyDown:g=>{g.key==="Enter"&&a()}},s.createElement(_m,{size:28,color:"#E53935"}),s.createElement("div",{className:"feature-label"},"Share Location"),i&&s.createElement("div",{className:"feature-subtext"},"Last: ",i)),s.createElement("div",{className:"feature-box",role:"button",tabIndex:0,onClick:()=>p(!0),onKeyDown:g=>{g.key==="Enter"&&p(!0)}},s.createElement(yl,{size:26,color:"#E53935"}),s.createElement("div",{className:"feature-label"},"Nearby Police",s.createElement("br",null),"Units"),s.createElement("div",{className:"feature-subtext"},"Tap to view nearby units")),s.createElement("div",{className:"feature-box"},s.createElement(Pm,{size:28,color:"#E53935"}),s.createElement("div",{className:"feature-label"},"Video/Audio",s.createElement("br",null),"Recording")),s.createElement("div",{className:"feature-box"},s.createElement(zm,{size:28,color:"#E53935"}),s.createElement("div",{className:"feature-label"},"Silent Alert")),s.createElement("div",{className:"feature-box"},s.createElement(Ru,{size:28,color:"#E53935"}),s.createElement("div",{className:"feature-label"},"Mesh",s.createElement("br",null),"Communication")))),s.createElement("div",{className:"research-section"},s.createElement("div",{className:"research-title"},"Research & About"),s.createElement("div",{className:"research-text"},"This app uses advanced mesh networking and SMS fallback to ensure alerts reach authorities even without internet. Mesh communication relays alerts via nearby users/devices, while SMS queue ensures delivery when back online. Your privacy is protected—no personal data is shared without consent."),s.createElement("div",{className:"research-text"},"For more info, visit our website or read the research on mesh networks and emergency response.")))}function Ym(){const[e,t]=S.useState([]),[n,r]=S.useState(!1),l=S.useRef(null),i=u=>{l.current&&l.current.click()},o=u=>{const c=u.target.files[0];if(!c)return;const h=URL.createObjectURL(c),p=c.type.startsWith("image")?"photo":"video";t(m=>[...m,{url:h,type:p}])},a=()=>{e.length!==0&&(r(!0),setTimeout(()=>{r(!1),t([]),window.alert(`Evidence Uploaded +Your evidence has been securely sent to authorities.`)},1800))};return s.createElement("div",{className:"evidence-screen"},s.createElement("header",{className:"header-row"},s.createElement("button",{className:"back-btn",onClick:()=>window.history.back()},"←"),s.createElement("div",{className:"header-title"},"Upload Evidence"),s.createElement("div",{style:{width:40}})),s.createElement("div",{className:"actions-row"},s.createElement("input",{ref:l,type:"file",style:{display:"none"},accept:"image/*,video/*",onChange:o}),s.createElement("button",{className:"action-btn",onClick:()=>i()},s.createElement(jm,{style:{marginRight:8}})," Take / Pick"),s.createElement("button",{className:"action-btn",onClick:()=>i()},s.createElement(Mu,{style:{marginRight:8}})," Record / Pick")),s.createElement("div",{className:"media-preview"},e.length===0?s.createElement("div",{style:{color:"#888",fontStyle:"italic",textAlign:"center"}},"No evidence selected."):e.map((u,c)=>s.createElement("div",{className:"media-box",key:c},u.type==="photo"?s.createElement("img",{src:u.url,alt:"media",className:"media-img"}):s.createElement(Mu,{size:48,color:"#1976d2",style:{marginTop:12}}),s.createElement("div",{className:"media-type"},u.type==="photo"?"Photo":"Video")))),s.createElement("button",{className:"upload-btn",onClick:a,disabled:e.length===0||n},n?"Uploading...":"Upload Evidence"))}function Gm(){const e=yn(),t=r=>e.pathname===r,n=En();return s.createElement("nav",{className:"bottom-tabs"},s.createElement(Mr,{to:"/home",className:`tab ${t("/home")||t("/")?"active":""}`},s.createElement(Om,{size:20})," ",s.createElement("div",{className:"tab-label"},"Home")),s.createElement(Mr,{to:"/chat",className:`tab ${t("/chat")?"active":""}`},s.createElement(ed,{size:20})," ",s.createElement("div",{className:"tab-label"},"Chat")),s.createElement(Mr,{to:"/location",className:`tab ${t("/location")?"active":""}`},s.createElement(td,{size:20})," ",s.createElement("div",{className:"tab-label"},"Location")),s.createElement(Mr,{to:"/alerts",className:`tab ${t("/alerts")?"active":""}`},s.createElement(Tm,{size:20})," ",s.createElement("div",{className:"tab-label"},"Alerts")),s.createElement("button",{className:"tab",style:{background:"none",border:0,cursor:"pointer"},onClick:()=>{localStorage.removeItem("authUser"),n("/login")}},"Logout"))}function Xm(){const e=()=>!!localStorage.getItem("authUser"),t=({children:n})=>e()?n:s.createElement(fm,{to:"/login",replace:!0});return s.createElement("div",{className:"app-root"},s.createElement("main",{className:"main-content"},s.createElement(mm,null,s.createElement(Ve,{path:"/",element:s.createElement(t,null,s.createElement(Tu,null))}),s.createElement(Ve,{path:"/home",element:s.createElement(t,null,s.createElement(Tu,null))}),s.createElement(Ve,{path:"/login",element:s.createElement(Am,null)}),s.createElement(Ve,{path:"/signup",element:s.createElement(Bm,null)}),s.createElement(Ve,{path:"/chat",element:s.createElement(t,null,s.createElement($m,null))}),s.createElement(Ve,{path:"/location",element:s.createElement(t,null,s.createElement(Wm,null))}),s.createElement(Ve,{path:"/alerts",element:s.createElement(t,null,s.createElement(Km,null))}),s.createElement(Ve,{path:"/evidence",element:s.createElement(t,null,s.createElement(Ym,null))}))),e()&&s.createElement(Gm,null))}Wc(document.getElementById("root")).render(s.createElement(s.StrictMode,null,s.createElement(wm,null,s.createElement(Xm,null)))); diff --git a/ShieldX-Web/dist/index.html b/ShieldX-Web/dist/index.html new file mode 100644 index 0000000..754ee4f --- /dev/null +++ b/ShieldX-Web/dist/index.html @@ -0,0 +1,15 @@ + + + + + + SafeCam Converted Web + + + + + +
+ + + diff --git a/ShieldX-Web/eslint.config.cjs b/ShieldX-Web/eslint.config.cjs new file mode 100644 index 0000000..2f570c8 --- /dev/null +++ b/ShieldX-Web/eslint.config.cjs @@ -0,0 +1,19 @@ +module.exports = [ + { + files: ["**/*.js", "**/*.jsx"], + languageOptions: { + ecmaVersion: 2021, + sourceType: "module", + parserOptions: { ecmaFeatures: { jsx: true } } + }, + plugins: { + react: require("eslint-plugin-react") + }, + settings: { + react: { version: "detect" } + }, + rules: { + // keep minimal; project can customize later + } + } +]; diff --git a/ShieldX-Web/index.html b/ShieldX-Web/index.html new file mode 100644 index 0000000..ee09ab1 --- /dev/null +++ b/ShieldX-Web/index.html @@ -0,0 +1,13 @@ + + + + + + SafeCam Converted Web + + + +
+ + + diff --git a/ShieldX-Web/package-lock.json b/ShieldX-Web/package-lock.json new file mode 100644 index 0000000..15fb9a0 --- /dev/null +++ b/ShieldX-Web/package-lock.json @@ -0,0 +1,4252 @@ +{ + "name": "safe-cam-converted-web", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "safe-cam-converted-web", + "version": "0.1.0", + "dependencies": { + "react": "18.2.0", + "react-dom": "18.2.0", + "react-icons": "4.10.1", + "react-router-dom": "6.14.2" + }, + "devDependencies": { + "eslint": "^8.49.0", + "eslint-plugin-react": "^7.32.2", + "vite": "^7.1.7" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.10.tgz", + "integrity": "sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.10.tgz", + "integrity": "sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.10.tgz", + "integrity": "sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.10.tgz", + "integrity": "sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.10.tgz", + "integrity": "sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.10.tgz", + "integrity": "sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.10.tgz", + "integrity": "sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.10.tgz", + "integrity": "sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.10.tgz", + "integrity": "sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.10.tgz", + "integrity": "sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.10.tgz", + "integrity": "sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.10.tgz", + "integrity": "sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.10.tgz", + "integrity": "sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.10.tgz", + "integrity": "sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.10.tgz", + "integrity": "sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.10.tgz", + "integrity": "sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.10.tgz", + "integrity": "sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.10.tgz", + "integrity": "sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.10.tgz", + "integrity": "sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.10.tgz", + "integrity": "sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.10.tgz", + "integrity": "sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.10.tgz", + "integrity": "sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.10.tgz", + "integrity": "sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.10.tgz", + "integrity": "sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.10.tgz", + "integrity": "sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.10.tgz", + "integrity": "sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", + "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@remix-run/router": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.7.2.tgz", + "integrity": "sha512-7Lcn7IqGMV+vizMPoEl5F0XDshcdDYtMI6uJLQdQz5CfZAwy3vvGKYSUk789qndt5dEC4HfSjviSYlSoHGL2+A==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.2.tgz", + "integrity": "sha512-o3pcKzJgSGt4d74lSZ+OCnHwkKBeAbFDmbEm5gg70eA8VkyCuC/zV9TwBnmw6VjDlRdF4Pshfb+WE9E6XY1PoQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.2.tgz", + "integrity": "sha512-cqFSWO5tX2vhC9hJTK8WAiPIm4Q8q/cU8j2HQA0L3E1uXvBYbOZMhE2oFL8n2pKB5sOCHY6bBuHaRwG7TkfJyw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.2.tgz", + "integrity": "sha512-vngduywkkv8Fkh3wIZf5nFPXzWsNsVu1kvtLETWxTFf/5opZmflgVSeLgdHR56RQh71xhPhWoOkEBvbehwTlVA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.2.tgz", + "integrity": "sha512-h11KikYrUCYTrDj6h939hhMNlqU2fo/X4NB0OZcys3fya49o1hmFaczAiJWVAFgrM1NCP6RrO7lQKeVYSKBPSQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.2.tgz", + "integrity": "sha512-/eg4CI61ZUkLXxMHyVlmlGrSQZ34xqWlZNW43IAU4RmdzWEx0mQJ2mN/Cx4IHLVZFL6UBGAh+/GXhgvGb+nVxw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.2.tgz", + "integrity": "sha512-QOWgFH5X9+p+S1NAfOqc0z8qEpJIoUHf7OWjNUGOeW18Mx22lAUOiA9b6r2/vpzLdfxi/f+VWsYjUOMCcYh0Ng==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.2.tgz", + "integrity": "sha512-kDWSPafToDd8LcBYd1t5jw7bD5Ojcu12S3uT372e5HKPzQt532vW+rGFFOaiR0opxePyUkHrwz8iWYEyH1IIQA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.2.tgz", + "integrity": "sha512-gKm7Mk9wCv6/rkzwCiUC4KnevYhlf8ztBrDRT9g/u//1fZLapSRc+eDZj2Eu2wpJ+0RzUKgtNijnVIB4ZxyL+w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.2.tgz", + "integrity": "sha512-66lA8vnj5mB/rtDNwPgrrKUOtCLVQypkyDa2gMfOefXK6rcZAxKLO9Fy3GkW8VkPnENv9hBkNOFfGLf6rNKGUg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.2.tgz", + "integrity": "sha512-s+OPucLNdJHvuZHuIz2WwncJ+SfWHFEmlC5nKMUgAelUeBUnlB4wt7rXWiyG4Zn07uY2Dd+SGyVa9oyLkVGOjA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.2.tgz", + "integrity": "sha512-8wTRM3+gVMDLLDdaT6tKmOE3lJyRy9NpJUS/ZRWmLCmOPIJhVyXwjBo+XbrrwtV33Em1/eCTd5TuGJm4+DmYjw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.2.tgz", + "integrity": "sha512-6yqEfgJ1anIeuP2P/zhtfBlDpXUb80t8DpbYwXQ3bQd95JMvUaqiX+fKqYqUwZXqdJDd8xdilNtsHM2N0cFm6A==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.2.tgz", + "integrity": "sha512-sshYUiYVSEI2B6dp4jMncwxbrUqRdNApF2c3bhtLAU0qA8Lrri0p0NauOsTWh3yCCCDyBOjESHMExonp7Nzc0w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.2.tgz", + "integrity": "sha512-duBLgd+3pqC4MMwBrKkFxaZerUxZcYApQVC5SdbF5/e/589GwVvlRUnyqMFbM8iUSb1BaoX/3fRL7hB9m2Pj8Q==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.2.tgz", + "integrity": "sha512-tzhYJJidDUVGMgVyE+PmxENPHlvvqm1KILjjZhB8/xHYqAGeizh3GBGf9u6WdJpZrz1aCpIIHG0LgJgH9rVjHQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.2.tgz", + "integrity": "sha512-opH8GSUuVcCSSyHHcl5hELrmnk4waZoVpgn/4FDao9iyE4WpQhyWJ5ryl5M3ocp4qkRuHfyXnGqg8M9oKCEKRA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.2.tgz", + "integrity": "sha512-LSeBHnGli1pPKVJ79ZVJgeZWWZXkEe/5o8kcn23M8eMKCUANejchJbF/JqzM4RRjOJfNRhKJk8FuqL1GKjF5oQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.2.tgz", + "integrity": "sha512-uPj7MQ6/s+/GOpolavm6BPo+6CbhbKYyZHUDvZ/SmJM7pfDBgdGisFX3bY/CBDMg2ZO4utfhlApkSfZ92yXw7Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.2.tgz", + "integrity": "sha512-Z9MUCrSgIaUeeHAiNkm3cQyst2UhzjPraR3gYYfOjAuZI7tcFRTOD+4cHLPoS/3qinchth+V56vtqz1Tv+6KPA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.2.tgz", + "integrity": "sha512-+GnYBmpjldD3XQd+HMejo+0gJGwYIOfFeoBQv32xF/RUIvccUz20/V6Otdv+57NE70D5pa8W/jVGDoGq0oON4A==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.2.tgz", + "integrity": "sha512-ApXFKluSB6kDQkAqZOKXBjiaqdF1BlKi+/eqnYe9Ee7U2K3pUDKsIyr8EYm/QDHTJIM+4X+lI0gJc3TTRhd+dA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.2.tgz", + "integrity": "sha512-ARz+Bs8kY6FtitYM96PqPEVvPXqEZmPZsSkXvyX19YzDqkCaIlhCieLLMI5hxO9SRZ2XtCtm8wxhy0iJ2jxNfw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "dev": true, + "license": "ISC" + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-abstract": { + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", + "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/esbuild": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.10.tgz", + "integrity": "sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.10", + "@esbuild/android-arm": "0.25.10", + "@esbuild/android-arm64": "0.25.10", + "@esbuild/android-x64": "0.25.10", + "@esbuild/darwin-arm64": "0.25.10", + "@esbuild/darwin-x64": "0.25.10", + "@esbuild/freebsd-arm64": "0.25.10", + "@esbuild/freebsd-x64": "0.25.10", + "@esbuild/linux-arm": "0.25.10", + "@esbuild/linux-arm64": "0.25.10", + "@esbuild/linux-ia32": "0.25.10", + "@esbuild/linux-loong64": "0.25.10", + "@esbuild/linux-mips64el": "0.25.10", + "@esbuild/linux-ppc64": "0.25.10", + "@esbuild/linux-riscv64": "0.25.10", + "@esbuild/linux-s390x": "0.25.10", + "@esbuild/linux-x64": "0.25.10", + "@esbuild/netbsd-arm64": "0.25.10", + "@esbuild/netbsd-x64": "0.25.10", + "@esbuild/openbsd-arm64": "0.25.10", + "@esbuild/openbsd-x64": "0.25.10", + "@esbuild/openharmony-arm64": "0.25.10", + "@esbuild/sunos-x64": "0.25.10", + "@esbuild/win32-arm64": "0.25.10", + "@esbuild/win32-ia32": "0.25.10", + "@esbuild/win32-x64": "0.25.10" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.32.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz", + "integrity": "sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "array.prototype.tosorted": "^1.1.1", + "doctrine": "^2.1.0", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "object.hasown": "^1.1.2", + "object.values": "^1.1.6", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.4", + "semver": "^6.3.0", + "string.prototype.matchall": "^4.0.8" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.hasown": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.4.tgz", + "integrity": "sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/react-icons": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.10.1.tgz", + "integrity": "sha512-/ngzDP/77tlCfqthiiGNZeYFACw85fUjZtLbedmJ5DTlNDIwETxhwBzdOJ21zj4iJdvc0J3y7yOsX3PpxAJzrw==", + "license": "MIT", + "peerDependencies": { + "react": "*" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/react-router": { + "version": "6.14.2", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.14.2.tgz", + "integrity": "sha512-09Zss2dE2z+T1D03IheqAFtK4UzQyX8nFPWx6jkwdYzGLXd5ie06A6ezS2fO6zJfEb/SpG6UocN2O1hfD+2urQ==", + "license": "MIT", + "dependencies": { + "@remix-run/router": "1.7.2" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.14.2", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.14.2.tgz", + "integrity": "sha512-5pWX0jdKR48XFZBuJqHosX3AAHjRAzygouMTyimnBPOLdY3WjzUSKhus2FVMihUFWzeLebDgr4r8UeQFAct7Bg==", + "license": "MIT", + "dependencies": { + "@remix-run/router": "1.7.2", + "react-router": "6.14.2" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.52.2.tgz", + "integrity": "sha512-I25/2QgoROE1vYV+NQ1En9T9UFB9Cmfm2CJ83zZOlaDpvz29wGQSZXWKw7MiNXau7wYgB/T9fVIdIuEQ+KbiiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.52.2", + "@rollup/rollup-android-arm64": "4.52.2", + "@rollup/rollup-darwin-arm64": "4.52.2", + "@rollup/rollup-darwin-x64": "4.52.2", + "@rollup/rollup-freebsd-arm64": "4.52.2", + "@rollup/rollup-freebsd-x64": "4.52.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.52.2", + "@rollup/rollup-linux-arm-musleabihf": "4.52.2", + "@rollup/rollup-linux-arm64-gnu": "4.52.2", + "@rollup/rollup-linux-arm64-musl": "4.52.2", + "@rollup/rollup-linux-loong64-gnu": "4.52.2", + "@rollup/rollup-linux-ppc64-gnu": "4.52.2", + "@rollup/rollup-linux-riscv64-gnu": "4.52.2", + "@rollup/rollup-linux-riscv64-musl": "4.52.2", + "@rollup/rollup-linux-s390x-gnu": "4.52.2", + "@rollup/rollup-linux-x64-gnu": "4.52.2", + "@rollup/rollup-linux-x64-musl": "4.52.2", + "@rollup/rollup-openharmony-arm64": "4.52.2", + "@rollup/rollup-win32-arm64-msvc": "4.52.2", + "@rollup/rollup-win32-ia32-msvc": "4.52.2", + "@rollup/rollup-win32-x64-gnu": "4.52.2", + "@rollup/rollup-win32-x64-msvc": "4.52.2", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/vite": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.7.tgz", + "integrity": "sha512-VbA8ScMvAISJNJVbRDTJdCwqQoAareR/wutevKanhR2/1EkoXVZVkkORaYm/tNVCjP/UDTKtcw3bAkwOUdedmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/ShieldX-Web/package.json b/ShieldX-Web/package.json new file mode 100644 index 0000000..e3cea81 --- /dev/null +++ b/ShieldX-Web/package.json @@ -0,0 +1,22 @@ +{ + "name": "safe-cam-converted-web", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview", + "lint": "eslint src/" + }, + "dependencies": { + "react": "18.2.0", + "react-dom": "18.2.0", + "react-icons": "4.10.1", + "react-router-dom": "6.14.2" + }, + "devDependencies": { + "eslint": "^8.49.0", + "eslint-plugin-react": "^7.32.2", + "vite": "^7.1.7" + } +} diff --git a/ShieldX-Web/src/App.jsx b/ShieldX-Web/src/App.jsx new file mode 100644 index 0000000..119f7ad --- /dev/null +++ b/ShieldX-Web/src/App.jsx @@ -0,0 +1,36 @@ +import React from 'react' +import { Routes, Route, Navigate } from 'react-router-dom' +import Home from './pages/Home' +import Login from './pages/Login' +import Signup from './pages/Signup' +import Chat from './pages/Chat' +import Location from './pages/Location' +import Alerts from './pages/Alerts' +import Evidence from './pages/Evidence' +import BottomTabs from './components/BottomTabs' + +export default function App() { + const isAuth = () => !!localStorage.getItem('authUser') + + const ProtectedRoute = ({ children }) => { + return isAuth() ? children : + } + + return ( +
+
+ + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + +
+ {isAuth() && } +
+ ) +} diff --git a/ShieldX-Web/src/components/BottomTabs.jsx b/ShieldX-Web/src/components/BottomTabs.jsx new file mode 100644 index 0000000..52ee901 --- /dev/null +++ b/ShieldX-Web/src/components/BottomTabs.jsx @@ -0,0 +1,19 @@ +import React from 'react' +import { Link, useLocation, useNavigate } from 'react-router-dom' +import { IoMdHome, IoMdLocate } from 'react-icons/io' +import { MdChat, MdNotifications } from 'react-icons/md' + +export default function BottomTabs(){ + const loc = useLocation() + const active = (p) => loc.pathname === p + const navigate = useNavigate() + return ( + + ) +} diff --git a/ShieldX-Web/src/components/PoliceMap.jsx b/ShieldX-Web/src/components/PoliceMap.jsx new file mode 100644 index 0000000..2bd10a5 --- /dev/null +++ b/ShieldX-Web/src/components/PoliceMap.jsx @@ -0,0 +1,143 @@ +import React, { useEffect, useState } from 'react' + +// A lightweight mock map that shows fake police units around a center coordinate. +// Props: +// - center: optional string "lat, lon" or {lat, lon} +// - onDispatch(unit): called when user dispatches a unit +// - onClose(): called when panel should be closed +export default function PoliceMap({ center, onDispatch = () => {}, onClose = () => {} }) { + const demoCenter = { lat: 28.704060, lon: 77.102493 } // demo coords + const [centerCoords, setCenterCoords] = useState(demoCenter) + const [units, setUnits] = useState([]) + const [selected, setSelected] = useState(null) + + useEffect(() => { + // parse center prop if provided + if (center) { + if (typeof center === 'string' && center.includes(',')) { + const [la, lo] = center.split(',').map(s => parseFloat(s.trim())) + if (!Number.isNaN(la) && !Number.isNaN(lo)) { + setCenterCoords({ lat: la, lon: lo }) + } + } else if (center.lat && center.lon) { + setCenterCoords(center) + } + } + }, [center]) + + useEffect(() => { + // try browser geolocation if user hasn't provided a center + if (!center) { + if (navigator.geolocation) { + navigator.geolocation.getCurrentPosition( + pos => { + const { latitude, longitude } = pos.coords + setCenterCoords({ lat: latitude, lon: longitude }) + }, + () => { + // ignore, keep demo center + }, + { timeout: 8000 } + ) + } + } + }, [center]) + + useEffect(() => { + // generate 5 mock units around center + const base = centerCoords + const spread = [ + { dLat: 0.0012, dLon: 0.0008 }, + { dLat: -0.0009, dLon: 0.0010 }, + { dLat: 0.0006, dLon: -0.0011 }, + { dLat: -0.0015, dLon: -0.0006 }, + { dLat: 0.0018, dLon: -0.0003 } + ] + const generated = spread.map((s, i) => { + const lat = base.lat + s.dLat + const lon = base.lon + s.dLon + return { + id: `U-${i + 1}`, + name: `Unit ${i + 1}`, + lat, + lon, + eta: `${2 + i} min`, + distanceKm: Math.abs(s.dLat * 111).toFixed(2) // rough km + } + }) + setUnits(generated) + }, [centerCoords]) + + // helper to map lat/lon to percentages inside the map box + const toPercent = (lat, lon) => { + // compute simple relative position using +/-0.002 range + const latDiff = lat - centerCoords.lat + const lonDiff = lon - centerCoords.lon + const latPct = 50 - (latDiff / 0.002) * 50 + const lonPct = 50 + (lonDiff / 0.002) * 50 + return { top: `${Math.max(6, Math.min(94, latPct))}%`, left: `${Math.max(6, Math.min(94, lonPct))}%` } + } + + return ( +
+
+
Nearby Police Units
+
+ +
+
+ +
+
+ {units.map(u => { + const pos = toPercent(u.lat, u.lon) + const isSel = selected && selected.id === u.id + return ( + + ) + })} + + {/* center indicator */} +
+
+ +
+
Units
+ {units.map(u => ( +
setSelected(u)} role="button" tabIndex={0} onKeyDown={(e)=>{if(e.key==='Enter')setSelected(u)}}> +
+
{u.name}
+
{u.distanceKm} km • ETA {u.eta}
+
+
+ +
+
+ ))} + + {selected && ( +
+
{selected.name}
+
{selected.distanceKm} km away • ETA {selected.eta}
+
+ + +
+
+ )} +
+
+
+ ) +} diff --git a/ShieldX-Web/src/main.jsx b/ShieldX-Web/src/main.jsx new file mode 100644 index 0000000..84f60dd --- /dev/null +++ b/ShieldX-Web/src/main.jsx @@ -0,0 +1,13 @@ +import React from 'react' +import { createRoot } from 'react-dom/client' +import { BrowserRouter } from 'react-router-dom' +import App from './App' +import './styles/index.css' + +createRoot(document.getElementById('root')).render( + + + + + +) diff --git a/ShieldX-Web/src/pages/Alerts.jsx b/ShieldX-Web/src/pages/Alerts.jsx new file mode 100644 index 0000000..dcedd11 --- /dev/null +++ b/ShieldX-Web/src/pages/Alerts.jsx @@ -0,0 +1,177 @@ +import React, { useState } from 'react' +import { IoMdWifi } from 'react-icons/io' +import { MdPeople, MdCloudOff, MdSettings, MdVideocam, MdVolumeOff, MdSend, MdLocationOn } from 'react-icons/md' +import { IoIosAlert } from 'react-icons/io' +import { FiShield } from 'react-icons/fi' +import { FaUsers, FaMapMarkerAlt } from 'react-icons/fa' +import PoliceMap from '../components/PoliceMap' + +export default function Alerts() { + const [status, setStatus] = useState('online') // online | offline | mesh + const [queuedAlerts, setQueuedAlerts] = useState([ + // sample queued alert for demo + // { id: '1', time: '2025-09-18 14:22', type: 'Panic', details: 'User pressed panic button at Park Avenue.' } + ]) + + // helper to add a demo queued alert + const pushDemoAlert = () => { + const id = Date.now().toString() + const now = new Date().toLocaleString() + setQueuedAlerts(prev => [{ id, time: now, type: 'Panic', details: 'Demo: Panic pressed at Park Avenue.' }, ...prev]) + } + + const [lastSharedLocation, setLastSharedLocation] = useState(null) + + // Share current location (web) and queue a Location Share alert + const shareLocation = () => { + if (!navigator.geolocation) { + window.alert('Geolocation is not supported in this browser.') + return + } + + navigator.geolocation.getCurrentPosition( + (pos) => { + const { latitude, longitude } = pos.coords + const coords = `${latitude.toFixed(6)}, ${longitude.toFixed(6)}` + const id = Date.now().toString() + const now = new Date().toLocaleString() + setQueuedAlerts(prev => [{ id, time: now, type: 'Location Share', details: `Shared location: ${coords}` }, ...prev]) + setLastSharedLocation(coords) + window.alert('Location shared: ' + coords) + }, + (err) => { + window.alert('Unable to get location: ' + (err?.message || 'error')) + }, + { enableHighAccuracy: true, timeout: 10000 } + ) + } + + const toggleStatus = () => { + if (status === 'online') setStatus('offline') + else if (status === 'offline') setStatus('mesh') + else setStatus('online') + } + + const sendQueued = () => { + setQueuedAlerts([]) + setStatus('online') + window.alert('Alerts Sent\nAll queued alerts have been sent to authorities.') + } + + const [showPolice, setShowPolice] = useState(false) + + const handleDispatch = (unit) => { + const id = Date.now().toString() + const now = new Date().toLocaleString() + setQueuedAlerts(prev => [{ id, time: now, type: 'Dispatch', details: `Dispatch requested to ${unit.name} (ETA ${unit.eta})` }, ...prev]) + } + + return ( +
+
+
+
Alert System
+
{status === 'online' ? 'Online' : status === 'mesh' ? 'Mesh' : 'Offline'}
+
+
+ +
+
+ +
+
+
+ {status === 'online' ? : status === 'mesh' ? : } +
+
+
{status === 'online' ? 'Online' : status === 'mesh' ? 'Mesh Fallback' : 'Offline'}
+
+ {status === 'online' && 'All alerts are sent instantly to authorities.'} + {status === 'offline' && 'No internet. Alerts will be queued and sent via SMS or mesh when possible.'} + {status === 'mesh' && 'Mesh fallback active. Alerts are relayed via nearby users/devices.'} +
+
+
+
+ + +
+
+ {showPolice && ( + { handleDispatch(unit) }} + onClose={() => setShowPolice(false)} + /> + )} + +
+
+
Queued Alerts
+
+ + +
+
+ {queuedAlerts.length === 0 ? ( +
No alerts queued.
+ ) : ( +
+ {queuedAlerts.map(a => ( +
+
+
+
{a.type} Alert
+
{a.details}
+
{a.time}
+
+
+ + +
+
+ ))} +
+ )} +
+ +
+
Features
+
+
{if(e.key==='Enter')shareLocation()}}> + +
Share Location
+ {lastSharedLocation &&
Last: {lastSharedLocation}
} +
+ +
setShowPolice(true)} onKeyDown={(e)=>{if(e.key==='Enter')setShowPolice(true)}}> + +
Nearby Police
Units
+
Tap to view nearby units
+
+ +
+ +
Video/Audio
Recording
+
+ +
+ +
Silent Alert
+
+ +
+ +
Mesh
Communication
+
+
+
+ +
+
Research & About
+
This app uses advanced mesh networking and SMS fallback to ensure alerts reach authorities even without internet. Mesh communication relays alerts via nearby users/devices, while SMS queue ensures delivery when back online. Your privacy is protected—no personal data is shared without consent.
+
For more info, visit our website or read the research on mesh networks and emergency response.
+
+
+ ) +} diff --git a/ShieldX-Web/src/pages/Chat.jsx b/ShieldX-Web/src/pages/Chat.jsx new file mode 100644 index 0000000..30f45d2 --- /dev/null +++ b/ShieldX-Web/src/pages/Chat.jsx @@ -0,0 +1,112 @@ +import React, { useState, useRef, useEffect } from 'react' +import { FiUser } from 'react-icons/fi' +import { IoIosAlert, IoMdSend } from 'react-icons/io' + +export default function Chat({}) { + const [messages, setMessages] = useState([ + { id: '1', sender: 'ai', text: "Hello, I'm your AI assistant. How can I help you today?" } + ]) + const [input, setInput] = useState('') + const [loading, setLoading] = useState(false) + const endRef = useRef(null) + + useEffect(() => { + scrollToBottom() + }, []) + + const scrollToBottom = () => { + endRef.current?.scrollIntoView({ behavior: 'smooth' }) + } + + const sendMessage = async () => { + if (!input.trim() || loading) return + const userMsg = { id: Date.now().toString(), sender: 'user', text: input } + setMessages(prev => [...prev, userMsg]) + setInput('') + setLoading(true) + setTimeout(scrollToBottom, 100) + + // AI response logic mirroring the RN version + let aiText = '' + const text = userMsg.text.toLowerCase() + if (/panic|sos|urgent|immediate|danger|attack|assault|robbery|theft|violence|shooting|gun|weapon/.test(text)) { + aiText = 'Emergency detected. Are you in immediate danger? Please confirm your safety and share your location.' + } else if (/crime|report|help|emergency|police|officer|911/.test(text)) { + aiText = 'Please provide details about the incident, including your location, type of crime, and any injuries.' + } else if (/location|where|address|gps|map/.test(text)) { + aiText = 'Can you share your current location or describe where the incident occurred? You can also use the Live GPS Map feature.' + } else if (/injur|hurt|medical|ambulance|doctor/.test(text)) { + aiText = 'If anyone is injured, please describe the injuries and if medical help is needed. Emergency services can be dispatched.' + } else if (/officer|response|eta|arrive|coming/.test(text)) { + aiText = 'An officer is being dispatched. You will receive live updates on their location and estimated arrival time.' + } else if (/thank|thanks|grateful|appreciate/.test(text)) { + aiText = 'You are welcome. Stay safe! If you need further help, just type your question.' + } else if (/cancel|mistake|false alarm/.test(text)) { + aiText = 'If this was a false alarm, please confirm so we can update the response team.' + } else { + aiText = "I'm here to assist you with emergencies, police alerts, and safety information. Please describe your situation or question." + } + + // Simulate delay like RN + setTimeout(() => { + setMessages(prev => [...prev, { id: Date.now().toString(), sender: 'ai', text: aiText }]) + setLoading(false) + setTimeout(scrollToBottom, 100) + }, 1200) + } + + return ( +
+
+ +
AI Assistant
+
+
+ +
+
+ avatar{e.target.onerror=null; e.target.style.display='none'}} /> + +
+
+
+ +
+ {messages.map(item => ( +
+ {item.sender === 'ai' &&
} +
+ {item.sender === 'ai' &&
AI Assistant
} +
{item.text}
+
+ {item.sender === 'user' &&
} +
+ ))} + {loading && ( +
+
+
AI is typing...
+
+ )} +
+
+ +
+ setInput(e.target.value)} + onKeyDown={e => { if (e.key === 'Enter') sendMessage() }} + disabled={loading} + /> + + +
+
+ ) +} diff --git a/ShieldX-Web/src/pages/Evidence.jsx b/ShieldX-Web/src/pages/Evidence.jsx new file mode 100644 index 0000000..6fb98b3 --- /dev/null +++ b/ShieldX-Web/src/pages/Evidence.jsx @@ -0,0 +1,67 @@ +import React, { useState, useRef } from 'react' +import { FaCamera, FaVideo } from 'react-icons/fa' + +export default function Evidence() { + const [media, setMedia] = useState([]) // { url, type } + const [uploading, setUploading] = useState(false) + const fileRef = useRef(null) + + const pickMedia = (type) => { + if (fileRef.current) fileRef.current.click() + } + + const onFileChange = (e) => { + const f = e.target.files[0] + if (!f) return + const url = URL.createObjectURL(f) + const t = f.type.startsWith('image') ? 'photo' : 'video' + setMedia(prev => [...prev, { url, type: t }]) + } + + const uploadEvidence = () => { + if (media.length === 0) return + setUploading(true) + setTimeout(() => { + setUploading(false) + setMedia([]) + window.alert('Evidence Uploaded\nYour evidence has been securely sent to authorities.') + }, 1800) + } + + return ( +
+
+ +
Upload Evidence
+
+
+ +
+ + + +
+ +
+ {media.length === 0 ? ( +
No evidence selected.
+ ) : ( + media.map((m, idx) => ( +
+ {m.type === 'photo' ? ( + media + ) : ( + + )} +
{m.type === 'photo' ? 'Photo' : 'Video'}
+
+ )) + )} +
+ + +
+ ) +} diff --git a/ShieldX-Web/src/pages/Home.jsx b/ShieldX-Web/src/pages/Home.jsx new file mode 100644 index 0000000..140d9f3 --- /dev/null +++ b/ShieldX-Web/src/pages/Home.jsx @@ -0,0 +1,76 @@ +import React, { useState, useRef, useEffect } from 'react' +import { FiShield } from 'react-icons/fi' +import { MdSettings } from 'react-icons/md' +import { IoIosAlert } from 'react-icons/io' +import { MdChat, MdNotificationsActive } from 'react-icons/md' +import { IoMdLocate } from 'react-icons/io' +import { useNavigate } from 'react-router-dom' + +export default function Home() { + const [status, setStatus] = useState('Safe') + const [panicActive, setPanicActive] = useState(false) + const timerRef = useRef(null) + + useEffect(() => { + return () => { if (timerRef.current) clearTimeout(timerRef.current) } + }, []) + + const navigate = useNavigate() + + const handlePanic = () => { + setPanicActive(true) + setStatus('Alert Sent! Officer Notified') + timerRef.current = setTimeout(() => setStatus('Officer En Route (ETA: 2 min)'), 2000) + timerRef.current = setTimeout(() => { setStatus('Help Arrived'); setPanicActive(false) }, 6000) + } + + return ( +
+
+
+ icon{e.target.onerror=null; e.target.style.display='none'}} /> + +
AI Police Alert
+
+ +
+ +
+
{panicActive ? : }
+
{status}
+
+ +
+ +
{panicActive ? 'Alert in progress...' : 'Tap to send instant police alert.'}
+
+ +
+
Quick Actions
+
+
navigate('/chat')} onKeyDown={(e)=>{if(e.key==='Enter')navigate('/chat')}} aria-label="Open AI Chat Assistant"> + +
AI Chat Assistant
+
+
navigate('/location')} onKeyDown={(e)=>{if(e.key==='Enter')navigate('/location')}} aria-label="Open Live GPS Map"> + +
Live GPS Map
+
+
+
+
navigate('/alerts')} onKeyDown={(e)=>{if(e.key==='Enter')navigate('/alerts')}} aria-label="View Recent Alerts"> + +
Recent Alerts
+
+
navigate('/alerts')} onKeyDown={(e)=>{if(e.key==='Enter')navigate('/alerts')}} aria-label="Safety and Research"> + +
Safety & Research
+
+
+
+
+ ) +} diff --git a/ShieldX-Web/src/pages/Location.jsx b/ShieldX-Web/src/pages/Location.jsx new file mode 100644 index 0000000..e803f8b --- /dev/null +++ b/ShieldX-Web/src/pages/Location.jsx @@ -0,0 +1,88 @@ +import React, { useState } from 'react' +import { IoIosShareAlt } from 'react-icons/io' +import { MdSettings, MdPlace } from 'react-icons/md' + +const dummyLocations = [ + { id: '1', name: 'Police Station', address: 'Sector 21, Main Road' }, + { id: '2', name: 'Hospital', address: 'City Hospital, Block B' }, + { id: '3', name: 'Your Last Location', address: 'Park Avenue, Sector 17' }, +] +const emergencyContacts = [ + { id: '1', name: 'Police', phone: '100' }, + { id: '2', name: 'Ambulance', phone: '102' }, + { id: '3', name: 'Fire', phone: '101' }, +] + +export default function Location() { + const [search, setSearch] = useState('') + const [officerStatus, setOfficerStatus] = useState('No active alert') + + const triggerAlert = () => { + setOfficerStatus('Officer dispatched (ETA: 2 min)') + window.alert('Police Alert Sent\nAn officer is being dispatched to your location.') + setTimeout(() => setOfficerStatus('Officer en route (ETA: 1 min)'), 2000) + setTimeout(() => setOfficerStatus('Officer arrived'), 6000) + } + + const shareLocation = () => { + window.open('https://maps.google.com', '_blank') + } + + const callEmergency = (phone) => window.alert(`Call ${phone}`) + + return ( +
+
+
Location
+ +
+ +
+ setSearch(e.target.value)} /> +
+ +
+
+ +
Map placeholder for web. Use mobile app for live map features.
+
+
+ +
+
🛡️
+
{officerStatus}
+
+ +
+ + + +
+ +
+
Emergency Contacts
+
+ {emergencyContacts.map(c => ( + + ))} +
+
+ +
+
Nearby & Recent Locations
+ {dummyLocations.map(item => ( +
+
+
+
{item.name}
+
{item.address}
+
+
+ ))} +
+
+ ) +} diff --git a/ShieldX-Web/src/pages/Login.jsx b/ShieldX-Web/src/pages/Login.jsx new file mode 100644 index 0000000..8a10638 --- /dev/null +++ b/ShieldX-Web/src/pages/Login.jsx @@ -0,0 +1,90 @@ +import React, { useState } from 'react'; +import { FaGoogle, FaFacebook } from 'react-icons/fa'; +import { IoMdHome, IoMdMap } from 'react-icons/io'; +import { MdNotifications } from 'react-icons/md'; +import { FaUser } from 'react-icons/fa'; +import { useNavigate } from 'react-router-dom'; +import { FiShield } from 'react-icons/fi'; + +export default function Login() { + const [remember, setRemember] = useState(false); + const navigate = useNavigate(); + const [id, setId] = useState(''); + const [password, setPassword] = useState(''); + const [error, setError] = useState(null); + const [loading, setLoading] = useState(false); + + + const doLogin = async (e) => { + if (e && typeof e.preventDefault === 'function') e.preventDefault() + setError(null) + if (!id || !password) { setError('Enter username/email and password'); return } + // prefer Vite env, then CRA env, fallback to localhost for local dev + const api = (typeof import.meta !== 'undefined' && import.meta.env && import.meta.env.VITE_API_URL) + || (typeof process !== 'undefined' && process.env && process.env.REACT_APP_API_URL) + || 'http://localhost:4000' + + setLoading(true) + try { + const base = String(api).replace(/\/$/, '') + const res = await fetch(base + '/api/login', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ username: id, password }) + }) + const data = await res.json() + if (!res.ok) { setError(data.message || 'Login failed'); setLoading(false); return } + localStorage.setItem('authUser', JSON.stringify({ token: data.token, ...data.user })) + navigate('/home', { replace: true }) + } catch (err) { + setError('API error: ' + (err.message || err)) + } finally { + setLoading(false) + } + } + + return ( +
+
+
+
ShieldX
+
Instant Police Alerts
+
+ +
+ {error &&
{error}
} + setId(e.target.value)} /> + setPassword(e.target.value)} /> + +
+ + +
+ + + +
+
+
Or continue with
+
+
+ +
+ + +
+ + + +
+ +
+ + + +
+ ) +} diff --git a/ShieldX-Web/src/pages/Signup.jsx b/ShieldX-Web/src/pages/Signup.jsx new file mode 100644 index 0000000..dbfe1fd --- /dev/null +++ b/ShieldX-Web/src/pages/Signup.jsx @@ -0,0 +1,87 @@ +import React, { useState } from 'react' +import { useNavigate } from 'react-router-dom' + +export default function Signup() { + const [fullName, setFullName] = useState('') + const [email, setEmail] = useState('') + const [password, setPassword] = useState('') + const [error, setError] = useState(null) + const [loading, setLoading] = useState(false) + const navigate = useNavigate() + + const doSignup = async (e) => { + if (e && typeof e.preventDefault === 'function') e.preventDefault() + setError(null) + if (!email || !password) { setError('Please enter email and password'); return } + // prefer Vite env, then CRA env, fallback to localhost for local dev + const api = (typeof import.meta !== 'undefined' && import.meta.env && import.meta.env.VITE_API_URL) + || (typeof process !== 'undefined' && process.env && process.env.REACT_APP_API_URL) + || 'http://localhost:4000' + + setLoading(true) + try { + const base = String(api).replace(/\/$/, '') + const res = await fetch(base + '/api/register', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ username: email, password, name: fullName }) + }) + const data = await res.json() + if (!res.ok) { setError(data.message || 'Signup failed'); setLoading(false); return } + + const loginRes = await fetch(base + '/api/login', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ username: email, password }) + }) + const loginData = await loginRes.json() + if (!loginRes.ok) { setError(loginData.message || 'Auto-login failed'); setLoading(false); navigate('/login'); return } + + localStorage.setItem('authUser', JSON.stringify({ token: loginData.token, username: email, name: fullName || (email && email.split && email.split('@')[0]) })) + navigate('/home', { replace: true }) + } catch (err) { + setError('API error: ' + (err.message || err)) + } finally { + setLoading(false) + } + } + + return ( +
+ +
+

Sign Up

+
+ +
+
+ ℹ️ +
+
+ +
+ {error &&
{error}
} + setFullName(e.target.value)} /> + setEmail(e.target.value)} /> + setPassword(e.target.value)} /> + + + +
+
+
Or sign up with
+
+
+ +
+ + +
+ +
+ +
+ +
+ ) +} diff --git a/ShieldX-Web/src/styles/index.css b/ShieldX-Web/src/styles/index.css new file mode 100644 index 0000000..ac31539 --- /dev/null +++ b/ShieldX-Web/src/styles/index.css @@ -0,0 +1,949 @@ +:root { + --red: #E53935; + --muted: #888; + --bg: #fff +} + +* { + box-sizing: border-box +} + +html, +body, +#root { + height: 100%; + margin: 0; + font-family: Inter, system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial +} + +.app-root { + min-height: 100vh; + background: var(--bg) +} + +.main-content { + padding: 16px +} + +/* Bottom tabs */ +.bottom-tabs { + position: fixed; + left: 0; + right: 0; + bottom: 0; + height: 64px; + background: #fff; + border-top: 1px solid #eee; + display: flex; + align-items: center; + justify-content: space-around; + padding: 8px 12px +} + +.bottom-tabs .tab { + display: flex; + flex-direction: column; + align-items: center; + color: #777; + text-decoration: none +} + +.bottom-tabs .tab.active { + color: var(--red) +} + +.bottom-tabs .tab-label { + font-size: 12px; + margin-top: 4px +} + +/* Ensure main content doesn't hide behind bottom tabs */ +.main-content { + padding-bottom: 88px +} + +.safe-area { + min-height: 80vh; + padding: 8px +} + +.header-row { + display: flex; + align-items: center; + justify-content: space-between; + padding: 8px 12px; + margin-bottom: 8px +} + +.header-title { + font-size: 20px; + font-weight: 700; + color: #222 +} + +.header-icon { + background: #f5f5f5; + border-radius: 20px; + padding: 8px; + border: none +} + +.status-bar { + display: flex; + align-items: center; + gap: 8px; + background: #f7f7fa; + border-radius: 12px; + border: 1px solid #e0e0e0; + padding: 10px 14px; + margin: 8px 0 +} + +.status-bar.panic { + background: #fff3f3; + border-color: var(--red) +} + +.status-text { + font-size: 16px; + color: #222; + font-weight: 600 +} + +.status-text.panic { + color: var(--red); + font-weight: 700 +} + +.sos-container { + text-align: center; + margin: 14px 0 +} + +.sos-button { + width: 220px; + height: 220px; + border-radius: 110px; + background: var(--red); + color: #fff; + display: inline-flex; + flex-direction: column; + align-items: center; + justify-content: center; + border: 0; + box-shadow: 0 8px 16px rgba(229, 57, 53, 0.18); + cursor: pointer +} + +.sos-button:disabled { + opacity: 0.85; + cursor: default +} + +.sos-button.active { + background: #fff; + border: 4px solid var(--red) +} + +.sos-text { + color: #fff; + font-size: 36px; + font-weight: 700; + margin-top: 8px; + letter-spacing: 2px +} + +.sos-text.active { + color: var(--red) +} + +.sos-subtext { + color: var(--muted); + font-size: 16px; + margin-top: 10px +} + +.quick-actions-section { + margin-top: 10px; + padding: 0 4px +} + +.quick-actions-title { + font-size: 18px; + font-weight: 700; + margin-bottom: 12px +} + +.quick-actions-grid { + display: flex; + gap: 16px; + margin-bottom: 16px +} + +.quick-action-box { + flex: 1; + background: #f7f7fa; + border-radius: 18px; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: 16px; + min-height: 96px; + cursor: pointer; + transition: box-shadow .15s ease, transform .12s ease; + text-align: center; +} + +.quick-action-label { + margin-top: 10px; + font-size: 15px; + font-weight: 600; + color: #222 +} + +.auth-screen { + max-width: 420px; + margin: 20px auto; + padding: 16px; + background: #fff; + border-radius: 12px; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05) +} + +.auth-form { + display: flex; + flex-direction: column; + gap: 12px +} + +.auth-form input { + padding: 10px; + border-radius: 8px; + border: 1px solid #e0e0e0 +} + +.auth-form button { + background: var(--red); + color: #fff; + padding: 10px; + border-radius: 8px; + border: 0; + cursor: pointer +} + +@media(max-width:600px) { + .quick-actions-grid { + flex-direction: column + } + + .quick-action-box { + width: 100% + } +} + +.quick-action-box:focus,.quick-action-box:hover{box-shadow:0 8px 20px rgba(0,0,0,0.06);transform:translateY(-4px);outline:none} +.quick-action-box svg{display:block} +.quick-action-label{line-height:1.1} + +/* Chat styles */ +.chat-screen { + display: flex; + flex-direction: column; + height: calc(100vh - 64px); + max-height: 100vh +} + +.chat-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 10px +} + +.back-btn { + background: none; + border: 0; + font-size: 20px; + cursor: pointer +} + +.chat-title { + font-size: 20px; + font-weight: 700; + color: #222 +} + +.avatar-row { + display: flex; + justify-content: center; + margin-bottom: 8px +} + +.avatar-circle { + width: 60px; + height: 60px; + border-radius: 30px; + background: #eee; + display: flex; + align-items: center; + justify-content: center; + position: relative +} + +.avatar-status { + position: absolute; + right: 8px; + bottom: 8px; + width: 12px; + height: 12px; + border-radius: 6px; + background: #3ecf4a; + border: 2px solid #fff +} + +.chat-area { + flex: 1; + overflow: auto; + padding: 10px +} + +.bubble-row { + display: flex; + align-items: flex-end; + margin-bottom: 12px +} + +.bubble-row.user { + justify-content: flex-end +} + +.bubble-avatar, +.bubble-avatar-user { + width: 36px; + height: 36px; + border-radius: 18px; + background: #ddd; + display: flex; + align-items: center; + justify-content: center +} + +.bubble-avatar { + margin-right: 8px +} + +.bubble-avatar-user { + margin-left: 8px +} + +.bubble-left { + background: #f7f7fa; + border-radius: 16px; + padding: 12px; + max-width: 70% +} + +.bubble-right { + background: #E53935; + border-radius: 16px; + padding: 12px; + max-width: 70% +} + +.bubble-sender { + font-size: 12px; + color: #b71c1c; + font-weight: 700; + margin-bottom: 6px +} + +.bubble-text { + font-size: 15px; + color: #222 +} + +.bubble-text-user { + font-size: 15px; + color: #fff +} + +.typing-indicator { + display: flex; + align-items: center; + justify-content: center; + margin: 8px 0 +} + +.spinner { + width: 16px; + height: 16px; + border-radius: 8px; + background: var(--red); + animation: spin 1s linear infinite; + margin-right: 8px +} + +.typing-text { + color: var(--red); + font-size: 13px +} + +@keyframes spin { + from { + transform: rotate(0) + } + + to { + transform: rotate(360deg) + } +} + +.input-bar { + display: flex; + align-items: center; + padding: 10px; + border-top: 1px solid #eee; + background: #fff +} + +.chat-input { + flex: 1; + background: #f7f7fa; + border-radius: 20px; + padding: 10px 14px; + font-size: 15px; + border: 1px solid #eee; + margin-right: 8px +} + +.input-mic { + background: none; + border: 0; + margin-right: 8px +} + +.input-send { + background: var(--red); + border: 0; + border-radius: 20px; + padding: 8px; + display: flex; + align-items: center; + justify-content: center; + color: #fff; + cursor: pointer +} + +/* Alerts styles reuse many of the feature styles already present */ +.status-card { + background: #f7f7fa; + border-radius: 14px; + padding: 16px; + margin: 12px +} + +.status-card.offline { + background: #fff3f3 +} + +.status-card.mesh { + background: #e3f2fd +} + +.queued-section { + background: #fff8f0; + border-radius: 14px; + padding: 14px; + margin: 12px +} + +.queued-title { + font-size: 15px; + font-weight: 700; + color: var(--red); + margin-bottom: 8px +} + +.queued-alert-box { + display: flex; + align-items: flex-start; + margin-bottom: 8px +} + +.send-btn { + display: inline-flex; + align-items: center; + background: var(--red); + color: #fff; + border: 0; + padding: 8px 12px; + border-radius: 20px; + cursor: pointer +} + +/* Alerts page styles */ +.status-pill { + padding: 6px 10px; + border-radius: 14px; + font-weight: 700; + background: #f0f0f0; + color: #222; + font-size: 13px +} + +.status-pill.online { + background: #e8f8ee; + color: #0b8a39 +} + +.status-pill.offline { + background: #fff3f3; + color: #c62828 +} + +.status-pill.mesh { + background: #eaf4ff; + color: #1565c0 +} + +.icon-btn { + background: #fff; + border: 1px solid #eee; + padding: 8px; + border-radius: 10px; + cursor: pointer +} + +.alert-controls { + display: flex; + gap: 12px; + margin-top: 12px +} + +.btn { + background: var(--red); + color: #fff; + border: 0; + padding: 8px 12px; + border-radius: 8px; + cursor: pointer +} + +.btn.outline { + background: #fff; + border: 1px solid #ddd; + color: #333 +} + +.btn.small { + padding: 6px 8px; + border-radius: 6px +} + +.btn.primary { + background: var(--red); + padding: 6px 8px +} + +.btn.tiny { + padding: 6px 8px; + font-size: 12px +} + +.queued-section { + background: #fff; + border-radius: 12px; + padding: 12px; + margin: 12px 0 +} + +.queued-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 10px +} + +.queued-title { + font-size: 16px; + font-weight: 700; + color: #222 +} + +.queued-actions { + display: flex; + gap: 8px +} + +.empty-queued { + color: #888; + font-style: italic; + padding: 12px +} + +.queued-list { + display: flex; + flex-direction: column; + gap: 10px +} + +.queued-alert-box { + display: flex; + align-items: flex-start; + gap: 12px; + padding: 10px; + border-radius: 10px; + background: #fff8f0; + border: 1px solid #ffe6e0 +} + +.queued-left { + flex: 0 0 36px; + display: flex; + align-items: center; + justify-content: center +} + +.queued-body { + flex: 1 +} + +.queued-type { + font-weight: 700; + color: var(--red); + margin-bottom: 6px +} + +.queued-details { + color: #333 +} + +.queued-time { + color: #888; + font-size: 12px; + margin-top: 6px +} + +.queued-actions { + display: flex; + flex-direction: column; + gap: 6px +} + +.features-section { + margin-top: 16px +} + +.features-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); + gap: 12px; + margin-bottom: 12px +} + +.feature-box { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: 16px; + border-radius: 12px; + background: #f7f7fa; + min-height: 96px; + text-align: center +} + +.feature-box svg { + width: 36px; + height: 36px +} + +.feature-label { + text-align: center; + margin-top: 8px; + font-weight: 600; + font-size: 14px; + color: #222 +} + +.feature-subtext { + font-size: 12px; + color: #666; + margin-top: 6px +} + +/* feature box interaction polish */ +.feature-box{transition:box-shadow .18s ease,border-color .18s ease,transform .12s ease} +.feature-box:focus,.feature-box:hover{box-shadow:0 6px 18px rgba(0,0,0,0.06);transform:translateY(-4px);outline:none} + +/* Map panel for Nearby Police Units */ +.map-panel{margin-top:12px;background:#fff;border-radius:12px;border:1px solid #eee;padding:12px} +.map-panel-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px} +.map-panel-body{display:flex;gap:12px} +.map-area{flex:1;position:relative;background:linear-gradient(180deg,#eaf3ff, #fff);height:260px;border-radius:10px;overflow:hidden;border:1px solid #dcecff} +.center-dot{position:absolute;width:14px;height:14px;border-radius:7px;background:#1976d2;border:2px solid #fff;transform:translate(-50%,-50%)} +.marker{position:absolute;width:30px;height:30px;border-radius:15px;background:transparent;border:0;cursor:pointer;display:flex;align-items:center;justify-content:center} +.marker .marker-dot{width:12px;height:12px;border-radius:6px;background:#E53935;border:2px solid #fff;box-shadow:0 2px 6px rgba(0,0,0,0.12)} +.marker.selected .marker-dot{background:#1976d2} +.unit-list{width:280px;display:flex;flex-direction:column;gap:8px} +.unit-list-title{font-weight:700;margin-bottom:6px} +.unit-item{display:flex;justify-content:space-between;align-items:center;padding:8px;border-radius:8px;border:1px solid #f0f0f0;background:#fafcff;cursor:pointer} +.unit-item.active{box-shadow:0 6px 18px rgba(25,118,210,0.08);border-color:#d0e8ff} +.selected-details{margin-top:10px;padding:8px;border-radius:8px;background:#f7f7fa;border:1px solid #eee} + +@media(max-width:720px){.map-panel-body{flex-direction:column}.unit-list{width:100%}} + + +/* Evidence styles reuse media preview definitions already present */ +.evidence-screen .actions-row { + display: flex; + gap: 12px; + justify-content: center; + margin: 16px +} + +.action-btn { + background: var(--red); + color: #fff; + border: 0; + padding: 10px 14px; + border-radius: 20px; + cursor: pointer +} + +.media-preview { + display: flex; + flex-wrap: wrap; + justify-content: center; + margin: 12px +} + +.media-box { + width: 110px; + height: 110px; + background: #f7f7fa; + border-radius: 14px; + margin: 8px; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: 6px +} + +.media-img { + width: 90px; + height: 90px; + object-fit: cover; + border-radius: 10px +} + +.media-type { + color: #1976d2; + font-weight: 700; + margin-top: 6px +} + +.upload-btn { + background: #1976d2; + color: #fff; + border: 0; + padding: 12px 20px; + border-radius: 22px; + display: block; + margin: 16px auto; + cursor: pointer +} + +/* Location styles reuse many existing classes */ +.map-view { + height: 28vh; + border-radius: 18px; + margin: 12px; + padding: 12px; + background: #fff +} + +.action-row { + display: flex; + gap: 12px; + justify-content: space-evenly; + margin: 12px +} + +.action-btn.alt { + background: #1976d2 +} + +.emergency-row { + display: flex; + gap: 8px; + margin-top: 8px +} + +.emergency-btn { + flex: 1; + background: #fff0f0; + border-radius: 14px; + padding: 12px; + border: 0; + cursor: pointer +} + +.list-section { + padding: 12px +} + +.list-item { + display: flex; + align-items: center; + background: #f7f7fa; + border-radius: 14px; + padding: 12px; + margin-bottom: 10px +} + +.list-item-name { + font-size: 15px; + font-weight: 600 +} + +.list-item-address { + font-size: 13px; + color: #888 +} + +/* Login/Signup styles adjustments */ +.input { + display: block; + width: 100%; + padding: 10px; + border-radius: 8px; + border: 1px solid #e0e0e0; + margin-bottom: 12px +} + +.remember-row { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 12px +} + +.forgot { + background: none; + border: 0; + color: red; + cursor: pointer +} + +.login-btn { + background: red; + color: #fff; + padding: 12px; + border-radius: 30px; + border: 0; + display: block; + width: 100%; + cursor: pointer +} + +.divider-row { + display: flex; + align-items: center; + margin: 12px 0 +} + +.divider { + flex: 1; + height: 1; + background: #ddd +} + +.or-text { + margin: 0 10px; + color: #900 +} + +.social-row { + display: flex; + gap: 12px; + justify-content: center; +} + +.social-btn { + border: 1px solid #ddd; + padding: 10px 14px; + border-radius: 30px; + background: #fff; + cursor: pointer +} + +.bottom-nav { + display: flex; + justify-content: space-around; + padding: 12px; + border-top: 1px solid #eee; + background: #fff +} + +.nav-text { + font-size: 12px; + color: #777; + text-align: center +} + +.nav-text-active { + font-size: 12px; + color: red; + text-align: center +} + +.signup-btn { + background: red; + color: #fff; + padding: 12px; + border-radius: 30px; + border: 0; + display: block; + width: 100%; + cursor: pointer +} + +.dividerContainer { + display: flex; + align-items: center; + margin: 12px 0 +} + +.line { + flex: 1; + height: 1; + background: #ccc +} + +.orText { + margin: 0 10px; + color: #777 +} + +.socialContainer { + display: flex; + justify-content: space-evenly; + margin-bottom: 20px +} + +.socialBtn { + border: 1px solid #ccc; + padding: 10px 14px; + border-radius: 10px; + background: #fff; + cursor: pointer +} + +.link { + background: none; + border: 0; + cursor: pointer +} \ No newline at end of file diff --git a/server/package-lock.json b/server/package-lock.json index 9d009ab..2223184 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -17,7 +17,251 @@ "mongoose": "^7.3.1" }, "devDependencies": { - "nodemon": "^2.0.22" + "eslint": "^9.36.0", + "nodemon": "^3.1.10" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", + "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", + "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.6", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-array/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@eslint/config-array/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@eslint/config-helpers": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.1.tgz", + "integrity": "sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.2.tgz", + "integrity": "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@eslint/eslintrc/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@eslint/js": { + "version": "9.36.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.36.0.tgz", + "integrity": "sha512-uhCbYtYynH30iZErszX78U+nR3pJU3RHGQ57NXy5QupD4SBVwDeU8TNBy+MjMngc1UyIW9noKqsRqfjQTBU2dw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz", + "integrity": "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.15.2", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, "node_modules/@mapbox/node-pre-gyp": { @@ -50,6 +294,20 @@ "sparse-bitfield": "^3.0.3" } }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/node": { "version": "24.5.2", "resolved": "https://registry.npmjs.org/@types/node/-/node-24.5.2.tgz", @@ -94,6 +352,29 @@ "node": ">= 0.6" } }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, "node_modules/agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", @@ -129,6 +410,23 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -138,6 +436,22 @@ "node": ">=8" } }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", @@ -172,6 +486,13 @@ "node": ">=10" } }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", @@ -311,6 +632,56 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -345,6 +716,26 @@ "node": ">=10" } }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, "node_modules/color-support": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", @@ -415,6 +806,21 @@ "node": ">= 0.10" } }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -424,6 +830,13 @@ "ms": "2.0.0" } }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, "node_modules/delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", @@ -550,6 +963,212 @@ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", "license": "MIT" }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.36.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.36.0.tgz", + "integrity": "sha512-hB4FIzXovouYzwzECDcUkJ4OcfOEkXTv2zRY6B9bkwjx/cprAq0uvm1nl7zvQ0/TsUk0zQiN4uPfJpB9m+rPMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.0", + "@eslint/config-helpers": "^0.3.1", + "@eslint/core": "^0.15.2", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.36.0", + "@eslint/plugin-kit": "^0.3.5", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/eslint/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", @@ -605,6 +1224,40 @@ "url": "https://opencollective.com/express" } }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", @@ -633,9 +1286,47 @@ "unpipe": "~1.0.0" }, "engines": { - "node": ">= 0.8" + "node": ">= 0.8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" } }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -800,6 +1491,19 @@ "node": ">= 6" } }, + "node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -916,6 +1620,16 @@ "node": ">=0.10.0" } }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, "node_modules/ignore-by-default": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", @@ -923,6 +1637,33 @@ "dev": true, "license": "ISC" }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -1013,6 +1754,47 @@ "node": ">=0.12.0" } }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, "node_modules/jsonwebtoken": { "version": "9.0.2", "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", @@ -1071,6 +1853,46 @@ "node": ">=12.0.0" } }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/lodash.includes": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", @@ -1107,6 +1929,13 @@ "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", "license": "MIT" }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, "node_modules/lodash.once": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", @@ -1400,6 +2229,13 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -1458,19 +2294,19 @@ } }, "node_modules/nodemon": { - "version": "2.0.22", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.22.tgz", - "integrity": "sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.10.tgz", + "integrity": "sha512-WDjw3pJ0/0jMFmyNDp3gvY2YizjLmmOUQo6DEBY+JgdvW/yQ9mEeSw6H5ythl5Ny2ytb7f9C2nIbjSxMNzbJXw==", "dev": true, "license": "MIT", "dependencies": { "chokidar": "^3.5.2", - "debug": "^3.2.7", + "debug": "^4", "ignore-by-default": "^1.0.1", "minimatch": "^3.1.2", "pstree.remy": "^1.1.8", - "semver": "^5.7.1", - "simple-update-notifier": "^1.0.7", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", "supports-color": "^5.5.0", "touch": "^3.1.0", "undefsafe": "^2.0.5" @@ -1479,7 +2315,7 @@ "nodemon": "bin/nodemon.js" }, "engines": { - "node": ">=8.10.0" + "node": ">=10" }, "funding": { "type": "opencollective", @@ -1487,13 +2323,21 @@ } }, "node_modules/nodemon/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, "license": "MIT", "dependencies": { - "ms": "^2.1.1" + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, "node_modules/nodemon/node_modules/ms": { @@ -1503,16 +2347,6 @@ "dev": true, "license": "MIT" }, - "node_modules/nodemon/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, "node_modules/nopt": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", @@ -1593,6 +2427,69 @@ "wrappy": "1" } }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -1602,6 +2499,16 @@ "node": ">= 0.8" } }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -1611,6 +2518,16 @@ "node": ">=0.10.0" } }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/path-to-regexp": { "version": "0.1.12", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", @@ -1630,6 +2547,16 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -1725,6 +2652,16 @@ "node": ">=8.10.0" } }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -1845,6 +2782,29 @@ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "license": "ISC" }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/side-channel": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", @@ -1930,26 +2890,16 @@ "license": "ISC" }, "node_modules/simple-update-notifier": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", - "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", "dev": true, "license": "MIT", "dependencies": { - "semver": "~7.0.0" + "semver": "^7.5.3" }, "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/simple-update-notifier/node_modules/semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "node": ">=10" } }, "node_modules/smart-buffer": { @@ -2030,6 +2980,19 @@ "node": ">=8" } }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -2104,6 +3067,19 @@ "node": ">=12" } }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -2139,6 +3115,16 @@ "node": ">= 0.8" } }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -2185,6 +3171,22 @@ "node": ">=12" } }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/wide-align": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", @@ -2194,6 +3196,16 @@ "string-width": "^1.0.2 || 2 || 3 || 4" } }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -2205,6 +3217,19 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } } } } diff --git a/server/package.json b/server/package.json index 53d788b..56dcd85 100644 --- a/server/package.json +++ b/server/package.json @@ -5,9 +5,10 @@ "main": "src/index.js", "type": "module", "scripts": { - "start": "node src/index.js", - "dev": "NODE_ENV=development nodemon src/index.js", - "dev:win": "set NODE_ENV=development&& nodemon src/index.js" + "start": "node src/index.js", + "dev": "NODE_ENV=development nodemon src/index.js", + "dev:win": "set NODE_ENV=development&& nodemon src/index.js", + "lint": "eslint src/**/*.js src/**/*.jsx" }, "author": "", "license": "MIT", @@ -20,6 +21,7 @@ "mongoose": "^7.3.1" }, "devDependencies": { - "nodemon": "^2.0.22" + "eslint": "^9.36.0", + "nodemon": "^3.1.10" } } From 292ed196a33e9b9cfb14104626f7936b9db75a19 Mon Sep 17 00:00:00 2001 From: Mohit Kumhar Date: Thu, 25 Sep 2025 13:44:35 +0530 Subject: [PATCH 07/13] Fix: removed the duplicate folder (#22) * chore: test * chore: fixes --- ShieldX- Web/.gitignore | 1 - ShieldX- Web/README.md | 40 - ShieldX- Web/dist/assets/index-16523284.css | 1 - ShieldX- Web/dist/assets/index-96984a42.js | 62 -- ShieldX- Web/dist/index.html | 15 - ShieldX- Web/index.html | 13 - ShieldX- Web/package-lock.json | 688 -------------- ShieldX- Web/package.json | 19 - ShieldX- Web/src/App.jsx | 36 - ShieldX- Web/src/components/BottomTabs.jsx | 19 - ShieldX- Web/src/components/PoliceMap.jsx | 143 --- ShieldX- Web/src/main.jsx | 13 - ShieldX- Web/src/pages/Alerts.jsx | 177 ---- ShieldX- Web/src/pages/Chat.jsx | 112 --- ShieldX- Web/src/pages/Evidence.jsx | 67 -- ShieldX- Web/src/pages/Home.jsx | 76 -- ShieldX- Web/src/pages/Location.jsx | 88 -- ShieldX- Web/src/pages/Login.jsx | 90 -- ShieldX- Web/src/pages/Signup.jsx | 87 -- ShieldX- Web/src/styles/index.css | 949 -------------------- vercel.json | 6 - 21 files changed, 2702 deletions(-) delete mode 100644 ShieldX- Web/.gitignore delete mode 100644 ShieldX- Web/README.md delete mode 100644 ShieldX- Web/dist/assets/index-16523284.css delete mode 100644 ShieldX- Web/dist/assets/index-96984a42.js delete mode 100644 ShieldX- Web/dist/index.html delete mode 100644 ShieldX- Web/index.html delete mode 100644 ShieldX- Web/package-lock.json delete mode 100644 ShieldX- Web/package.json delete mode 100644 ShieldX- Web/src/App.jsx delete mode 100644 ShieldX- Web/src/components/BottomTabs.jsx delete mode 100644 ShieldX- Web/src/components/PoliceMap.jsx delete mode 100644 ShieldX- Web/src/main.jsx delete mode 100644 ShieldX- Web/src/pages/Alerts.jsx delete mode 100644 ShieldX- Web/src/pages/Chat.jsx delete mode 100644 ShieldX- Web/src/pages/Evidence.jsx delete mode 100644 ShieldX- Web/src/pages/Home.jsx delete mode 100644 ShieldX- Web/src/pages/Location.jsx delete mode 100644 ShieldX- Web/src/pages/Login.jsx delete mode 100644 ShieldX- Web/src/pages/Signup.jsx delete mode 100644 ShieldX- Web/src/styles/index.css delete mode 100644 vercel.json diff --git a/ShieldX- Web/.gitignore b/ShieldX- Web/.gitignore deleted file mode 100644 index 40b878d..0000000 --- a/ShieldX- Web/.gitignore +++ /dev/null @@ -1 +0,0 @@ -node_modules/ \ No newline at end of file diff --git a/ShieldX- Web/README.md b/ShieldX- Web/README.md deleted file mode 100644 index 8aa9ea1..0000000 --- a/ShieldX- Web/README.md +++ /dev/null @@ -1,40 +0,0 @@ -Converted web app (first pass) - -This folder contains a Vite React app converted from the React Native project. It mirrors screens and styles closely using React + CSS. - -How to run (Windows cmd.exe): - -```cmd -cd "ShieldX- Web" -npm install -npm run dev -``` - -What I converted: -- Full `Home` screen (matching layout and panic button behavior) -- Basic pages for Login, Signup, Chat, Location, Alerts, Evidence as placeholders wired into the router -- Shared CSS closely matching the React Native styles - -Next steps I can do on request: -- Add exact icon replacements and interactive navigation bar -- Implement map (Location) using Leaflet or Google Maps -- Implement file upload for Evidence and integrate API endpoints -- Convert remaining screens with fidelity and accessibility improvements - -If you want me to continue and convert every RN screen precisely to web components (no RN imports), tell me and I will proceed screen-by-screen. - -## Backend API (optional) - -You can connect the frontend to the Node/Express backend to use real MongoDB-backed signup/login. - -1. Start the server in `server/` and set the API URL in your frontend environment. With Vite you should use a Vite-prefixed env var: - - - create a `.env` file in the frontend root with (Vite): - VITE_API_URL=http://localhost:4000 - - - or for older setups you can use the CRA-style var: - REACT_APP_API_URL=http://localhost:4000 - -2. Restart the dev server. Signup/Login will call the backend endpoints when `VITE_API_URL` or `REACT_APP_API_URL` is set. - -If not set, the app falls back to the local `localStorage`-based auth (demo mode). \ No newline at end of file diff --git a/ShieldX- Web/dist/assets/index-16523284.css b/ShieldX- Web/dist/assets/index-16523284.css deleted file mode 100644 index 3d1a59c..0000000 --- a/ShieldX- Web/dist/assets/index-16523284.css +++ /dev/null @@ -1 +0,0 @@ -:root{--red: #E53935;--muted: #888;--bg: #fff }*{box-sizing:border-box}html,body,#root{height:100%;margin:0;font-family:Inter,system-ui,-apple-system,Segoe UI,Roboto,Helvetica Neue,Arial}.app-root{min-height:100vh;background:var(--bg)}.main-content{padding:16px}.bottom-tabs{position:fixed;left:0;right:0;bottom:0;height:64px;background:#fff;border-top:1px solid #eee;display:flex;align-items:center;justify-content:space-around;padding:8px 12px}.bottom-tabs .tab{display:flex;flex-direction:column;align-items:center;color:#777;text-decoration:none}.bottom-tabs .tab.active{color:var(--red)}.bottom-tabs .tab-label{font-size:12px;margin-top:4px}.main-content{padding-bottom:88px}.safe-area{min-height:80vh;padding:8px}.header-row{display:flex;align-items:center;justify-content:space-between;padding:8px 12px;margin-bottom:8px}.header-title{font-size:20px;font-weight:700;color:#222}.header-icon{background:#f5f5f5;border-radius:20px;padding:8px;border:none}.status-bar{display:flex;align-items:center;gap:8px;background:#f7f7fa;border-radius:12px;border:1px solid #e0e0e0;padding:10px 14px;margin:8px 0}.status-bar.panic{background:#fff3f3;border-color:var(--red)}.status-text{font-size:16px;color:#222;font-weight:600}.status-text.panic{color:var(--red);font-weight:700}.sos-container{text-align:center;margin:14px 0}.sos-button{width:220px;height:220px;border-radius:110px;background:var(--red);color:#fff;display:inline-flex;flex-direction:column;align-items:center;justify-content:center;border:0;box-shadow:0 8px 16px #e539352e;cursor:pointer}.sos-button:disabled{opacity:.85;cursor:default}.sos-button.active{background:#fff;border:4px solid var(--red)}.sos-text{color:#fff;font-size:36px;font-weight:700;margin-top:8px;letter-spacing:2px}.sos-text.active{color:var(--red)}.sos-subtext{color:var(--muted);font-size:16px;margin-top:10px}.quick-actions-section{margin-top:10px;padding:0 4px}.quick-actions-title{font-size:18px;font-weight:700;margin-bottom:12px}.quick-actions-grid{display:flex;gap:16px;margin-bottom:16px}.quick-action-box{flex:1;background:#f7f7fa;border-radius:18px;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:16px;min-height:96px;cursor:pointer;transition:box-shadow .15s ease,transform .12s ease;text-align:center}.quick-action-label{margin-top:10px;font-size:15px;font-weight:600;color:#222}.auth-screen{max-width:420px;margin:20px auto;padding:16px;background:#fff;border-radius:12px;box-shadow:0 4px 12px #0000000d}.auth-form{display:flex;flex-direction:column;gap:12px}.auth-form input{padding:10px;border-radius:8px;border:1px solid #e0e0e0}.auth-form button{background:var(--red);color:#fff;padding:10px;border-radius:8px;border:0;cursor:pointer}@media (max-width:600px){.quick-actions-grid{flex-direction:column}.quick-action-box{width:100%}}.quick-action-box:focus,.quick-action-box:hover{box-shadow:0 8px 20px #0000000f;transform:translateY(-4px);outline:none}.quick-action-box svg{display:block}.quick-action-label{line-height:1.1}.chat-screen{display:flex;flex-direction:column;height:calc(100vh - 64px);max-height:100vh}.chat-header{display:flex;align-items:center;justify-content:space-between;padding:10px}.back-btn{background:none;border:0;font-size:20px;cursor:pointer}.chat-title{font-size:20px;font-weight:700;color:#222}.avatar-row{display:flex;justify-content:center;margin-bottom:8px}.avatar-circle{width:60px;height:60px;border-radius:30px;background:#eee;display:flex;align-items:center;justify-content:center;position:relative}.avatar-status{position:absolute;right:8px;bottom:8px;width:12px;height:12px;border-radius:6px;background:#3ecf4a;border:2px solid #fff}.chat-area{flex:1;overflow:auto;padding:10px}.bubble-row{display:flex;align-items:flex-end;margin-bottom:12px}.bubble-row.user{justify-content:flex-end}.bubble-avatar,.bubble-avatar-user{width:36px;height:36px;border-radius:18px;background:#ddd;display:flex;align-items:center;justify-content:center}.bubble-avatar{margin-right:8px}.bubble-avatar-user{margin-left:8px}.bubble-left{background:#f7f7fa;border-radius:16px;padding:12px;max-width:70%}.bubble-right{background:#E53935;border-radius:16px;padding:12px;max-width:70%}.bubble-sender{font-size:12px;color:#b71c1c;font-weight:700;margin-bottom:6px}.bubble-text{font-size:15px;color:#222}.bubble-text-user{font-size:15px;color:#fff}.typing-indicator{display:flex;align-items:center;justify-content:center;margin:8px 0}.spinner{width:16px;height:16px;border-radius:8px;background:var(--red);animation:spin 1s linear infinite;margin-right:8px}.typing-text{color:var(--red);font-size:13px}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.input-bar{display:flex;align-items:center;padding:10px;border-top:1px solid #eee;background:#fff}.chat-input{flex:1;background:#f7f7fa;border-radius:20px;padding:10px 14px;font-size:15px;border:1px solid #eee;margin-right:8px}.input-mic{background:none;border:0;margin-right:8px}.input-send{background:var(--red);border:0;border-radius:20px;padding:8px;display:flex;align-items:center;justify-content:center;color:#fff;cursor:pointer}.status-card{background:#f7f7fa;border-radius:14px;padding:16px;margin:12px}.status-card.offline{background:#fff3f3}.status-card.mesh{background:#e3f2fd}.queued-section{background:#fff8f0;border-radius:14px;padding:14px;margin:12px}.queued-title{font-size:15px;font-weight:700;color:var(--red);margin-bottom:8px}.queued-alert-box{display:flex;align-items:flex-start;margin-bottom:8px}.send-btn{display:inline-flex;align-items:center;background:var(--red);color:#fff;border:0;padding:8px 12px;border-radius:20px;cursor:pointer}.status-pill{padding:6px 10px;border-radius:14px;font-weight:700;background:#f0f0f0;color:#222;font-size:13px}.status-pill.online{background:#e8f8ee;color:#0b8a39}.status-pill.offline{background:#fff3f3;color:#c62828}.status-pill.mesh{background:#eaf4ff;color:#1565c0}.icon-btn{background:#fff;border:1px solid #eee;padding:8px;border-radius:10px;cursor:pointer}.alert-controls{display:flex;gap:12px;margin-top:12px}.btn{background:var(--red);color:#fff;border:0;padding:8px 12px;border-radius:8px;cursor:pointer}.btn.outline{background:#fff;border:1px solid #ddd;color:#333}.btn.small{padding:6px 8px;border-radius:6px}.btn.primary{background:var(--red);padding:6px 8px}.btn.tiny{padding:6px 8px;font-size:12px}.queued-section{background:#fff;border-radius:12px;padding:12px;margin:12px 0}.queued-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:10px}.queued-title{font-size:16px;font-weight:700;color:#222}.queued-actions{display:flex;gap:8px}.empty-queued{color:#888;font-style:italic;padding:12px}.queued-list{display:flex;flex-direction:column;gap:10px}.queued-alert-box{display:flex;align-items:flex-start;gap:12px;padding:10px;border-radius:10px;background:#fff8f0;border:1px solid #ffe6e0}.queued-left{flex:0 0 36px;display:flex;align-items:center;justify-content:center}.queued-body{flex:1}.queued-type{font-weight:700;color:var(--red);margin-bottom:6px}.queued-details{color:#333}.queued-time{color:#888;font-size:12px;margin-top:6px}.queued-actions{display:flex;flex-direction:column;gap:6px}.features-section{margin-top:16px}.features-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(140px,1fr));gap:12px;margin-bottom:12px}.feature-box{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:16px;border-radius:12px;background:#f7f7fa;min-height:96px;text-align:center}.feature-box svg{width:36px;height:36px}.feature-label{text-align:center;margin-top:8px;font-weight:600;font-size:14px;color:#222}.feature-subtext{font-size:12px;color:#666;margin-top:6px}.feature-box{transition:box-shadow .18s ease,border-color .18s ease,transform .12s ease}.feature-box:focus,.feature-box:hover{box-shadow:0 6px 18px #0000000f;transform:translateY(-4px);outline:none}.map-panel{margin-top:12px;background:#fff;border-radius:12px;border:1px solid #eee;padding:12px}.map-panel-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px}.map-panel-body{display:flex;gap:12px}.map-area{flex:1;position:relative;background:linear-gradient(180deg,#eaf3ff,#fff);height:260px;border-radius:10px;overflow:hidden;border:1px solid #dcecff}.center-dot{position:absolute;width:14px;height:14px;border-radius:7px;background:#1976d2;border:2px solid #fff;transform:translate(-50%,-50%)}.marker{position:absolute;width:30px;height:30px;border-radius:15px;background:transparent;border:0;cursor:pointer;display:flex;align-items:center;justify-content:center}.marker .marker-dot{width:12px;height:12px;border-radius:6px;background:#E53935;border:2px solid #fff;box-shadow:0 2px 6px #0000001f}.marker.selected .marker-dot{background:#1976d2}.unit-list{width:280px;display:flex;flex-direction:column;gap:8px}.unit-list-title{font-weight:700;margin-bottom:6px}.unit-item{display:flex;justify-content:space-between;align-items:center;padding:8px;border-radius:8px;border:1px solid #f0f0f0;background:#fafcff;cursor:pointer}.unit-item.active{box-shadow:0 6px 18px #1976d214;border-color:#d0e8ff}.selected-details{margin-top:10px;padding:8px;border-radius:8px;background:#f7f7fa;border:1px solid #eee}@media (max-width:720px){.map-panel-body{flex-direction:column}.unit-list{width:100%}}.evidence-screen .actions-row{display:flex;gap:12px;justify-content:center;margin:16px}.action-btn{background:var(--red);color:#fff;border:0;padding:10px 14px;border-radius:20px;cursor:pointer}.media-preview{display:flex;flex-wrap:wrap;justify-content:center;margin:12px}.media-box{width:110px;height:110px;background:#f7f7fa;border-radius:14px;margin:8px;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:6px}.media-img{width:90px;height:90px;object-fit:cover;border-radius:10px}.media-type{color:#1976d2;font-weight:700;margin-top:6px}.upload-btn{background:#1976d2;color:#fff;border:0;padding:12px 20px;border-radius:22px;display:block;margin:16px auto;cursor:pointer}.map-view{height:28vh;border-radius:18px;margin:12px;padding:12px;background:#fff}.action-row{display:flex;gap:12px;justify-content:space-evenly;margin:12px}.action-btn.alt{background:#1976d2}.emergency-row{display:flex;gap:8px;margin-top:8px}.emergency-btn{flex:1;background:#fff0f0;border-radius:14px;padding:12px;border:0;cursor:pointer}.list-section{padding:12px}.list-item{display:flex;align-items:center;background:#f7f7fa;border-radius:14px;padding:12px;margin-bottom:10px}.list-item-name{font-size:15px;font-weight:600}.list-item-address{font-size:13px;color:#888}.input{display:block;width:100%;padding:10px;border-radius:8px;border:1px solid #e0e0e0;margin-bottom:12px}.remember-row{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px}.forgot{background:none;border:0;color:red;cursor:pointer}.login-btn{background:red;color:#fff;padding:12px;border-radius:30px;border:0;display:block;width:100%;cursor:pointer}.divider-row{display:flex;align-items:center;margin:12px 0}.divider{flex:1;height:1;background:#ddd}.or-text{margin:0 10px;color:#900}.social-row{display:flex;gap:12px;justify-content:center}.social-btn{border:1px solid #ddd;padding:10px 14px;border-radius:30px;background:#fff;cursor:pointer}.bottom-nav{display:flex;justify-content:space-around;padding:12px;border-top:1px solid #eee;background:#fff}.nav-text{font-size:12px;color:#777;text-align:center}.nav-text-active{font-size:12px;color:red;text-align:center}.signup-btn{background:red;color:#fff;padding:12px;border-radius:30px;border:0;display:block;width:100%;cursor:pointer}.dividerContainer{display:flex;align-items:center;margin:12px 0}.line{flex:1;height:1;background:#ccc}.orText{margin:0 10px;color:#777}.socialContainer{display:flex;justify-content:space-evenly;margin-bottom:20px}.socialBtn{border:1px solid #ccc;padding:10px 14px;border-radius:10px;background:#fff;cursor:pointer}.link{background:none;border:0;cursor:pointer} diff --git a/ShieldX- Web/dist/assets/index-96984a42.js b/ShieldX- Web/dist/assets/index-96984a42.js deleted file mode 100644 index 276eabb..0000000 --- a/ShieldX- Web/dist/assets/index-96984a42.js +++ /dev/null @@ -1,62 +0,0 @@ -function rd(e,t){for(var n=0;nr[l]})}}}return Object.freeze(Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}))}(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const l of document.querySelectorAll('link[rel="modulepreload"]'))r(l);new MutationObserver(l=>{for(const i of l)if(i.type==="childList")for(const o of i.addedNodes)o.tagName==="LINK"&&o.rel==="modulepreload"&&r(o)}).observe(document,{childList:!0,subtree:!0});function n(l){const i={};return l.integrity&&(i.integrity=l.integrity),l.referrerPolicy&&(i.referrerPolicy=l.referrerPolicy),l.crossOrigin==="use-credentials"?i.credentials="include":l.crossOrigin==="anonymous"?i.credentials="omit":i.credentials="same-origin",i}function r(l){if(l.ep)return;l.ep=!0;const i=n(l);fetch(l.href,i)}})();function ld(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var Ou={exports:{}},M={};/** - * @license React - * react.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var ur=Symbol.for("react.element"),id=Symbol.for("react.portal"),od=Symbol.for("react.fragment"),ad=Symbol.for("react.strict_mode"),ud=Symbol.for("react.profiler"),sd=Symbol.for("react.provider"),cd=Symbol.for("react.context"),dd=Symbol.for("react.forward_ref"),fd=Symbol.for("react.suspense"),pd=Symbol.for("react.memo"),md=Symbol.for("react.lazy"),ca=Symbol.iterator;function hd(e){return e===null||typeof e!="object"?null:(e=ca&&e[ca]||e["@@iterator"],typeof e=="function"?e:null)}var Iu={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},Du=Object.assign,Uu={};function fn(e,t,n){this.props=e,this.context=t,this.refs=Uu,this.updater=n||Iu}fn.prototype.isReactComponent={};fn.prototype.setState=function(e,t){if(typeof e!="object"&&typeof e!="function"&&e!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")};fn.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")};function Fu(){}Fu.prototype=fn.prototype;function uo(e,t,n){this.props=e,this.context=t,this.refs=Uu,this.updater=n||Iu}var so=uo.prototype=new Fu;so.constructor=uo;Du(so,fn.prototype);so.isPureReactComponent=!0;var da=Array.isArray,ju=Object.prototype.hasOwnProperty,co={current:null},Au={key:!0,ref:!0,__self:!0,__source:!0};function Bu(e,t,n){var r,l={},i=null,o=null;if(t!=null)for(r in t.ref!==void 0&&(o=t.ref),t.key!==void 0&&(i=""+t.key),t)ju.call(t,r)&&!Au.hasOwnProperty(r)&&(l[r]=t[r]);var a=arguments.length-2;if(a===1)l.children=n;else if(1>>1,q=P[K];if(0>>1;Kl(Fl,T))Ntl(mr,Fl)?(P[K]=mr,P[Nt]=T,K=Nt):(P[K]=Fl,P[Ct]=T,K=Ct);else if(Ntl(mr,T))P[K]=mr,P[Nt]=T,K=Nt;else break e}}return R}function l(P,R){var T=P.sortIndex-R.sortIndex;return T!==0?T:P.id-R.id}if(typeof performance=="object"&&typeof performance.now=="function"){var i=performance;e.unstable_now=function(){return i.now()}}else{var o=Date,a=o.now();e.unstable_now=function(){return o.now()-a}}var u=[],c=[],h=1,p=null,m=3,g=!1,y=!1,E=!1,x=typeof setTimeout=="function"?setTimeout:null,f=typeof clearTimeout=="function"?clearTimeout:null,d=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function v(P){for(var R=n(c);R!==null;){if(R.callback===null)r(c);else if(R.startTime<=P)r(c),R.sortIndex=R.expirationTime,t(u,R);else break;R=n(c)}}function w(P){if(E=!1,v(P),!y)if(n(u)!==null)y=!0,Dl(C);else{var R=n(c);R!==null&&Ul(w,R.startTime-P)}}function C(P,R){y=!1,E&&(E=!1,f(L),L=-1),g=!0;var T=m;try{for(v(R),p=n(u);p!==null&&(!(p.expirationTime>R)||P&&!Le());){var K=p.callback;if(typeof K=="function"){p.callback=null,m=p.priorityLevel;var q=K(p.expirationTime<=R);R=e.unstable_now(),typeof q=="function"?p.callback=q:p===n(u)&&r(u),v(R)}else r(u);p=n(u)}if(p!==null)var pr=!0;else{var Ct=n(c);Ct!==null&&Ul(w,Ct.startTime-R),pr=!1}return pr}finally{p=null,m=T,g=!1}}var z=!1,_=null,L=-1,Q=5,O=-1;function Le(){return!(e.unstable_now()-OP||125K?(P.sortIndex=T,t(c,P),n(u)===null&&P===n(c)&&(E?(f(L),L=-1):E=!0,Ul(w,T-K))):(P.sortIndex=q,t(u,P),y||g||(y=!0,Dl(C))),P},e.unstable_shouldYield=Le,e.unstable_wrapCallback=function(P){var R=m;return function(){var T=m;m=R;try{return P.apply(this,arguments)}finally{m=T}}}})(Hu);Vu.exports=Hu;var Sd=Vu.exports;/** - * @license React - * react-dom.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var Wu=S,we=Sd;function k(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),fi=Object.prototype.hasOwnProperty,kd=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,pa={},ma={};function Cd(e){return fi.call(ma,e)?!0:fi.call(pa,e)?!1:kd.test(e)?ma[e]=!0:(pa[e]=!0,!1)}function Nd(e,t,n,r){if(n!==null&&n.type===0)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return r?!1:n!==null?!n.acceptsBooleans:(e=e.toLowerCase().slice(0,5),e!=="data-"&&e!=="aria-");default:return!1}}function xd(e,t,n,r){if(t===null||typeof t>"u"||Nd(e,t,n,r))return!0;if(r)return!1;if(n!==null)switch(n.type){case 3:return!t;case 4:return t===!1;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}function de(e,t,n,r,l,i,o){this.acceptsBooleans=t===2||t===3||t===4,this.attributeName=r,this.attributeNamespace=l,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=i,this.removeEmptyString=o}var re={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){re[e]=new de(e,0,!1,e,null,!1,!1)});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];re[t]=new de(t,1,!1,e[1],null,!1,!1)});["contentEditable","draggable","spellCheck","value"].forEach(function(e){re[e]=new de(e,2,!1,e.toLowerCase(),null,!1,!1)});["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){re[e]=new de(e,2,!1,e,null,!1,!1)});"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){re[e]=new de(e,3,!1,e.toLowerCase(),null,!1,!1)});["checked","multiple","muted","selected"].forEach(function(e){re[e]=new de(e,3,!0,e,null,!1,!1)});["capture","download"].forEach(function(e){re[e]=new de(e,4,!1,e,null,!1,!1)});["cols","rows","size","span"].forEach(function(e){re[e]=new de(e,6,!1,e,null,!1,!1)});["rowSpan","start"].forEach(function(e){re[e]=new de(e,5,!1,e.toLowerCase(),null,!1,!1)});var po=/[\-:]([a-z])/g;function mo(e){return e[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(e){var t=e.replace(po,mo);re[t]=new de(t,1,!1,e,null,!1,!1)});"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var t=e.replace(po,mo);re[t]=new de(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)});["xml:base","xml:lang","xml:space"].forEach(function(e){var t=e.replace(po,mo);re[t]=new de(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)});["tabIndex","crossOrigin"].forEach(function(e){re[e]=new de(e,1,!1,e.toLowerCase(),null,!1,!1)});re.xlinkHref=new de("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1);["src","href","action","formAction"].forEach(function(e){re[e]=new de(e,1,!1,e.toLowerCase(),null,!0,!0)});function ho(e,t,n,r){var l=re.hasOwnProperty(t)?re[t]:null;(l!==null?l.type!==0:r||!(2a||l[o]!==i[a]){var u=` -`+l[o].replace(" at new "," at ");return e.displayName&&u.includes("")&&(u=u.replace("",e.displayName)),u}while(1<=o&&0<=a);break}}}finally{Bl=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:"")?Rn(e):""}function Pd(e){switch(e.tag){case 5:return Rn(e.type);case 16:return Rn("Lazy");case 13:return Rn("Suspense");case 19:return Rn("SuspenseList");case 0:case 2:case 15:return e=$l(e.type,!1),e;case 11:return e=$l(e.type.render,!1),e;case 1:return e=$l(e.type,!0),e;default:return""}}function vi(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case $t:return"Fragment";case Bt:return"Portal";case pi:return"Profiler";case vo:return"StrictMode";case mi:return"Suspense";case hi:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case Yu:return(e.displayName||"Context")+".Consumer";case Ku:return(e._context.displayName||"Context")+".Provider";case go:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case yo:return t=e.displayName||null,t!==null?t:vi(e.type)||"Memo";case et:t=e._payload,e=e._init;try{return vi(e(t))}catch{}}return null}function zd(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=t.render,e=e.displayName||e.name||"",t.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return vi(t);case 8:return t===vo?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof t=="function")return t.displayName||t.name||null;if(typeof t=="string")return t}return null}function gt(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function Xu(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function _d(e){var t=Xu(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=""+e[t];if(!e.hasOwnProperty(t)&&typeof n<"u"&&typeof n.get=="function"&&typeof n.set=="function"){var l=n.get,i=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return l.call(this)},set:function(o){r=""+o,i.call(this,o)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return r},setValue:function(o){r=""+o},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function gr(e){e._valueTracker||(e._valueTracker=_d(e))}function Ju(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r="";return e&&(r=Xu(e)?e.checked?"true":"false":e.value),e=r,e!==n?(t.setValue(e),!0):!1}function Kr(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function gi(e,t){var n=t.checked;return V({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:n??e._wrapperState.initialChecked})}function va(e,t){var n=t.defaultValue==null?"":t.defaultValue,r=t.checked!=null?t.checked:t.defaultChecked;n=gt(t.value!=null?t.value:n),e._wrapperState={initialChecked:r,initialValue:n,controlled:t.type==="checkbox"||t.type==="radio"?t.checked!=null:t.value!=null}}function Zu(e,t){t=t.checked,t!=null&&ho(e,"checked",t,!1)}function yi(e,t){Zu(e,t);var n=gt(t.value),r=t.type;if(n!=null)r==="number"?(n===0&&e.value===""||e.value!=n)&&(e.value=""+n):e.value!==""+n&&(e.value=""+n);else if(r==="submit"||r==="reset"){e.removeAttribute("value");return}t.hasOwnProperty("value")?Ei(e,t.type,n):t.hasOwnProperty("defaultValue")&&Ei(e,t.type,gt(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function ga(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var r=t.type;if(!(r!=="submit"&&r!=="reset"||t.value!==void 0&&t.value!==null))return;t=""+e._wrapperState.initialValue,n||t===e.value||(e.value=t),e.defaultValue=t}n=e.name,n!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,n!==""&&(e.name=n)}function Ei(e,t,n){(t!=="number"||Kr(e.ownerDocument)!==e)&&(n==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+n&&(e.defaultValue=""+n))}var Tn=Array.isArray;function qt(e,t,n,r){if(e=e.options,t){t={};for(var l=0;l"+t.valueOf().toString()+"",t=yr.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function Wn(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&n.nodeType===3){n.nodeValue=t;return}}e.textContent=t}var In={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},Ld=["Webkit","ms","Moz","O"];Object.keys(In).forEach(function(e){Ld.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),In[t]=In[e]})});function ts(e,t,n){return t==null||typeof t=="boolean"||t===""?"":n||typeof t!="number"||t===0||In.hasOwnProperty(e)&&In[e]?(""+t).trim():t+"px"}function ns(e,t){e=e.style;for(var n in t)if(t.hasOwnProperty(n)){var r=n.indexOf("--")===0,l=ts(n,t[n],r);n==="float"&&(n="cssFloat"),r?e.setProperty(n,l):e[n]=l}}var Rd=V({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function ki(e,t){if(t){if(Rd[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(k(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(k(60));if(typeof t.dangerouslySetInnerHTML!="object"||!("__html"in t.dangerouslySetInnerHTML))throw Error(k(61))}if(t.style!=null&&typeof t.style!="object")throw Error(k(62))}}function Ci(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var Ni=null;function Eo(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var xi=null,bt=null,en=null;function wa(e){if(e=dr(e)){if(typeof xi!="function")throw Error(k(280));var t=e.stateNode;t&&(t=Cl(t),xi(e.stateNode,e.type,t))}}function rs(e){bt?en?en.push(e):en=[e]:bt=e}function ls(){if(bt){var e=bt,t=en;if(en=bt=null,wa(e),t)for(e=0;e>>=0,e===0?32:31-($d(e)/Vd|0)|0}var Er=64,wr=4194304;function Mn(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function Jr(e,t){var n=e.pendingLanes;if(n===0)return 0;var r=0,l=e.suspendedLanes,i=e.pingedLanes,o=n&268435455;if(o!==0){var a=o&~l;a!==0?r=Mn(a):(i&=o,i!==0&&(r=Mn(i)))}else o=n&~l,o!==0?r=Mn(o):i!==0&&(r=Mn(i));if(r===0)return 0;if(t!==0&&t!==r&&!(t&l)&&(l=r&-r,i=t&-t,l>=i||l===16&&(i&4194240)!==0))return t;if(r&4&&(r|=n&16),t=e.entangledLanes,t!==0)for(e=e.entanglements,t&=r;0n;n++)t.push(e);return t}function sr(e,t,n){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-Ie(t),e[t]=n}function Kd(e,t){var n=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var r=e.eventTimes;for(e=e.expirationTimes;0=Un),La=String.fromCharCode(32),Ra=!1;function Ns(e,t){switch(e){case"keyup":return Sf.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function xs(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var Vt=!1;function Cf(e,t){switch(e){case"compositionend":return xs(t);case"keypress":return t.which!==32?null:(Ra=!0,La);case"textInput":return e=t.data,e===La&&Ra?null:e;default:return null}}function Nf(e,t){if(Vt)return e==="compositionend"||!zo&&Ns(e,t)?(e=ks(),Ur=No=lt=null,Vt=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=r}e:{for(;n;){if(n.nextSibling){n=n.nextSibling;break e}n=n.parentNode}n=void 0}n=Ia(n)}}function Ls(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?Ls(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function Rs(){for(var e=window,t=Kr();t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href=="string"}catch{n=!1}if(n)e=t.contentWindow;else break;t=Kr(e.document)}return t}function _o(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}function Of(e){var t=Rs(),n=e.focusedElem,r=e.selectionRange;if(t!==n&&n&&n.ownerDocument&&Ls(n.ownerDocument.documentElement,n)){if(r!==null&&_o(n)){if(t=r.start,e=r.end,e===void 0&&(e=t),"selectionStart"in n)n.selectionStart=t,n.selectionEnd=Math.min(e,n.value.length);else if(e=(t=n.ownerDocument||document)&&t.defaultView||window,e.getSelection){e=e.getSelection();var l=n.textContent.length,i=Math.min(r.start,l);r=r.end===void 0?i:Math.min(r.end,l),!e.extend&&i>r&&(l=r,r=i,i=l),l=Da(n,i);var o=Da(n,r);l&&o&&(e.rangeCount!==1||e.anchorNode!==l.node||e.anchorOffset!==l.offset||e.focusNode!==o.node||e.focusOffset!==o.offset)&&(t=t.createRange(),t.setStart(l.node,l.offset),e.removeAllRanges(),i>r?(e.addRange(t),e.extend(o.node,o.offset)):(t.setEnd(o.node,o.offset),e.addRange(t)))}}for(t=[],e=n;e=e.parentNode;)e.nodeType===1&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof n.focus=="function"&&n.focus(),n=0;n=document.documentMode,Ht=null,Ti=null,jn=null,Mi=!1;function Ua(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;Mi||Ht==null||Ht!==Kr(r)||(r=Ht,"selectionStart"in r&&_o(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),jn&&Jn(jn,r)||(jn=r,r=br(Ti,"onSelect"),0Kt||(e.current=ji[Kt],ji[Kt]=null,Kt--)}function U(e,t){Kt++,ji[Kt]=e.current,e.current=t}var yt={},ae=wt(yt),me=wt(!1),Mt=yt;function on(e,t){var n=e.type.contextTypes;if(!n)return yt;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===t)return r.__reactInternalMemoizedMaskedChildContext;var l={},i;for(i in n)l[i]=t[i];return r&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=l),l}function he(e){return e=e.childContextTypes,e!=null}function tl(){j(me),j(ae)}function Ha(e,t,n){if(ae.current!==yt)throw Error(k(168));U(ae,t),U(me,n)}function As(e,t,n){var r=e.stateNode;if(t=t.childContextTypes,typeof r.getChildContext!="function")return n;r=r.getChildContext();for(var l in r)if(!(l in t))throw Error(k(108,zd(e)||"Unknown",l));return V({},n,r)}function nl(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||yt,Mt=ae.current,U(ae,e),U(me,me.current),!0}function Wa(e,t,n){var r=e.stateNode;if(!r)throw Error(k(169));n?(e=As(e,t,Mt),r.__reactInternalMemoizedMergedChildContext=e,j(me),j(ae),U(ae,e)):j(me),U(me,n)}var We=null,Nl=!1,ti=!1;function Bs(e){We===null?We=[e]:We.push(e)}function Qf(e){Nl=!0,Bs(e)}function St(){if(!ti&&We!==null){ti=!0;var e=0,t=D;try{var n=We;for(D=1;e>=o,l-=o,Qe=1<<32-Ie(t)+l|n<L?(Q=_,_=null):Q=_.sibling;var O=m(f,_,v[L],w);if(O===null){_===null&&(_=Q);break}e&&_&&O.alternate===null&&t(f,_),d=i(O,d,L),z===null?C=O:z.sibling=O,z=O,_=Q}if(L===v.length)return n(f,_),A&&xt(f,L),C;if(_===null){for(;LL?(Q=_,_=null):Q=_.sibling;var Le=m(f,_,O.value,w);if(Le===null){_===null&&(_=Q);break}e&&_&&Le.alternate===null&&t(f,_),d=i(Le,d,L),z===null?C=Le:z.sibling=Le,z=Le,_=Q}if(O.done)return n(f,_),A&&xt(f,L),C;if(_===null){for(;!O.done;L++,O=v.next())O=p(f,O.value,w),O!==null&&(d=i(O,d,L),z===null?C=O:z.sibling=O,z=O);return A&&xt(f,L),C}for(_=r(f,_);!O.done;L++,O=v.next())O=g(_,f,L,O.value,w),O!==null&&(e&&O.alternate!==null&&_.delete(O.key===null?L:O.key),d=i(O,d,L),z===null?C=O:z.sibling=O,z=O);return e&&_.forEach(function(wn){return t(f,wn)}),A&&xt(f,L),C}function x(f,d,v,w){if(typeof v=="object"&&v!==null&&v.type===$t&&v.key===null&&(v=v.props.children),typeof v=="object"&&v!==null){switch(v.$$typeof){case vr:e:{for(var C=v.key,z=d;z!==null;){if(z.key===C){if(C=v.type,C===$t){if(z.tag===7){n(f,z.sibling),d=l(z,v.props.children),d.return=f,f=d;break e}}else if(z.elementType===C||typeof C=="object"&&C!==null&&C.$$typeof===et&&Za(C)===z.type){n(f,z.sibling),d=l(z,v.props),d.ref=zn(f,z,v),d.return=f,f=d;break e}n(f,z);break}else t(f,z);z=z.sibling}v.type===$t?(d=Tt(v.props.children,f.mode,w,v.key),d.return=f,f=d):(w=Wr(v.type,v.key,v.props,null,f.mode,w),w.ref=zn(f,d,v),w.return=f,f=w)}return o(f);case Bt:e:{for(z=v.key;d!==null;){if(d.key===z)if(d.tag===4&&d.stateNode.containerInfo===v.containerInfo&&d.stateNode.implementation===v.implementation){n(f,d.sibling),d=l(d,v.children||[]),d.return=f,f=d;break e}else{n(f,d);break}else t(f,d);d=d.sibling}d=si(v,f.mode,w),d.return=f,f=d}return o(f);case et:return z=v._init,x(f,d,z(v._payload),w)}if(Tn(v))return y(f,d,v,w);if(kn(v))return E(f,d,v,w);zr(f,v)}return typeof v=="string"&&v!==""||typeof v=="number"?(v=""+v,d!==null&&d.tag===6?(n(f,d.sibling),d=l(d,v),d.return=f,f=d):(n(f,d),d=ui(v,f.mode,w),d.return=f,f=d),o(f)):n(f,d)}return x}var un=Gs(!0),Xs=Gs(!1),fr={},$e=wt(fr),er=wt(fr),tr=wt(fr);function Lt(e){if(e===fr)throw Error(k(174));return e}function Fo(e,t){switch(U(tr,t),U(er,e),U($e,fr),e=t.nodeType,e){case 9:case 11:t=(t=t.documentElement)?t.namespaceURI:Si(null,"");break;default:e=e===8?t.parentNode:t,t=e.namespaceURI||null,e=e.tagName,t=Si(t,e)}j($e),U($e,t)}function sn(){j($e),j(er),j(tr)}function Js(e){Lt(tr.current);var t=Lt($e.current),n=Si(t,e.type);t!==n&&(U(er,e),U($e,n))}function jo(e){er.current===e&&(j($e),j(er))}var B=wt(0);function ul(e){for(var t=e;t!==null;){if(t.tag===13){var n=t.memoizedState;if(n!==null&&(n=n.dehydrated,n===null||n.data==="$?"||n.data==="$!"))return t}else if(t.tag===19&&t.memoizedProps.revealOrder!==void 0){if(t.flags&128)return t}else if(t.child!==null){t.child.return=t,t=t.child;continue}if(t===e)break;for(;t.sibling===null;){if(t.return===null||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}var ni=[];function Ao(){for(var e=0;en?n:4,e(!0);var r=ri.transition;ri.transition={};try{e(!1),t()}finally{D=n,ri.transition=r}}function fc(){return _e().memoizedState}function Xf(e,t,n){var r=pt(e);if(n={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null},pc(e))mc(t,n);else if(n=Ws(e,t,n,r),n!==null){var l=se();De(n,e,r,l),hc(n,t,r)}}function Jf(e,t,n){var r=pt(e),l={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null};if(pc(e))mc(t,l);else{var i=e.alternate;if(e.lanes===0&&(i===null||i.lanes===0)&&(i=t.lastRenderedReducer,i!==null))try{var o=t.lastRenderedState,a=i(o,n);if(l.hasEagerState=!0,l.eagerState=a,Ue(a,o)){var u=t.interleaved;u===null?(l.next=l,Do(t)):(l.next=u.next,u.next=l),t.interleaved=l;return}}catch{}finally{}n=Ws(e,t,l,r),n!==null&&(l=se(),De(n,e,r,l),hc(n,t,r))}}function pc(e){var t=e.alternate;return e===$||t!==null&&t===$}function mc(e,t){An=sl=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function hc(e,t,n){if(n&4194240){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,So(e,n)}}var cl={readContext:ze,useCallback:le,useContext:le,useEffect:le,useImperativeHandle:le,useInsertionEffect:le,useLayoutEffect:le,useMemo:le,useReducer:le,useRef:le,useState:le,useDebugValue:le,useDeferredValue:le,useTransition:le,useMutableSource:le,useSyncExternalStore:le,useId:le,unstable_isNewReconciler:!1},Zf={readContext:ze,useCallback:function(e,t){return je().memoizedState=[e,t===void 0?null:t],e},useContext:ze,useEffect:ba,useImperativeHandle:function(e,t,n){return n=n!=null?n.concat([e]):null,Br(4194308,4,ac.bind(null,t,e),n)},useLayoutEffect:function(e,t){return Br(4194308,4,e,t)},useInsertionEffect:function(e,t){return Br(4,2,e,t)},useMemo:function(e,t){var n=je();return t=t===void 0?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var r=je();return t=n!==void 0?n(t):t,r.memoizedState=r.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},r.queue=e,e=e.dispatch=Xf.bind(null,$,e),[r.memoizedState,e]},useRef:function(e){var t=je();return e={current:e},t.memoizedState=e},useState:qa,useDebugValue:Wo,useDeferredValue:function(e){return je().memoizedState=e},useTransition:function(){var e=qa(!1),t=e[0];return e=Gf.bind(null,e[1]),je().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,n){var r=$,l=je();if(A){if(n===void 0)throw Error(k(407));n=n()}else{if(n=t(),ee===null)throw Error(k(349));It&30||bs(r,t,n)}l.memoizedState=n;var i={value:n,getSnapshot:t};return l.queue=i,ba(tc.bind(null,r,i,e),[e]),r.flags|=2048,lr(9,ec.bind(null,r,i,n,t),void 0,null),n},useId:function(){var e=je(),t=ee.identifierPrefix;if(A){var n=Ke,r=Qe;n=(r&~(1<<32-Ie(r)-1)).toString(32)+n,t=":"+t+"R"+n,n=nr++,0<\/script>",e=e.removeChild(e.firstChild)):typeof r.is=="string"?e=o.createElement(n,{is:r.is}):(e=o.createElement(n),n==="select"&&(o=e,r.multiple?o.multiple=!0:r.size&&(o.size=r.size))):e=o.createElementNS(e,n),e[Ae]=t,e[bn]=r,Nc(e,t,!1,!1),t.stateNode=e;e:{switch(o=Ci(n,r),n){case"dialog":F("cancel",e),F("close",e),l=r;break;case"iframe":case"object":case"embed":F("load",e),l=r;break;case"video":case"audio":for(l=0;ldn&&(t.flags|=128,r=!0,_n(i,!1),t.lanes=4194304)}else{if(!r)if(e=ul(o),e!==null){if(t.flags|=128,r=!0,n=e.updateQueue,n!==null&&(t.updateQueue=n,t.flags|=4),_n(i,!0),i.tail===null&&i.tailMode==="hidden"&&!o.alternate&&!A)return ie(t),null}else 2*Y()-i.renderingStartTime>dn&&n!==1073741824&&(t.flags|=128,r=!0,_n(i,!1),t.lanes=4194304);i.isBackwards?(o.sibling=t.child,t.child=o):(n=i.last,n!==null?n.sibling=o:t.child=o,i.last=o)}return i.tail!==null?(t=i.tail,i.rendering=t,i.tail=t.sibling,i.renderingStartTime=Y(),t.sibling=null,n=B.current,U(B,r?n&1|2:n&1),t):(ie(t),null);case 22:case 23:return Jo(),r=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==r&&(t.flags|=8192),r&&t.mode&1?ge&1073741824&&(ie(t),t.subtreeFlags&6&&(t.flags|=8192)):ie(t),null;case 24:return null;case 25:return null}throw Error(k(156,t.tag))}function ip(e,t){switch(Ro(t),t.tag){case 1:return he(t.type)&&tl(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return sn(),j(me),j(ae),Ao(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 5:return jo(t),null;case 13:if(j(B),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(k(340));an()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return j(B),null;case 4:return sn(),null;case 10:return Io(t.type._context),null;case 22:case 23:return Jo(),null;case 24:return null;default:return null}}var Lr=!1,oe=!1,op=typeof WeakSet=="function"?WeakSet:Set,N=null;function Jt(e,t){var n=e.ref;if(n!==null)if(typeof n=="function")try{n(null)}catch(r){W(e,t,r)}else n.current=null}function Ji(e,t,n){try{n()}catch(r){W(e,t,r)}}var uu=!1;function ap(e,t){if(Oi=Zr,e=Rs(),_o(e)){if("selectionStart"in e)var n={start:e.selectionStart,end:e.selectionEnd};else e:{n=(n=e.ownerDocument)&&n.defaultView||window;var r=n.getSelection&&n.getSelection();if(r&&r.rangeCount!==0){n=r.anchorNode;var l=r.anchorOffset,i=r.focusNode;r=r.focusOffset;try{n.nodeType,i.nodeType}catch{n=null;break e}var o=0,a=-1,u=-1,c=0,h=0,p=e,m=null;t:for(;;){for(var g;p!==n||l!==0&&p.nodeType!==3||(a=o+l),p!==i||r!==0&&p.nodeType!==3||(u=o+r),p.nodeType===3&&(o+=p.nodeValue.length),(g=p.firstChild)!==null;)m=p,p=g;for(;;){if(p===e)break t;if(m===n&&++c===l&&(a=o),m===i&&++h===r&&(u=o),(g=p.nextSibling)!==null)break;p=m,m=p.parentNode}p=g}n=a===-1||u===-1?null:{start:a,end:u}}else n=null}n=n||{start:0,end:0}}else n=null;for(Ii={focusedElem:e,selectionRange:n},Zr=!1,N=t;N!==null;)if(t=N,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,N=e;else for(;N!==null;){t=N;try{var y=t.alternate;if(t.flags&1024)switch(t.tag){case 0:case 11:case 15:break;case 1:if(y!==null){var E=y.memoizedProps,x=y.memoizedState,f=t.stateNode,d=f.getSnapshotBeforeUpdate(t.elementType===t.type?E:Te(t.type,E),x);f.__reactInternalSnapshotBeforeUpdate=d}break;case 3:var v=t.stateNode.containerInfo;v.nodeType===1?v.textContent="":v.nodeType===9&&v.documentElement&&v.removeChild(v.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(k(163))}}catch(w){W(t,t.return,w)}if(e=t.sibling,e!==null){e.return=t.return,N=e;break}N=t.return}return y=uu,uu=!1,y}function Bn(e,t,n){var r=t.updateQueue;if(r=r!==null?r.lastEffect:null,r!==null){var l=r=r.next;do{if((l.tag&e)===e){var i=l.destroy;l.destroy=void 0,i!==void 0&&Ji(t,n,i)}l=l.next}while(l!==r)}}function zl(e,t){if(t=t.updateQueue,t=t!==null?t.lastEffect:null,t!==null){var n=t=t.next;do{if((n.tag&e)===e){var r=n.create;n.destroy=r()}n=n.next}while(n!==t)}}function Zi(e){var t=e.ref;if(t!==null){var n=e.stateNode;switch(e.tag){case 5:e=n;break;default:e=n}typeof t=="function"?t(e):t.current=e}}function zc(e){var t=e.alternate;t!==null&&(e.alternate=null,zc(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[Ae],delete t[bn],delete t[Fi],delete t[Hf],delete t[Wf])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function _c(e){return e.tag===5||e.tag===3||e.tag===4}function su(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||_c(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function qi(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.nodeType===8?n.parentNode.insertBefore(e,t):n.insertBefore(e,t):(n.nodeType===8?(t=n.parentNode,t.insertBefore(e,n)):(t=n,t.appendChild(e)),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=el));else if(r!==4&&(e=e.child,e!==null))for(qi(e,t,n),e=e.sibling;e!==null;)qi(e,t,n),e=e.sibling}function bi(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(r!==4&&(e=e.child,e!==null))for(bi(e,t,n),e=e.sibling;e!==null;)bi(e,t,n),e=e.sibling}var te=null,Me=!1;function be(e,t,n){for(n=n.child;n!==null;)Lc(e,t,n),n=n.sibling}function Lc(e,t,n){if(Be&&typeof Be.onCommitFiberUnmount=="function")try{Be.onCommitFiberUnmount(El,n)}catch{}switch(n.tag){case 5:oe||Jt(n,t);case 6:var r=te,l=Me;te=null,be(e,t,n),te=r,Me=l,te!==null&&(Me?(e=te,n=n.stateNode,e.nodeType===8?e.parentNode.removeChild(n):e.removeChild(n)):te.removeChild(n.stateNode));break;case 18:te!==null&&(Me?(e=te,n=n.stateNode,e.nodeType===8?ei(e.parentNode,n):e.nodeType===1&&ei(e,n),Gn(e)):ei(te,n.stateNode));break;case 4:r=te,l=Me,te=n.stateNode.containerInfo,Me=!0,be(e,t,n),te=r,Me=l;break;case 0:case 11:case 14:case 15:if(!oe&&(r=n.updateQueue,r!==null&&(r=r.lastEffect,r!==null))){l=r=r.next;do{var i=l,o=i.destroy;i=i.tag,o!==void 0&&(i&2||i&4)&&Ji(n,t,o),l=l.next}while(l!==r)}be(e,t,n);break;case 1:if(!oe&&(Jt(n,t),r=n.stateNode,typeof r.componentWillUnmount=="function"))try{r.props=n.memoizedProps,r.state=n.memoizedState,r.componentWillUnmount()}catch(a){W(n,t,a)}be(e,t,n);break;case 21:be(e,t,n);break;case 22:n.mode&1?(oe=(r=oe)||n.memoizedState!==null,be(e,t,n),oe=r):be(e,t,n);break;default:be(e,t,n)}}function cu(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var n=e.stateNode;n===null&&(n=e.stateNode=new op),t.forEach(function(r){var l=vp.bind(null,e,r);n.has(r)||(n.add(r),r.then(l,l))})}}function Re(e,t){var n=t.deletions;if(n!==null)for(var r=0;rl&&(l=o),r&=~i}if(r=l,r=Y()-r,r=(120>r?120:480>r?480:1080>r?1080:1920>r?1920:3e3>r?3e3:4320>r?4320:1960*sp(r/1960))-r,10e?16:e,it===null)var r=!1;else{if(e=it,it=null,pl=0,I&6)throw Error(k(331));var l=I;for(I|=4,N=e.current;N!==null;){var i=N,o=i.child;if(N.flags&16){var a=i.deletions;if(a!==null){for(var u=0;uY()-Go?Rt(e,0):Yo|=n),ve(e,t)}function Fc(e,t){t===0&&(e.mode&1?(t=wr,wr<<=1,!(wr&130023424)&&(wr=4194304)):t=1);var n=se();e=Je(e,t),e!==null&&(sr(e,t,n),ve(e,n))}function hp(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),Fc(e,n)}function vp(e,t){var n=0;switch(e.tag){case 13:var r=e.stateNode,l=e.memoizedState;l!==null&&(n=l.retryLane);break;case 19:r=e.stateNode;break;default:throw Error(k(314))}r!==null&&r.delete(t),Fc(e,n)}var jc;jc=function(e,t,n){if(e!==null)if(e.memoizedProps!==t.pendingProps||me.current)pe=!0;else{if(!(e.lanes&n)&&!(t.flags&128))return pe=!1,rp(e,t,n);pe=!!(e.flags&131072)}else pe=!1,A&&t.flags&1048576&&$s(t,ll,t.index);switch(t.lanes=0,t.tag){case 2:var r=t.type;$r(e,t),e=t.pendingProps;var l=on(t,ae.current);nn(t,n),l=$o(null,t,r,e,l,n);var i=Vo();return t.flags|=1,typeof l=="object"&&l!==null&&typeof l.render=="function"&&l.$$typeof===void 0?(t.tag=1,t.memoizedState=null,t.updateQueue=null,he(r)?(i=!0,nl(t)):i=!1,t.memoizedState=l.state!==null&&l.state!==void 0?l.state:null,Uo(t),l.updater=xl,t.stateNode=l,l._reactInternals=t,Hi(t,r,e,n),t=Ki(null,t,r,!0,i,n)):(t.tag=0,A&&i&&Lo(t),ue(null,t,l,n),t=t.child),t;case 16:r=t.elementType;e:{switch($r(e,t),e=t.pendingProps,l=r._init,r=l(r._payload),t.type=r,l=t.tag=yp(r),e=Te(r,e),l){case 0:t=Qi(null,t,r,e,n);break e;case 1:t=iu(null,t,r,e,n);break e;case 11:t=ru(null,t,r,e,n);break e;case 14:t=lu(null,t,r,Te(r.type,e),n);break e}throw Error(k(306,r,""))}return t;case 0:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:Te(r,l),Qi(e,t,r,l,n);case 1:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:Te(r,l),iu(e,t,r,l,n);case 3:e:{if(Sc(t),e===null)throw Error(k(387));r=t.pendingProps,i=t.memoizedState,l=i.element,Qs(e,t),al(t,r,null,n);var o=t.memoizedState;if(r=o.element,i.isDehydrated)if(i={element:r,isDehydrated:!1,cache:o.cache,pendingSuspenseBoundaries:o.pendingSuspenseBoundaries,transitions:o.transitions},t.updateQueue.baseState=i,t.memoizedState=i,t.flags&256){l=cn(Error(k(423)),t),t=ou(e,t,r,n,l);break e}else if(r!==l){l=cn(Error(k(424)),t),t=ou(e,t,r,n,l);break e}else for(ye=ct(t.stateNode.containerInfo.firstChild),Ee=t,A=!0,Oe=null,n=Xs(t,null,r,n),t.child=n;n;)n.flags=n.flags&-3|4096,n=n.sibling;else{if(an(),r===l){t=Ze(e,t,n);break e}ue(e,t,r,n)}t=t.child}return t;case 5:return Js(t),e===null&&Bi(t),r=t.type,l=t.pendingProps,i=e!==null?e.memoizedProps:null,o=l.children,Di(r,l)?o=null:i!==null&&Di(r,i)&&(t.flags|=32),wc(e,t),ue(e,t,o,n),t.child;case 6:return e===null&&Bi(t),null;case 13:return kc(e,t,n);case 4:return Fo(t,t.stateNode.containerInfo),r=t.pendingProps,e===null?t.child=un(t,null,r,n):ue(e,t,r,n),t.child;case 11:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:Te(r,l),ru(e,t,r,l,n);case 7:return ue(e,t,t.pendingProps,n),t.child;case 8:return ue(e,t,t.pendingProps.children,n),t.child;case 12:return ue(e,t,t.pendingProps.children,n),t.child;case 10:e:{if(r=t.type._context,l=t.pendingProps,i=t.memoizedProps,o=l.value,U(il,r._currentValue),r._currentValue=o,i!==null)if(Ue(i.value,o)){if(i.children===l.children&&!me.current){t=Ze(e,t,n);break e}}else for(i=t.child,i!==null&&(i.return=t);i!==null;){var a=i.dependencies;if(a!==null){o=i.child;for(var u=a.firstContext;u!==null;){if(u.context===r){if(i.tag===1){u=Ye(-1,n&-n),u.tag=2;var c=i.updateQueue;if(c!==null){c=c.shared;var h=c.pending;h===null?u.next=u:(u.next=h.next,h.next=u),c.pending=u}}i.lanes|=n,u=i.alternate,u!==null&&(u.lanes|=n),$i(i.return,n,t),a.lanes|=n;break}u=u.next}}else if(i.tag===10)o=i.type===t.type?null:i.child;else if(i.tag===18){if(o=i.return,o===null)throw Error(k(341));o.lanes|=n,a=o.alternate,a!==null&&(a.lanes|=n),$i(o,n,t),o=i.sibling}else o=i.child;if(o!==null)o.return=i;else for(o=i;o!==null;){if(o===t){o=null;break}if(i=o.sibling,i!==null){i.return=o.return,o=i;break}o=o.return}i=o}ue(e,t,l.children,n),t=t.child}return t;case 9:return l=t.type,r=t.pendingProps.children,nn(t,n),l=ze(l),r=r(l),t.flags|=1,ue(e,t,r,n),t.child;case 14:return r=t.type,l=Te(r,t.pendingProps),l=Te(r.type,l),lu(e,t,r,l,n);case 15:return yc(e,t,t.type,t.pendingProps,n);case 17:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:Te(r,l),$r(e,t),t.tag=1,he(r)?(e=!0,nl(t)):e=!1,nn(t,n),Ys(t,r,l),Hi(t,r,l,n),Ki(null,t,r,!0,e,n);case 19:return Cc(e,t,n);case 22:return Ec(e,t,n)}throw Error(k(156,t.tag))};function Ac(e,t){return ds(e,t)}function gp(e,t,n,r){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function xe(e,t,n,r){return new gp(e,t,n,r)}function qo(e){return e=e.prototype,!(!e||!e.isReactComponent)}function yp(e){if(typeof e=="function")return qo(e)?1:0;if(e!=null){if(e=e.$$typeof,e===go)return 11;if(e===yo)return 14}return 2}function mt(e,t){var n=e.alternate;return n===null?(n=xe(e.tag,t,e.key,e.mode),n.elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.subtreeFlags=0,n.deletions=null),n.flags=e.flags&14680064,n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function Wr(e,t,n,r,l,i){var o=2;if(r=e,typeof e=="function")qo(e)&&(o=1);else if(typeof e=="string")o=5;else e:switch(e){case $t:return Tt(n.children,l,i,t);case vo:o=8,l|=8;break;case pi:return e=xe(12,n,t,l|2),e.elementType=pi,e.lanes=i,e;case mi:return e=xe(13,n,t,l),e.elementType=mi,e.lanes=i,e;case hi:return e=xe(19,n,t,l),e.elementType=hi,e.lanes=i,e;case Gu:return Ll(n,l,i,t);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case Ku:o=10;break e;case Yu:o=9;break e;case go:o=11;break e;case yo:o=14;break e;case et:o=16,r=null;break e}throw Error(k(130,e==null?e:typeof e,""))}return t=xe(o,n,t,l),t.elementType=e,t.type=r,t.lanes=i,t}function Tt(e,t,n,r){return e=xe(7,e,r,t),e.lanes=n,e}function Ll(e,t,n,r){return e=xe(22,e,r,t),e.elementType=Gu,e.lanes=n,e.stateNode={isHidden:!1},e}function ui(e,t,n){return e=xe(6,e,null,t),e.lanes=n,e}function si(e,t,n){return t=xe(4,e.children!==null?e.children:[],e.key,t),t.lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function Ep(e,t,n,r,l){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=Hl(0),this.expirationTimes=Hl(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=Hl(0),this.identifierPrefix=r,this.onRecoverableError=l,this.mutableSourceEagerHydrationData=null}function bo(e,t,n,r,l,i,o,a,u){return e=new Ep(e,t,n,a,u),t===1?(t=1,i===!0&&(t|=8)):t=0,i=xe(3,null,null,t),e.current=i,i.stateNode=e,i.memoizedState={element:r,isDehydrated:n,cache:null,transitions:null,pendingSuspenseBoundaries:null},Uo(i),e}function wp(e,t,n){var r=3"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(Hc)}catch(e){console.error(e)}}Hc(),$u.exports=Se;var xp=$u.exports,Wc,yu=xp;Wc=yu.createRoot,yu.hydrateRoot;/** - * @remix-run/router v1.7.2 - * - * Copyright (c) Remix Software Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE.md file in the root directory of this source tree. - * - * @license MIT - */function or(){return or=Object.assign?Object.assign.bind():function(e){for(var t=1;t"u")throw new Error(t)}function ra(e,t){if(!e){typeof console<"u"&&console.warn(t);try{throw new Error(t)}catch{}}}function zp(){return Math.random().toString(36).substr(2,8)}function wu(e,t){return{usr:e.state,key:e.key,idx:t}}function lo(e,t,n,r){return n===void 0&&(n=null),or({pathname:typeof e=="string"?e:e.pathname,search:"",hash:""},typeof t=="string"?hn(t):t,{state:n,key:t&&t.key||r||zp()})}function vl(e){let{pathname:t="/",search:n="",hash:r=""}=e;return n&&n!=="?"&&(t+=n.charAt(0)==="?"?n:"?"+n),r&&r!=="#"&&(t+=r.charAt(0)==="#"?r:"#"+r),t}function hn(e){let t={};if(e){let n=e.indexOf("#");n>=0&&(t.hash=e.substr(n),e=e.substr(0,n));let r=e.indexOf("?");r>=0&&(t.search=e.substr(r),e=e.substr(0,r)),e&&(t.pathname=e)}return t}function _p(e,t,n,r){r===void 0&&(r={});let{window:l=document.defaultView,v5Compat:i=!1}=r,o=l.history,a=ot.Pop,u=null,c=h();c==null&&(c=0,o.replaceState(or({},o.state,{idx:c}),""));function h(){return(o.state||{idx:null}).idx}function p(){a=ot.Pop;let x=h(),f=x==null?null:x-c;c=x,u&&u({action:a,location:E.location,delta:f})}function m(x,f){a=ot.Push;let d=lo(E.location,x,f);n&&n(d,x),c=h()+1;let v=wu(d,c),w=E.createHref(d);try{o.pushState(v,"",w)}catch(C){if(C instanceof DOMException&&C.name==="DataCloneError")throw C;l.location.assign(w)}i&&u&&u({action:a,location:E.location,delta:1})}function g(x,f){a=ot.Replace;let d=lo(E.location,x,f);n&&n(d,x),c=h();let v=wu(d,c),w=E.createHref(d);o.replaceState(v,"",w),i&&u&&u({action:a,location:E.location,delta:0})}function y(x){let f=l.location.origin!=="null"?l.location.origin:l.location.href,d=typeof x=="string"?x:vl(x);return G(f,"No window.location.(origin|href) available to create URL for href: "+d),new URL(d,f)}let E={get action(){return a},get location(){return e(l,o)},listen(x){if(u)throw new Error("A history only accepts one active listener");return l.addEventListener(Eu,p),u=x,()=>{l.removeEventListener(Eu,p),u=null}},createHref(x){return t(l,x)},createURL:y,encodeLocation(x){let f=y(x);return{pathname:f.pathname,search:f.search,hash:f.hash}},push:m,replace:g,go(x){return o.go(x)}};return E}var Su;(function(e){e.data="data",e.deferred="deferred",e.redirect="redirect",e.error="error"})(Su||(Su={}));function Lp(e,t,n){n===void 0&&(n="/");let r=typeof t=="string"?hn(t):t,l=la(r.pathname||"/",n);if(l==null)return null;let i=Qc(e);Rp(i);let o=null;for(let a=0;o==null&&a{let u={relativePath:a===void 0?i.path||"":a,caseSensitive:i.caseSensitive===!0,childrenIndex:o,route:i};u.relativePath.startsWith("/")&&(G(u.relativePath.startsWith(r),'Absolute route path "'+u.relativePath+'" nested under path '+('"'+r+'" is not valid. An absolute child route path ')+"must start with the combined path of all its parent routes."),u.relativePath=u.relativePath.slice(r.length));let c=ht([r,u.relativePath]),h=n.concat(u);i.children&&i.children.length>0&&(G(i.index!==!0,"Index routes must not have child routes. Please remove "+('all child routes from route path "'+c+'".')),Qc(i.children,t,h,c)),!(i.path==null&&!i.index)&&t.push({path:c,score:Fp(c,i.index),routesMeta:h})};return e.forEach((i,o)=>{var a;if(i.path===""||!((a=i.path)!=null&&a.includes("?")))l(i,o);else for(let u of Kc(i.path))l(i,o,u)}),t}function Kc(e){let t=e.split("/");if(t.length===0)return[];let[n,...r]=t,l=n.endsWith("?"),i=n.replace(/\?$/,"");if(r.length===0)return l?[i,""]:[i];let o=Kc(r.join("/")),a=[];return a.push(...o.map(u=>u===""?i:[i,u].join("/"))),l&&a.push(...o),a.map(u=>e.startsWith("/")&&u===""?"/":u)}function Rp(e){e.sort((t,n)=>t.score!==n.score?n.score-t.score:jp(t.routesMeta.map(r=>r.childrenIndex),n.routesMeta.map(r=>r.childrenIndex)))}const Tp=/^:\w+$/,Mp=3,Op=2,Ip=1,Dp=10,Up=-2,ku=e=>e==="*";function Fp(e,t){let n=e.split("/"),r=n.length;return n.some(ku)&&(r+=Up),t&&(r+=Op),n.filter(l=>!ku(l)).reduce((l,i)=>l+(Tp.test(i)?Mp:i===""?Ip:Dp),r)}function jp(e,t){return e.length===t.length&&e.slice(0,-1).every((r,l)=>r===t[l])?e[e.length-1]-t[t.length-1]:0}function Ap(e,t){let{routesMeta:n}=e,r={},l="/",i=[];for(let o=0;o{if(h==="*"){let m=a[p]||"";o=i.slice(0,i.length-m.length).replace(/(.)\/+$/,"$1")}return c[h]=Hp(a[p]||"",h),c},{}),pathname:i,pathnameBase:o,pattern:e}}function $p(e,t,n){t===void 0&&(t=!1),n===void 0&&(n=!0),ra(e==="*"||!e.endsWith("*")||e.endsWith("/*"),'Route path "'+e+'" will be treated as if it were '+('"'+e.replace(/\*$/,"/*")+'" because the `*` character must ')+"always follow a `/` in the pattern. To get rid of this warning, "+('please change the route path to "'+e.replace(/\*$/,"/*")+'".'));let r=[],l="^"+e.replace(/\/*\*?$/,"").replace(/^\/*/,"/").replace(/[\\.*+^$?{}|()[\]]/g,"\\$&").replace(/\/:(\w+)/g,(o,a)=>(r.push(a),"/([^\\/]+)"));return e.endsWith("*")?(r.push("*"),l+=e==="*"||e==="/*"?"(.*)$":"(?:\\/(.+)|\\/*)$"):n?l+="\\/*$":e!==""&&e!=="/"&&(l+="(?:(?=\\/|$))"),[new RegExp(l,t?void 0:"i"),r]}function Vp(e){try{return decodeURI(e)}catch(t){return ra(!1,'The URL path "'+e+'" could not be decoded because it is is a malformed URL segment. This is probably due to a bad percent '+("encoding ("+t+").")),e}}function Hp(e,t){try{return decodeURIComponent(e)}catch(n){return ra(!1,'The value for the URL param "'+t+'" will not be decoded because'+(' the string "'+e+'" is a malformed URL segment. This is probably')+(" due to a bad percent encoding ("+n+").")),e}}function la(e,t){if(t==="/")return e;if(!e.toLowerCase().startsWith(t.toLowerCase()))return null;let n=t.endsWith("/")?t.length-1:t.length,r=e.charAt(n);return r&&r!=="/"?null:e.slice(n)||"/"}function Wp(e,t){t===void 0&&(t="/");let{pathname:n,search:r="",hash:l=""}=typeof e=="string"?hn(e):e;return{pathname:n?n.startsWith("/")?n:Qp(n,t):t,search:Yp(r),hash:Gp(l)}}function Qp(e,t){let n=t.replace(/\/+$/,"").split("/");return e.split("/").forEach(l=>{l===".."?n.length>1&&n.pop():l!=="."&&n.push(l)}),n.length>1?n.join("/"):"/"}function ci(e,t,n,r){return"Cannot include a '"+e+"' character in a manually specified "+("`to."+t+"` field ["+JSON.stringify(r)+"]. Please separate it out to the ")+("`to."+n+"` field. Alternatively you may provide the full path as ")+'a string in and the router will parse it for you.'}function ia(e){return e.filter((t,n)=>n===0||t.route.path&&t.route.path.length>0)}function oa(e,t,n,r){r===void 0&&(r=!1);let l;typeof e=="string"?l=hn(e):(l=or({},e),G(!l.pathname||!l.pathname.includes("?"),ci("?","pathname","search",l)),G(!l.pathname||!l.pathname.includes("#"),ci("#","pathname","hash",l)),G(!l.search||!l.search.includes("#"),ci("#","search","hash",l)));let i=e===""||l.pathname==="",o=i?"/":l.pathname,a;if(r||o==null)a=n;else{let p=t.length-1;if(o.startsWith("..")){let m=o.split("/");for(;m[0]==="..";)m.shift(),p-=1;l.pathname=m.join("/")}a=p>=0?t[p]:"/"}let u=Wp(l,a),c=o&&o!=="/"&&o.endsWith("/"),h=(i||o===".")&&n.endsWith("/");return!u.pathname.endsWith("/")&&(c||h)&&(u.pathname+="/"),u}const ht=e=>e.join("/").replace(/\/\/+/g,"/"),Kp=e=>e.replace(/\/+$/,"").replace(/^\/*/,"/"),Yp=e=>!e||e==="?"?"":e.startsWith("?")?e:"?"+e,Gp=e=>!e||e==="#"?"":e.startsWith("#")?e:"#"+e;function Xp(e){return e!=null&&typeof e.status=="number"&&typeof e.statusText=="string"&&typeof e.internal=="boolean"&&"data"in e}const Yc=["post","put","patch","delete"];new Set(Yc);const Jp=["get",...Yc];new Set(Jp);/** - * React Router v6.14.2 - * - * Copyright (c) Remix Software Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE.md file in the root directory of this source tree. - * - * @license MIT - */function gl(){return gl=Object.assign?Object.assign.bind():function(e){for(var t=1;tu.pathnameBase)),o=S.useRef(!1);return Xc(()=>{o.current=!0}),S.useCallback(function(u,c){if(c===void 0&&(c={}),!o.current)return;if(typeof u=="number"){n.go(u);return}let h=oa(u,JSON.parse(i),l,c.relative==="path");e==null&&t!=="/"&&(h.pathname=h.pathname==="/"?t:ht([t,h.pathname])),(c.replace?n.replace:n.push)(h,c.state,c)},[t,n,i,l,e])}function Jc(e,t){let{relative:n}=t===void 0?{}:t,{matches:r}=S.useContext(kt),{pathname:l}=yn(),i=JSON.stringify(ia(r).map(o=>o.pathnameBase));return S.useMemo(()=>oa(e,JSON.parse(i),l,n==="path"),[e,i,l,n])}function em(e,t){return tm(e,t)}function tm(e,t,n){gn()||G(!1);let{navigator:r}=S.useContext(vn),{matches:l}=S.useContext(kt),i=l[l.length-1],o=i?i.params:{};i&&i.pathname;let a=i?i.pathnameBase:"/";i&&i.route;let u=yn(),c;if(t){var h;let E=typeof t=="string"?hn(t):t;a==="/"||(h=E.pathname)!=null&&h.startsWith(a)||G(!1),c=E}else c=u;let p=c.pathname||"/",m=a==="/"?p:p.slice(a.length)||"/",g=Lp(e,{pathname:m}),y=om(g&&g.map(E=>Object.assign({},E,{params:Object.assign({},o,E.params),pathname:ht([a,r.encodeLocation?r.encodeLocation(E.pathname).pathname:E.pathname]),pathnameBase:E.pathnameBase==="/"?a:ht([a,r.encodeLocation?r.encodeLocation(E.pathnameBase).pathname:E.pathnameBase])})),l,n);return t&&y?S.createElement(Il.Provider,{value:{location:gl({pathname:"/",search:"",hash:"",state:null,key:"default"},c),navigationType:ot.Pop}},y):y}function nm(){let e=cm(),t=Xp(e)?e.status+" "+e.statusText:e instanceof Error?e.message:JSON.stringify(e),n=e instanceof Error?e.stack:null,l={padding:"0.5rem",backgroundColor:"rgba(200,200,200, 0.5)"},i=null;return S.createElement(S.Fragment,null,S.createElement("h2",null,"Unexpected Application Error!"),S.createElement("h3",{style:{fontStyle:"italic"}},t),n?S.createElement("pre",{style:l},n):null,i)}const rm=S.createElement(nm,null);class lm extends S.Component{constructor(t){super(t),this.state={location:t.location,revalidation:t.revalidation,error:t.error}}static getDerivedStateFromError(t){return{error:t}}static getDerivedStateFromProps(t,n){return n.location!==t.location||n.revalidation!=="idle"&&t.revalidation==="idle"?{error:t.error,location:t.location,revalidation:t.revalidation}:{error:t.error||n.error,location:n.location,revalidation:t.revalidation||n.revalidation}}componentDidCatch(t,n){console.error("React Router caught the following error during render",t,n)}render(){return this.state.error?S.createElement(kt.Provider,{value:this.props.routeContext},S.createElement(Gc.Provider,{value:this.state.error,children:this.props.component})):this.props.children}}function im(e){let{routeContext:t,match:n,children:r}=e,l=S.useContext(aa);return l&&l.static&&l.staticContext&&(n.route.errorElement||n.route.ErrorBoundary)&&(l.staticContext._deepestRenderedBoundaryId=n.route.id),S.createElement(kt.Provider,{value:t},r)}function om(e,t,n){var r;if(t===void 0&&(t=[]),n===void 0&&(n=null),e==null){var l;if((l=n)!=null&&l.errors)e=n.matches;else return null}let i=e,o=(r=n)==null?void 0:r.errors;if(o!=null){let a=i.findIndex(u=>u.route.id&&(o==null?void 0:o[u.route.id]));a>=0||G(!1),i=i.slice(0,Math.min(i.length,a+1))}return i.reduceRight((a,u,c)=>{let h=u.route.id?o==null?void 0:o[u.route.id]:null,p=null;n&&(p=u.route.errorElement||rm);let m=t.concat(i.slice(0,c+1)),g=()=>{let y;return h?y=p:u.route.Component?y=S.createElement(u.route.Component,null):u.route.element?y=u.route.element:y=a,S.createElement(im,{match:u,routeContext:{outlet:a,matches:m,isDataRoute:n!=null},children:y})};return n&&(u.route.ErrorBoundary||u.route.errorElement||c===0)?S.createElement(lm,{location:n.location,revalidation:n.revalidation,component:p,error:h,children:g(),routeContext:{outlet:null,matches:m,isDataRoute:!0}}):g()},null)}var io;(function(e){e.UseBlocker="useBlocker",e.UseRevalidator="useRevalidator",e.UseNavigateStable="useNavigate"})(io||(io={}));var ar;(function(e){e.UseBlocker="useBlocker",e.UseLoaderData="useLoaderData",e.UseActionData="useActionData",e.UseRouteError="useRouteError",e.UseNavigation="useNavigation",e.UseRouteLoaderData="useRouteLoaderData",e.UseMatches="useMatches",e.UseRevalidator="useRevalidator",e.UseNavigateStable="useNavigate",e.UseRouteId="useRouteId"})(ar||(ar={}));function am(e){let t=S.useContext(aa);return t||G(!1),t}function um(e){let t=S.useContext(Zp);return t||G(!1),t}function sm(e){let t=S.useContext(kt);return t||G(!1),t}function Zc(e){let t=sm(),n=t.matches[t.matches.length-1];return n.route.id||G(!1),n.route.id}function cm(){var e;let t=S.useContext(Gc),n=um(ar.UseRouteError),r=Zc(ar.UseRouteError);return t||((e=n.errors)==null?void 0:e[r])}function dm(){let{router:e}=am(io.UseNavigateStable),t=Zc(ar.UseNavigateStable),n=S.useRef(!1);return Xc(()=>{n.current=!0}),S.useCallback(function(l,i){i===void 0&&(i={}),n.current&&(typeof l=="number"?e.navigate(l):e.navigate(l,gl({fromRouteId:t},i)))},[e,t])}function fm(e){let{to:t,replace:n,state:r,relative:l}=e;gn()||G(!1);let{matches:i}=S.useContext(kt),{pathname:o}=yn(),a=En(),u=oa(t,ia(i).map(h=>h.pathnameBase),o,l==="path"),c=JSON.stringify(u);return S.useEffect(()=>a(JSON.parse(c),{replace:n,state:r,relative:l}),[a,c,l,n,r]),null}function Ve(e){G(!1)}function pm(e){let{basename:t="/",children:n=null,location:r,navigationType:l=ot.Pop,navigator:i,static:o=!1}=e;gn()&&G(!1);let a=t.replace(/^\/*/,"/"),u=S.useMemo(()=>({basename:a,navigator:i,static:o}),[a,i,o]);typeof r=="string"&&(r=hn(r));let{pathname:c="/",search:h="",hash:p="",state:m=null,key:g="default"}=r,y=S.useMemo(()=>{let E=la(c,a);return E==null?null:{location:{pathname:E,search:h,hash:p,state:m,key:g},navigationType:l}},[a,c,h,p,m,g,l]);return y==null?null:S.createElement(vn.Provider,{value:u},S.createElement(Il.Provider,{children:n,value:y}))}function mm(e){let{children:t,location:n}=e;return em(oo(t),n)}var Cu;(function(e){e[e.pending=0]="pending",e[e.success=1]="success",e[e.error=2]="error"})(Cu||(Cu={}));new Promise(()=>{});function oo(e,t){t===void 0&&(t=[]);let n=[];return S.Children.forEach(e,(r,l)=>{if(!S.isValidElement(r))return;let i=[...t,l];if(r.type===S.Fragment){n.push.apply(n,oo(r.props.children,i));return}r.type!==Ve&&G(!1),!r.props.index||!r.props.children||G(!1);let o={id:r.props.id||i.join("-"),caseSensitive:r.props.caseSensitive,element:r.props.element,Component:r.props.Component,index:r.props.index,path:r.props.path,loader:r.props.loader,action:r.props.action,errorElement:r.props.errorElement,ErrorBoundary:r.props.ErrorBoundary,hasErrorBoundary:r.props.ErrorBoundary!=null||r.props.errorElement!=null,shouldRevalidate:r.props.shouldRevalidate,handle:r.props.handle,lazy:r.props.lazy};r.props.children&&(o.children=oo(r.props.children,i)),n.push(o)}),n}/** - * React Router DOM v6.14.2 - * - * Copyright (c) Remix Software Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE.md file in the root directory of this source tree. - * - * @license MIT - */function ao(){return ao=Object.assign?Object.assign.bind():function(e){for(var t=1;t=0)&&(n[l]=e[l]);return n}function vm(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}function gm(e,t){return e.button===0&&(!t||t==="_self")&&!vm(e)}const ym=["onClick","relative","reloadDocument","replace","state","target","to","preventScrollReset"],Em="startTransition",Nu=wd[Em];function wm(e){let{basename:t,children:n,future:r,window:l}=e,i=S.useRef();i.current==null&&(i.current=Pp({window:l,v5Compat:!0}));let o=i.current,[a,u]=S.useState({action:o.action,location:o.location}),{v7_startTransition:c}=r||{},h=S.useCallback(p=>{c&&Nu?Nu(()=>u(p)):u(p)},[u,c]);return S.useLayoutEffect(()=>o.listen(h),[o,h]),S.createElement(pm,{basename:t,children:n,location:a.location,navigationType:a.action,navigator:o})}const Sm=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u",km=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,Mr=S.forwardRef(function(t,n){let{onClick:r,relative:l,reloadDocument:i,replace:o,state:a,target:u,to:c,preventScrollReset:h}=t,p=hm(t,ym),{basename:m}=S.useContext(vn),g,y=!1;if(typeof c=="string"&&km.test(c)&&(g=c,Sm))try{let d=new URL(window.location.href),v=c.startsWith("//")?new URL(d.protocol+c):new URL(c),w=la(v.pathname,m);v.origin===d.origin&&w!=null?c=w+v.search+v.hash:y=!0}catch{}let E=qp(c,{relative:l}),x=Cm(c,{replace:o,state:a,target:u,preventScrollReset:h,relative:l});function f(d){r&&r(d),d.defaultPrevented||x(d)}return S.createElement("a",ao({},p,{href:g||E,onClick:y||i?r:f,ref:n,target:u}))});var xu;(function(e){e.UseScrollRestoration="useScrollRestoration",e.UseSubmit="useSubmit",e.UseSubmitFetcher="useSubmitFetcher",e.UseFetcher="useFetcher"})(xu||(xu={}));var Pu;(function(e){e.UseFetchers="useFetchers",e.UseScrollRestoration="useScrollRestoration"})(Pu||(Pu={}));function Cm(e,t){let{target:n,replace:r,state:l,preventScrollReset:i,relative:o}=t===void 0?{}:t,a=En(),u=yn(),c=Jc(e,{relative:o});return S.useCallback(h=>{if(gm(h,n)){h.preventDefault();let p=r!==void 0?r:vl(u)===vl(c);a(e,{replace:p,state:l,preventScrollReset:i,relative:o})}},[u,a,c,r,l,n,e,i,o])}var qc={color:void 0,size:void 0,className:void 0,style:void 0,attr:void 0},zu=s.createContext&&s.createContext(qc),vt=globalThis&&globalThis.__assign||function(){return vt=Object.assign||function(e){for(var t,n=1,r=arguments.length;n()=>{l.current&&clearTimeout(l.current)},[]);const i=En(),o=()=>{r(!0),t("Alert Sent! Officer Notified"),l.current=setTimeout(()=>t("Officer En Route (ETA: 2 min)"),2e3),l.current=setTimeout(()=>{t("Help Arrived"),r(!1)},6e3)};return s.createElement("div",{className:"safe-area"},s.createElement("header",{className:"header-row"},s.createElement("div",{style:{display:"flex",alignItems:"center"}},s.createElement("img",{src:"/assets/icon.png",alt:"icon",style:{width:32,height:32,marginRight:8},onError:a=>{a.target.onerror=null,a.target.style.display="none"}}),s.createElement(yl,{size:28,color:"#E53935",style:{marginRight:8}}),s.createElement("div",{className:"header-title"},"AI Police Alert")),s.createElement("button",{className:"header-icon"},s.createElement(ua,{size:18,color:"#222"}))),s.createElement("div",{className:`status-bar ${n?"panic":""}`},s.createElement("div",{style:{marginRight:8}},n?s.createElement(Qr,{size:18,color:"#E53935"}):s.createElement(Qr,{size:18,color:"#3ecf4a"})),s.createElement("div",{className:`status-text ${n?"panic":""}`},e)),s.createElement("div",{className:"sos-container"},s.createElement("button",{className:`sos-button ${n?"active":""}`,onClick:o,disabled:n},s.createElement(Qr,{size:56,color:n?"#E53935":"#fff"}),s.createElement("div",{className:`sos-text ${n?"active":""}`},"PANIC")),s.createElement("div",{className:"sos-subtext"},n?"Alert in progress...":"Tap to send instant police alert.")),s.createElement("div",{className:"quick-actions-section"},s.createElement("div",{className:"quick-actions-title"},"Quick Actions"),s.createElement("div",{className:"quick-actions-grid"},s.createElement("div",{className:"quick-action-box",role:"button",tabIndex:0,onClick:()=>i("/chat"),onKeyDown:a=>{a.key==="Enter"&&i("/chat")},"aria-label":"Open AI Chat Assistant"},s.createElement(ed,{size:28,color:"#E53935"}),s.createElement("div",{className:"quick-action-label"},"AI Chat Assistant")),s.createElement("div",{className:"quick-action-box",role:"button",tabIndex:0,onClick:()=>i("/location"),onKeyDown:a=>{a.key==="Enter"&&i("/location")},"aria-label":"Open Live GPS Map"},s.createElement(td,{size:28,color:"#E53935"}),s.createElement("div",{className:"quick-action-label"},"Live GPS Map"))),s.createElement("div",{className:"quick-actions-grid"},s.createElement("div",{className:"quick-action-box",role:"button",tabIndex:0,onClick:()=>i("/alerts"),onKeyDown:a=>{a.key==="Enter"&&i("/alerts")},"aria-label":"View Recent Alerts"},s.createElement(Rm,{size:28,color:"#E53935"}),s.createElement("div",{className:"quick-action-label"},"Recent Alerts")),s.createElement("div",{className:"quick-action-box",role:"button",tabIndex:0,onClick:()=>i("/alerts"),onKeyDown:a=>{a.key==="Enter"&&i("/alerts")},"aria-label":"Safety and Research"},s.createElement(yl,{size:26,color:"#E53935"}),s.createElement("div",{className:"quick-action-label"},"Safety & Research")))))}function Um(e){return H({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M504 256C504 119 393 8 256 8S8 119 8 256c0 123.78 90.69 226.38 209.25 245V327.69h-63V256h63v-54.64c0-62.15 37-96.48 93.67-96.48 27.14 0 55.52 4.84 55.52 4.84v61h-31.28c-30.8 0-40.41 19.12-40.41 38.73V256h68.78l-11 71.69h-57.78V501C413.31 482.38 504 379.78 504 256z"}}]})(e)}function Fm(e){return H({tag:"svg",attr:{viewBox:"0 0 488 512"},child:[{tag:"path",attr:{d:"M488 261.8C488 403.3 391.1 504 248 504 110.8 504 0 393.2 0 256S110.8 8 248 8c66.8 0 123 24.5 166.3 64.9l-67.5 64.9C258.5 52.6 94.3 116.6 94.3 256c0 86.5 69.1 156.6 153.7 156.6 98.2 0 135-70.4 140.8-106.9H248v-85.3h236.1c2.3 12.7 3.9 24.9 3.9 41.4z"}}]})(e)}function jm(e){return H({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M512 144v288c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V144c0-26.5 21.5-48 48-48h88l12.3-32.9c7-18.7 24.9-31.1 44.9-31.1h125.5c20 0 37.9 12.4 44.9 31.1L376 96h88c26.5 0 48 21.5 48 48zM376 288c0-66.2-53.8-120-120-120s-120 53.8-120 120 53.8 120 120 120 120-53.8 120-120zm-32 0c0 48.5-39.5 88-88 88s-88-39.5-88-88 39.5-88 88-88 88 39.5 88 88z"}}]})(e)}function Mu(e){return H({tag:"svg",attr:{viewBox:"0 0 576 512"},child:[{tag:"path",attr:{d:"M336.2 64H47.8C21.4 64 0 85.4 0 111.8v288.4C0 426.6 21.4 448 47.8 448h288.4c26.4 0 47.8-21.4 47.8-47.8V111.8c0-26.4-21.4-47.8-47.8-47.8zm189.4 37.7L416 177.3v157.4l109.6 75.5c21.2 14.6 50.4-.3 50.4-25.8V127.5c0-25.4-29.1-40.4-50.4-25.8z"}}]})(e)}function Am(){const[e,t]=S.useState(!1),n=En(),[r,l]=S.useState(""),[i,o]=S.useState(""),[a,u]=S.useState(null),[c,h]=S.useState(!1),p=async m=>{if(m&&typeof m.preventDefault=="function"&&m.preventDefault(),u(null),!r||!i){u("Enter username/email and password");return}const g=typeof import.meta<"u"&&{BASE_URL:"/",MODE:"production",DEV:!1,PROD:!0,SSR:!1}&&{}.VITE_API_URL||typeof process<"u"&&process.env&&{}.REACT_APP_API_URL||"http://localhost:4000";h(!0);try{const y=String(g).replace(/\/$/,""),E=await fetch(y+"/api/login",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:r,password:i})}),x=await E.json();if(!E.ok){u(x.message||"Login failed"),h(!1);return}localStorage.setItem("authUser",JSON.stringify({token:x.token,...x.user})),n("/home",{replace:!0})}catch(y){u("API error: "+(y.message||y))}finally{h(!1)}};return s.createElement("div",{className:"login-screen auth-screen"},s.createElement("div",{className:"header",style:{paddingTop:30,paddingBottom:20,textAlign:"center"}},s.createElement("div",{style:{fontSize:40,color:"red"}},s.createElement(yl,{size:26,color:"#E53935"})),s.createElement("div",{style:{fontSize:28,fontWeight:"700",color:"#300"}},"ShieldX"),s.createElement("div",{style:{fontSize:14,color:"#800",marginTop:4}},"Instant Police Alerts")),s.createElement("form",{style:{padding:10},onSubmit:p},a&&s.createElement("div",{style:{color:"red",marginBottom:8}},a),s.createElement("input",{name:"id",className:"input",placeholder:"Email or Username",value:r,onChange:m=>l(m.target.value)}),s.createElement("input",{name:"password",className:"input",placeholder:"Password",type:"password",value:i,onChange:m=>o(m.target.value)}),s.createElement("div",{className:"remember-row"},s.createElement("label",{style:{display:"flex",alignItems:"center",gap:8}},s.createElement("input",{type:"checkbox",checked:e,onChange:()=>t(!e)}),s.createElement("span",{style:{color:"#555"}},"Remember me")),s.createElement("button",{type:"button",className:"forgot"},"Forgot password?")),s.createElement("button",{className:"login-btn",type:"submit",disabled:c},c?"Logging in...":"Log In"),s.createElement("div",{className:"divider-row"},s.createElement("div",{className:"divider"}),s.createElement("div",{className:"or-text"},"Or continue with"),s.createElement("div",{className:"divider"})),s.createElement("div",{className:"social-row"},s.createElement("button",{type:"button",className:"social-btn"},s.createElement(Fm,{style:{marginRight:8}})," Google"),s.createElement("button",{type:"button",className:"social-btn"},s.createElement(Um,{style:{marginRight:8}})," Facebook")),s.createElement("div",{style:{textAlign:"center",marginTop:12}},s.createElement("button",{className:"link",type:"button",onClick:()=>n("/Signup")},"Don't have an account? ",s.createElement("span",{style:{color:"red"}},"Sign Up")))))}function Bm(){const[e,t]=S.useState(""),[n,r]=S.useState(""),[l,i]=S.useState(""),[o,a]=S.useState(null),[u,c]=S.useState(!1),h=En(),p=async m=>{if(m&&typeof m.preventDefault=="function"&&m.preventDefault(),a(null),!n||!l){a("Please enter email and password");return}const g=typeof import.meta<"u"&&{BASE_URL:"/",MODE:"production",DEV:!1,PROD:!0,SSR:!1}&&{}.VITE_API_URL||typeof process<"u"&&process.env&&{}.REACT_APP_API_URL||"http://localhost:4000";c(!0);try{const y=String(g).replace(/\/$/,""),E=await fetch(y+"/api/register",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:n,password:l,name:e})}),x=await E.json();if(!E.ok){a(x.message||"Signup failed"),c(!1);return}const f=await fetch(y+"/api/login",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:n,password:l})}),d=await f.json();if(!f.ok){a(d.message||"Auto-login failed"),c(!1),h("/login");return}localStorage.setItem("authUser",JSON.stringify({token:d.token,username:n,name:e||n&&n.split&&n.split("@")[0]})),h("/home",{replace:!0})}catch(y){a("API error: "+(y.message||y))}finally{c(!1)}};return s.createElement("div",{className:"signup-screen auth-screen"},s.createElement("button",{className:"back-btn",onClick:()=>window.history.back()},"←"),s.createElement("div",{style:{textAlign:"center"}},s.createElement("h2",{style:{margin:"12px 0"}},"Sign Up")),s.createElement("div",{style:{textAlign:"center",marginBottom:16}},s.createElement("div",{style:{display:"inline-block",background:"#ffe5e5",borderRadius:50,padding:20}},"ℹ️")),s.createElement("form",{style:{padding:10},onSubmit:p},o&&s.createElement("div",{style:{color:"red",marginBottom:8}},o),s.createElement("input",{name:"fullName",autoComplete:"name",className:"input",placeholder:"Full Name",value:e,onChange:m=>t(m.target.value)}),s.createElement("input",{name:"email",type:"email",autoComplete:"email",className:"input",placeholder:"Email",value:n,onChange:m=>r(m.target.value)}),s.createElement("input",{name:"password",type:"password",autoComplete:"new-password",className:"input",placeholder:"Password",value:l,onChange:m=>i(m.target.value)}),s.createElement("button",{className:"signup-btn",type:"submit",disabled:u},u?"Signing up...":"Sign Up"),s.createElement("div",{className:"dividerContainer"},s.createElement("div",{className:"line"}),s.createElement("div",{className:"orText"},"Or sign up with"),s.createElement("div",{className:"line"})),s.createElement("div",{className:"socialContainer"},s.createElement("button",{type:"button",className:"socialBtn"},"Google"),s.createElement("button",{type:"button",className:"socialBtn"},"Facebook")),s.createElement("div",{style:{textAlign:"center",marginTop:12}},s.createElement("button",{className:"link",type:"button",onClick:()=>h("/login")},"Already have an account? ",s.createElement("span",{style:{color:"red"}},"Sign In")))))}function $m({}){const[e,t]=S.useState([{id:"1",sender:"ai",text:"Hello, I'm your AI assistant. How can I help you today?"}]),[n,r]=S.useState(""),[l,i]=S.useState(!1),o=S.useRef(null);S.useEffect(()=>{a()},[]);const a=()=>{var c;(c=o.current)==null||c.scrollIntoView({behavior:"smooth"})},u=async()=>{if(!n.trim()||l)return;const c={id:Date.now().toString(),sender:"user",text:n};t(m=>[...m,c]),r(""),i(!0),setTimeout(a,100);let h="";const p=c.text.toLowerCase();/panic|sos|urgent|immediate|danger|attack|assault|robbery|theft|violence|shooting|gun|weapon/.test(p)?h="Emergency detected. Are you in immediate danger? Please confirm your safety and share your location.":/crime|report|help|emergency|police|officer|911/.test(p)?h="Please provide details about the incident, including your location, type of crime, and any injuries.":/location|where|address|gps|map/.test(p)?h="Can you share your current location or describe where the incident occurred? You can also use the Live GPS Map feature.":/injur|hurt|medical|ambulance|doctor/.test(p)?h="If anyone is injured, please describe the injuries and if medical help is needed. Emergency services can be dispatched.":/officer|response|eta|arrive|coming/.test(p)?h="An officer is being dispatched. You will receive live updates on their location and estimated arrival time.":/thank|thanks|grateful|appreciate/.test(p)?h="You are welcome. Stay safe! If you need further help, just type your question.":/cancel|mistake|false alarm/.test(p)?h="If this was a false alarm, please confirm so we can update the response team.":h="I'm here to assist you with emergencies, police alerts, and safety information. Please describe your situation or question.",setTimeout(()=>{t(m=>[...m,{id:Date.now().toString(),sender:"ai",text:h}]),i(!1),setTimeout(a,100)},1200)};return s.createElement("div",{className:"chat-screen"},s.createElement("header",{className:"chat-header"},s.createElement("button",{className:"back-btn",onClick:()=>window.history.back(),"aria-label":"back"},"←"),s.createElement("div",{className:"chat-title"},"AI Assistant"),s.createElement("div",{style:{width:40}})),s.createElement("div",{className:"avatar-row"},s.createElement("div",{className:"avatar-circle"},s.createElement("img",{src:"/assets/icon.png",alt:"avatar",style:{width:56,height:56,borderRadius:28},onError:c=>{c.target.onerror=null,c.target.style.display="none"}}),s.createElement(di,{size:36}),s.createElement("div",{className:"avatar-status"}))),s.createElement("div",{className:"chat-area"},e.map(c=>s.createElement("div",{key:c.id,className:`bubble-row ${c.sender==="user"?"user":"ai"}`},c.sender==="ai"&&s.createElement("div",{className:"bubble-avatar"},s.createElement(di,{size:20})),s.createElement("div",{className:c.sender==="ai"?"bubble-left":"bubble-right"},c.sender==="ai"&&s.createElement("div",{className:"bubble-sender"},"AI Assistant"),s.createElement("div",{className:c.sender==="ai"?"bubble-text":"bubble-text-user"},c.text)),c.sender==="user"&&s.createElement("div",{className:"bubble-avatar-user"},s.createElement(di,{size:20})))),l&&s.createElement("div",{className:"typing-indicator"},s.createElement("div",{className:"spinner"}),s.createElement("div",{className:"typing-text"},"AI is typing...")),s.createElement("div",{ref:o})),s.createElement("div",{className:"input-bar"},s.createElement("input",{className:"chat-input",placeholder:"Type a message...",value:n,onChange:c=>r(c.target.value),onKeyDown:c=>{c.key==="Enter"&&u()},disabled:l}),s.createElement("button",{className:"input-mic",disabled:!0},"🎤"),s.createElement("button",{className:"input-send",onClick:u,disabled:l||!n.trim()},s.createElement(Im,{color:"#fff",size:20}))))}const Vm=[{id:"1",name:"Police Station",address:"Sector 21, Main Road"},{id:"2",name:"Hospital",address:"City Hospital, Block B"},{id:"3",name:"Your Last Location",address:"Park Avenue, Sector 17"}],Hm=[{id:"1",name:"Police",phone:"100"},{id:"2",name:"Ambulance",phone:"102"},{id:"3",name:"Fire",phone:"101"}];function Wm(){const[e,t]=S.useState(""),[n,r]=S.useState("No active alert"),l=()=>{r("Officer dispatched (ETA: 2 min)"),window.alert(`Police Alert Sent -An officer is being dispatched to your location.`),setTimeout(()=>r("Officer en route (ETA: 1 min)"),2e3),setTimeout(()=>r("Officer arrived"),6e3)},i=()=>{window.open("https://maps.google.com","_blank")},o=a=>window.alert(`Call ${a}`);return s.createElement("div",{className:"location-screen"},s.createElement("header",{className:"header-row"},s.createElement("div",{className:"header-title"},"Location"),s.createElement("button",{className:"header-icon"},s.createElement(ua,{size:18,color:"#222"}))),s.createElement("div",{className:"search-bar"},s.createElement("input",{className:"search-input",placeholder:"Search places or address...",value:e,onChange:a=>t(a.target.value)})),s.createElement("div",{className:"map-view"},s.createElement("div",{style:{textAlign:"center"}},s.createElement(Lu,{size:64,color:"#E53935"}),s.createElement("div",{style:{color:"#888",fontSize:16,marginTop:8}},"Map placeholder for web. Use mobile app for live map features."))),s.createElement("div",{className:`status-bar ${n!=="No active alert"?"alert":""}`},s.createElement("div",{style:{marginRight:8}},"🛡️"),s.createElement("div",{className:"status-text"},n)),s.createElement("div",{className:"action-row"},s.createElement("button",{className:"action-btn",onClick:i},"Share Location"),s.createElement("button",{className:"action-btn",onClick:()=>window.open("https://www.google.com/maps","_blank")},"Directions"),s.createElement("button",{className:"action-btn alt",onClick:l},"Police Alert")),s.createElement("div",{className:"emergency-section"},s.createElement("div",{className:"list-title"},"Emergency Contacts"),s.createElement("div",{className:"emergency-row"},Hm.map(a=>s.createElement("button",{key:a.id,className:"emergency-btn",onClick:()=>o(a.phone)},s.createElement("div",{style:{fontSize:20,color:"#E53935"}},s.createElement(Mm,null)),s.createElement("div",{className:"emergency-btn-text"},a.name))))),s.createElement("div",{className:"list-section"},s.createElement("div",{className:"list-title"},"Nearby & Recent Locations"),Vm.map(a=>s.createElement("div",{key:a.id,className:"list-item"},s.createElement("div",{style:{marginRight:12,fontSize:20,color:"#E53935"}},s.createElement(Lu,null)),s.createElement("div",null,s.createElement("div",{className:"list-item-name"},a.name),s.createElement("div",{className:"list-item-address"},a.address))))))}function Qm({center:e,onDispatch:t=()=>{},onClose:n=()=>{}}){const r={lat:28.70406,lon:77.102493},[l,i]=S.useState(r),[o,a]=S.useState([]),[u,c]=S.useState(null);S.useEffect(()=>{if(e)if(typeof e=="string"&&e.includes(",")){const[p,m]=e.split(",").map(g=>parseFloat(g.trim()));!Number.isNaN(p)&&!Number.isNaN(m)&&i({lat:p,lon:m})}else e.lat&&e.lon&&i(e)},[e]),S.useEffect(()=>{e||navigator.geolocation&&navigator.geolocation.getCurrentPosition(p=>{const{latitude:m,longitude:g}=p.coords;i({lat:m,lon:g})},()=>{},{timeout:8e3})},[e]),S.useEffect(()=>{const p=l,g=[{dLat:.0012,dLon:8e-4},{dLat:-9e-4,dLon:.001},{dLat:6e-4,dLon:-.0011},{dLat:-.0015,dLon:-6e-4},{dLat:.0018,dLon:-3e-4}].map((y,E)=>{const x=p.lat+y.dLat,f=p.lon+y.dLon;return{id:`U-${E+1}`,name:`Unit ${E+1}`,lat:x,lon:f,eta:`${2+E} min`,distanceKm:Math.abs(y.dLat*111).toFixed(2)}});a(g)},[l]);const h=(p,m)=>{const g=p-l.lat,y=m-l.lon,E=50-g/.002*50,x=50+y/.002*50;return{top:`${Math.max(6,Math.min(94,E))}%`,left:`${Math.max(6,Math.min(94,x))}%`}};return s.createElement("div",{className:"map-panel"},s.createElement("div",{className:"map-panel-header"},s.createElement("div",{style:{fontWeight:700}},"Nearby Police Units"),s.createElement("div",{style:{display:"flex",gap:8,alignItems:"center"}},s.createElement("button",{className:"btn small",onClick:()=>{c(null),n()}},"Close"))),s.createElement("div",{className:"map-panel-body"},s.createElement("div",{className:"map-area",role:"img","aria-label":"Mock map showing nearby police units"},o.map(p=>{const m=h(p.lat,p.lon),g=u&&u.id===p.id;return s.createElement("button",{key:p.id,className:`marker ${g?"selected":""}`,style:{top:m.top,left:m.left},onClick:()=>c(p),title:`${p.name} — ${p.distanceKm} km — ETA ${p.eta}`,"aria-label":`${p.name}, distance ${p.distanceKm} kilometers`},s.createElement("div",{className:"marker-dot"}))}),s.createElement("div",{className:"center-dot",style:{top:"50%",left:"50%"},title:"Your location"})),s.createElement("div",{className:"unit-list"},s.createElement("div",{className:"unit-list-title"},"Units"),o.map(p=>s.createElement("div",{key:p.id,className:`unit-item ${u&&u.id===p.id?"active":""}`,onClick:()=>c(p),role:"button",tabIndex:0,onKeyDown:m=>{m.key==="Enter"&&c(p)}},s.createElement("div",null,s.createElement("div",{style:{fontWeight:700}},p.name),s.createElement("div",{style:{color:"#666",fontSize:13}},p.distanceKm," km • ETA ",p.eta)),s.createElement("div",null,s.createElement("button",{className:"btn tiny",onClick:m=>{m.stopPropagation(),t(p),window.alert(`Dispatch requested to ${p.name} (simulation)`)}},"Dispatch")))),u&&s.createElement("div",{className:"selected-details"},s.createElement("div",{style:{fontWeight:700,marginBottom:6}},u.name),s.createElement("div",{style:{color:"#666",marginBottom:8}},u.distanceKm," km away • ETA ",u.eta),s.createElement("div",{style:{display:"flex",gap:8}},s.createElement("button",{className:"btn",onClick:()=>{t(u),window.alert("Dispatch requested (simulation)")}},"Dispatch"),s.createElement("button",{className:"btn outline",onClick:()=>c(null)},"Deselect"))))))}function Km(){const[e,t]=S.useState("online"),[n,r]=S.useState([]),l=()=>{const g=Date.now().toString(),y=new Date().toLocaleString();r(E=>[{id:g,time:y,type:"Panic",details:"Demo: Panic pressed at Park Avenue."},...E])},[i,o]=S.useState(null),a=()=>{if(!navigator.geolocation){window.alert("Geolocation is not supported in this browser.");return}navigator.geolocation.getCurrentPosition(g=>{const{latitude:y,longitude:E}=g.coords,x=`${y.toFixed(6)}, ${E.toFixed(6)}`,f=Date.now().toString(),d=new Date().toLocaleString();r(v=>[{id:f,time:d,type:"Location Share",details:`Shared location: ${x}`},...v]),o(x),window.alert("Location shared: "+x)},g=>{window.alert("Unable to get location: "+((g==null?void 0:g.message)||"error"))},{enableHighAccuracy:!0,timeout:1e4})},u=()=>{t(e==="online"?"offline":e==="offline"?"mesh":"online")},c=()=>{r([]),t("online"),window.alert(`Alerts Sent -All queued alerts have been sent to authorities.`)},[h,p]=S.useState(!1),m=g=>{const y=Date.now().toString(),E=new Date().toLocaleString();r(x=>[{id:y,time:E,type:"Dispatch",details:`Dispatch requested to ${g.name} (ETA ${g.eta})`},...x])};return s.createElement("div",{className:"alerts-screen"},s.createElement("header",{className:"header-row"},s.createElement("div",{style:{display:"flex",alignItems:"center",gap:12}},s.createElement("div",{className:"header-title"},"Alert System"),s.createElement("div",{className:`status-pill ${e}`},e==="online"?"Online":e==="mesh"?"Mesh":"Offline")),s.createElement("div",{style:{display:"flex",alignItems:"center",gap:8}},s.createElement("button",{className:"icon-btn",title:"Toggle status",onClick:u},s.createElement(ua,{size:18})))),s.createElement("div",{className:`status-card ${e}`},s.createElement("div",{style:{display:"flex",alignItems:"center",gap:12}},s.createElement("div",{className:"status-icon"},e==="online"?s.createElement(Dm,{size:22,color:"#3ecf4a"}):e==="mesh"?s.createElement(Ru,{size:22,color:"#1976d2"}):s.createElement(Lm,{size:22,color:"#E53935"})),s.createElement("div",null,s.createElement("div",{style:{fontWeight:"700",fontSize:16,color:"#222"}},e==="online"?"Online":e==="mesh"?"Mesh Fallback":"Offline"),s.createElement("div",{style:{color:"#444",marginTop:6}},e==="online"&&"All alerts are sent instantly to authorities.",e==="offline"&&"No internet. Alerts will be queued and sent via SMS or mesh when possible.",e==="mesh"&&"Mesh fallback active. Alerts are relayed via nearby users/devices."))),s.createElement("div",{className:"alert-controls"},s.createElement("button",{className:"btn",onClick:l},s.createElement(_u,{style:{marginRight:8}}),"Push Demo Alert"),s.createElement("button",{className:"btn outline",onClick:()=>window.alert("Test alert sent (simulation)")},"Send Test Alert"))),h&&s.createElement(Qm,{center:i,onDispatch:g=>{m(g)},onClose:()=>p(!1)}),s.createElement("div",{className:"queued-section"},s.createElement("div",{className:"queued-header"},s.createElement("div",{className:"queued-title"},"Queued Alerts"),s.createElement("div",{className:"queued-actions"},s.createElement("button",{className:"btn small",onClick:()=>r([])},"Clear"),s.createElement("button",{className:"btn small primary",onClick:c,disabled:n.length===0},s.createElement(_u,null)))),n.length===0?s.createElement("div",{className:"empty-queued"},"No alerts queued."):s.createElement("div",{className:"queued-list"},n.map(g=>s.createElement("div",{key:g.id,className:"queued-alert-box"},s.createElement("div",{className:"queued-left"},s.createElement(Qr,{size:18,color:"#E53935"})),s.createElement("div",{className:"queued-body"},s.createElement("div",{className:"queued-type"},g.type," Alert"),s.createElement("div",{className:"queued-details"},g.details),s.createElement("div",{className:"queued-time"},g.time)),s.createElement("div",{className:"queued-actions"},s.createElement("button",{className:"btn tiny",onClick:()=>window.alert("Retry send (simulation)")},"Retry"),s.createElement("button",{className:"btn tiny outline",onClick:()=>r(y=>y.filter(E=>E.id!==g.id))},"Delete")))))),s.createElement("div",{className:"features-section"},s.createElement("div",{className:"features-title"},"Features"),s.createElement("div",{className:"features-grid"},s.createElement("div",{className:"feature-box",role:"button",tabIndex:0,onClick:a,onKeyDown:g=>{g.key==="Enter"&&a()}},s.createElement(_m,{size:28,color:"#E53935"}),s.createElement("div",{className:"feature-label"},"Share Location"),i&&s.createElement("div",{className:"feature-subtext"},"Last: ",i)),s.createElement("div",{className:"feature-box",role:"button",tabIndex:0,onClick:()=>p(!0),onKeyDown:g=>{g.key==="Enter"&&p(!0)}},s.createElement(yl,{size:26,color:"#E53935"}),s.createElement("div",{className:"feature-label"},"Nearby Police",s.createElement("br",null),"Units"),s.createElement("div",{className:"feature-subtext"},"Tap to view nearby units")),s.createElement("div",{className:"feature-box"},s.createElement(Pm,{size:28,color:"#E53935"}),s.createElement("div",{className:"feature-label"},"Video/Audio",s.createElement("br",null),"Recording")),s.createElement("div",{className:"feature-box"},s.createElement(zm,{size:28,color:"#E53935"}),s.createElement("div",{className:"feature-label"},"Silent Alert")),s.createElement("div",{className:"feature-box"},s.createElement(Ru,{size:28,color:"#E53935"}),s.createElement("div",{className:"feature-label"},"Mesh",s.createElement("br",null),"Communication")))),s.createElement("div",{className:"research-section"},s.createElement("div",{className:"research-title"},"Research & About"),s.createElement("div",{className:"research-text"},"This app uses advanced mesh networking and SMS fallback to ensure alerts reach authorities even without internet. Mesh communication relays alerts via nearby users/devices, while SMS queue ensures delivery when back online. Your privacy is protected—no personal data is shared without consent."),s.createElement("div",{className:"research-text"},"For more info, visit our website or read the research on mesh networks and emergency response.")))}function Ym(){const[e,t]=S.useState([]),[n,r]=S.useState(!1),l=S.useRef(null),i=u=>{l.current&&l.current.click()},o=u=>{const c=u.target.files[0];if(!c)return;const h=URL.createObjectURL(c),p=c.type.startsWith("image")?"photo":"video";t(m=>[...m,{url:h,type:p}])},a=()=>{e.length!==0&&(r(!0),setTimeout(()=>{r(!1),t([]),window.alert(`Evidence Uploaded -Your evidence has been securely sent to authorities.`)},1800))};return s.createElement("div",{className:"evidence-screen"},s.createElement("header",{className:"header-row"},s.createElement("button",{className:"back-btn",onClick:()=>window.history.back()},"←"),s.createElement("div",{className:"header-title"},"Upload Evidence"),s.createElement("div",{style:{width:40}})),s.createElement("div",{className:"actions-row"},s.createElement("input",{ref:l,type:"file",style:{display:"none"},accept:"image/*,video/*",onChange:o}),s.createElement("button",{className:"action-btn",onClick:()=>i()},s.createElement(jm,{style:{marginRight:8}})," Take / Pick"),s.createElement("button",{className:"action-btn",onClick:()=>i()},s.createElement(Mu,{style:{marginRight:8}})," Record / Pick")),s.createElement("div",{className:"media-preview"},e.length===0?s.createElement("div",{style:{color:"#888",fontStyle:"italic",textAlign:"center"}},"No evidence selected."):e.map((u,c)=>s.createElement("div",{className:"media-box",key:c},u.type==="photo"?s.createElement("img",{src:u.url,alt:"media",className:"media-img"}):s.createElement(Mu,{size:48,color:"#1976d2",style:{marginTop:12}}),s.createElement("div",{className:"media-type"},u.type==="photo"?"Photo":"Video")))),s.createElement("button",{className:"upload-btn",onClick:a,disabled:e.length===0||n},n?"Uploading...":"Upload Evidence"))}function Gm(){const e=yn(),t=r=>e.pathname===r,n=En();return s.createElement("nav",{className:"bottom-tabs"},s.createElement(Mr,{to:"/home",className:`tab ${t("/home")||t("/")?"active":""}`},s.createElement(Om,{size:20})," ",s.createElement("div",{className:"tab-label"},"Home")),s.createElement(Mr,{to:"/chat",className:`tab ${t("/chat")?"active":""}`},s.createElement(ed,{size:20})," ",s.createElement("div",{className:"tab-label"},"Chat")),s.createElement(Mr,{to:"/location",className:`tab ${t("/location")?"active":""}`},s.createElement(td,{size:20})," ",s.createElement("div",{className:"tab-label"},"Location")),s.createElement(Mr,{to:"/alerts",className:`tab ${t("/alerts")?"active":""}`},s.createElement(Tm,{size:20})," ",s.createElement("div",{className:"tab-label"},"Alerts")),s.createElement("button",{className:"tab",style:{background:"none",border:0,cursor:"pointer"},onClick:()=>{localStorage.removeItem("authUser"),n("/login")}},"Logout"))}function Xm(){const e=()=>!!localStorage.getItem("authUser"),t=({children:n})=>e()?n:s.createElement(fm,{to:"/login",replace:!0});return s.createElement("div",{className:"app-root"},s.createElement("main",{className:"main-content"},s.createElement(mm,null,s.createElement(Ve,{path:"/",element:s.createElement(t,null,s.createElement(Tu,null))}),s.createElement(Ve,{path:"/home",element:s.createElement(t,null,s.createElement(Tu,null))}),s.createElement(Ve,{path:"/login",element:s.createElement(Am,null)}),s.createElement(Ve,{path:"/signup",element:s.createElement(Bm,null)}),s.createElement(Ve,{path:"/chat",element:s.createElement(t,null,s.createElement($m,null))}),s.createElement(Ve,{path:"/location",element:s.createElement(t,null,s.createElement(Wm,null))}),s.createElement(Ve,{path:"/alerts",element:s.createElement(t,null,s.createElement(Km,null))}),s.createElement(Ve,{path:"/evidence",element:s.createElement(t,null,s.createElement(Ym,null))}))),e()&&s.createElement(Gm,null))}Wc(document.getElementById("root")).render(s.createElement(s.StrictMode,null,s.createElement(wm,null,s.createElement(Xm,null)))); diff --git a/ShieldX- Web/dist/index.html b/ShieldX- Web/dist/index.html deleted file mode 100644 index 754ee4f..0000000 --- a/ShieldX- Web/dist/index.html +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - SafeCam Converted Web - - - - - -
- - - diff --git a/ShieldX- Web/index.html b/ShieldX- Web/index.html deleted file mode 100644 index ee09ab1..0000000 --- a/ShieldX- Web/index.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - SafeCam Converted Web - - - -
- - - diff --git a/ShieldX- Web/package-lock.json b/ShieldX- Web/package-lock.json deleted file mode 100644 index 2aea57d..0000000 --- a/ShieldX- Web/package-lock.json +++ /dev/null @@ -1,688 +0,0 @@ -{ - "name": "safe-cam-converted-web", - "version": "0.1.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "safe-cam-converted-web", - "version": "0.1.0", - "dependencies": { - "react": "18.2.0", - "react-dom": "18.2.0", - "react-icons": "4.10.1", - "react-router-dom": "6.14.2" - }, - "devDependencies": { - "vite": "4.4.9" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", - "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", - "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", - "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", - "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", - "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", - "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", - "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", - "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", - "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", - "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", - "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", - "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", - "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", - "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", - "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", - "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", - "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", - "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", - "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", - "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", - "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", - "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@remix-run/router": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.7.2.tgz", - "integrity": "sha512-7Lcn7IqGMV+vizMPoEl5F0XDshcdDYtMI6uJLQdQz5CfZAwy3vvGKYSUk789qndt5dEC4HfSjviSYlSoHGL2+A==", - "license": "MIT", - "engines": { - "node": ">=14" - } - }, - "node_modules/esbuild": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", - "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.18.20", - "@esbuild/android-arm64": "0.18.20", - "@esbuild/android-x64": "0.18.20", - "@esbuild/darwin-arm64": "0.18.20", - "@esbuild/darwin-x64": "0.18.20", - "@esbuild/freebsd-arm64": "0.18.20", - "@esbuild/freebsd-x64": "0.18.20", - "@esbuild/linux-arm": "0.18.20", - "@esbuild/linux-arm64": "0.18.20", - "@esbuild/linux-ia32": "0.18.20", - "@esbuild/linux-loong64": "0.18.20", - "@esbuild/linux-mips64el": "0.18.20", - "@esbuild/linux-ppc64": "0.18.20", - "@esbuild/linux-riscv64": "0.18.20", - "@esbuild/linux-s390x": "0.18.20", - "@esbuild/linux-x64": "0.18.20", - "@esbuild/netbsd-x64": "0.18.20", - "@esbuild/openbsd-x64": "0.18.20", - "@esbuild/sunos-x64": "0.18.20", - "@esbuild/win32-arm64": "0.18.20", - "@esbuild/win32-ia32": "0.18.20", - "@esbuild/win32-x64": "0.18.20" - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT" - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "license": "MIT", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" - }, - "node_modules/postcss": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" - }, - "peerDependencies": { - "react": "^18.2.0" - } - }, - "node_modules/react-icons": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.10.1.tgz", - "integrity": "sha512-/ngzDP/77tlCfqthiiGNZeYFACw85fUjZtLbedmJ5DTlNDIwETxhwBzdOJ21zj4iJdvc0J3y7yOsX3PpxAJzrw==", - "license": "MIT", - "peerDependencies": { - "react": "*" - } - }, - "node_modules/react-router": { - "version": "6.14.2", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.14.2.tgz", - "integrity": "sha512-09Zss2dE2z+T1D03IheqAFtK4UzQyX8nFPWx6jkwdYzGLXd5ie06A6ezS2fO6zJfEb/SpG6UocN2O1hfD+2urQ==", - "license": "MIT", - "dependencies": { - "@remix-run/router": "1.7.2" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "react": ">=16.8" - } - }, - "node_modules/react-router-dom": { - "version": "6.14.2", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.14.2.tgz", - "integrity": "sha512-5pWX0jdKR48XFZBuJqHosX3AAHjRAzygouMTyimnBPOLdY3WjzUSKhus2FVMihUFWzeLebDgr4r8UeQFAct7Bg==", - "license": "MIT", - "dependencies": { - "@remix-run/router": "1.7.2", - "react-router": "6.14.2" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "react": ">=16.8", - "react-dom": ">=16.8" - } - }, - "node_modules/rollup": { - "version": "3.29.5", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.5.tgz", - "integrity": "sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w==", - "dev": true, - "license": "MIT", - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=14.18.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/scheduler": { - "version": "0.23.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", - "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/vite": { - "version": "4.4.9", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.9.tgz", - "integrity": "sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.18.10", - "postcss": "^8.4.27", - "rollup": "^3.27.1" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - }, - "peerDependencies": { - "@types/node": ">= 14", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - } - } -} diff --git a/ShieldX- Web/package.json b/ShieldX- Web/package.json deleted file mode 100644 index 51bc78a..0000000 --- a/ShieldX- Web/package.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "safe-cam-converted-web", - "version": "0.1.0", - "private": true, - "scripts": { - "dev": "vite", - "build": "vite build", - "preview": "vite preview" - }, - "dependencies": { - "react": "18.2.0", - "react-dom": "18.2.0", - "react-router-dom": "6.14.2", - "react-icons": "4.10.1" - }, - "devDependencies": { - "vite": "4.4.9" - } -} diff --git a/ShieldX- Web/src/App.jsx b/ShieldX- Web/src/App.jsx deleted file mode 100644 index 119f7ad..0000000 --- a/ShieldX- Web/src/App.jsx +++ /dev/null @@ -1,36 +0,0 @@ -import React from 'react' -import { Routes, Route, Navigate } from 'react-router-dom' -import Home from './pages/Home' -import Login from './pages/Login' -import Signup from './pages/Signup' -import Chat from './pages/Chat' -import Location from './pages/Location' -import Alerts from './pages/Alerts' -import Evidence from './pages/Evidence' -import BottomTabs from './components/BottomTabs' - -export default function App() { - const isAuth = () => !!localStorage.getItem('authUser') - - const ProtectedRoute = ({ children }) => { - return isAuth() ? children : - } - - return ( -
-
- - } /> - } /> - } /> - } /> - } /> - } /> - } /> - } /> - -
- {isAuth() && } -
- ) -} diff --git a/ShieldX- Web/src/components/BottomTabs.jsx b/ShieldX- Web/src/components/BottomTabs.jsx deleted file mode 100644 index 52ee901..0000000 --- a/ShieldX- Web/src/components/BottomTabs.jsx +++ /dev/null @@ -1,19 +0,0 @@ -import React from 'react' -import { Link, useLocation, useNavigate } from 'react-router-dom' -import { IoMdHome, IoMdLocate } from 'react-icons/io' -import { MdChat, MdNotifications } from 'react-icons/md' - -export default function BottomTabs(){ - const loc = useLocation() - const active = (p) => loc.pathname === p - const navigate = useNavigate() - return ( - - ) -} diff --git a/ShieldX- Web/src/components/PoliceMap.jsx b/ShieldX- Web/src/components/PoliceMap.jsx deleted file mode 100644 index 2bd10a5..0000000 --- a/ShieldX- Web/src/components/PoliceMap.jsx +++ /dev/null @@ -1,143 +0,0 @@ -import React, { useEffect, useState } from 'react' - -// A lightweight mock map that shows fake police units around a center coordinate. -// Props: -// - center: optional string "lat, lon" or {lat, lon} -// - onDispatch(unit): called when user dispatches a unit -// - onClose(): called when panel should be closed -export default function PoliceMap({ center, onDispatch = () => {}, onClose = () => {} }) { - const demoCenter = { lat: 28.704060, lon: 77.102493 } // demo coords - const [centerCoords, setCenterCoords] = useState(demoCenter) - const [units, setUnits] = useState([]) - const [selected, setSelected] = useState(null) - - useEffect(() => { - // parse center prop if provided - if (center) { - if (typeof center === 'string' && center.includes(',')) { - const [la, lo] = center.split(',').map(s => parseFloat(s.trim())) - if (!Number.isNaN(la) && !Number.isNaN(lo)) { - setCenterCoords({ lat: la, lon: lo }) - } - } else if (center.lat && center.lon) { - setCenterCoords(center) - } - } - }, [center]) - - useEffect(() => { - // try browser geolocation if user hasn't provided a center - if (!center) { - if (navigator.geolocation) { - navigator.geolocation.getCurrentPosition( - pos => { - const { latitude, longitude } = pos.coords - setCenterCoords({ lat: latitude, lon: longitude }) - }, - () => { - // ignore, keep demo center - }, - { timeout: 8000 } - ) - } - } - }, [center]) - - useEffect(() => { - // generate 5 mock units around center - const base = centerCoords - const spread = [ - { dLat: 0.0012, dLon: 0.0008 }, - { dLat: -0.0009, dLon: 0.0010 }, - { dLat: 0.0006, dLon: -0.0011 }, - { dLat: -0.0015, dLon: -0.0006 }, - { dLat: 0.0018, dLon: -0.0003 } - ] - const generated = spread.map((s, i) => { - const lat = base.lat + s.dLat - const lon = base.lon + s.dLon - return { - id: `U-${i + 1}`, - name: `Unit ${i + 1}`, - lat, - lon, - eta: `${2 + i} min`, - distanceKm: Math.abs(s.dLat * 111).toFixed(2) // rough km - } - }) - setUnits(generated) - }, [centerCoords]) - - // helper to map lat/lon to percentages inside the map box - const toPercent = (lat, lon) => { - // compute simple relative position using +/-0.002 range - const latDiff = lat - centerCoords.lat - const lonDiff = lon - centerCoords.lon - const latPct = 50 - (latDiff / 0.002) * 50 - const lonPct = 50 + (lonDiff / 0.002) * 50 - return { top: `${Math.max(6, Math.min(94, latPct))}%`, left: `${Math.max(6, Math.min(94, lonPct))}%` } - } - - return ( -
-
-
Nearby Police Units
-
- -
-
- -
-
- {units.map(u => { - const pos = toPercent(u.lat, u.lon) - const isSel = selected && selected.id === u.id - return ( - - ) - })} - - {/* center indicator */} -
-
- -
-
Units
- {units.map(u => ( -
setSelected(u)} role="button" tabIndex={0} onKeyDown={(e)=>{if(e.key==='Enter')setSelected(u)}}> -
-
{u.name}
-
{u.distanceKm} km • ETA {u.eta}
-
-
- -
-
- ))} - - {selected && ( -
-
{selected.name}
-
{selected.distanceKm} km away • ETA {selected.eta}
-
- - -
-
- )} -
-
-
- ) -} diff --git a/ShieldX- Web/src/main.jsx b/ShieldX- Web/src/main.jsx deleted file mode 100644 index 84f60dd..0000000 --- a/ShieldX- Web/src/main.jsx +++ /dev/null @@ -1,13 +0,0 @@ -import React from 'react' -import { createRoot } from 'react-dom/client' -import { BrowserRouter } from 'react-router-dom' -import App from './App' -import './styles/index.css' - -createRoot(document.getElementById('root')).render( - - - - - -) diff --git a/ShieldX- Web/src/pages/Alerts.jsx b/ShieldX- Web/src/pages/Alerts.jsx deleted file mode 100644 index dcedd11..0000000 --- a/ShieldX- Web/src/pages/Alerts.jsx +++ /dev/null @@ -1,177 +0,0 @@ -import React, { useState } from 'react' -import { IoMdWifi } from 'react-icons/io' -import { MdPeople, MdCloudOff, MdSettings, MdVideocam, MdVolumeOff, MdSend, MdLocationOn } from 'react-icons/md' -import { IoIosAlert } from 'react-icons/io' -import { FiShield } from 'react-icons/fi' -import { FaUsers, FaMapMarkerAlt } from 'react-icons/fa' -import PoliceMap from '../components/PoliceMap' - -export default function Alerts() { - const [status, setStatus] = useState('online') // online | offline | mesh - const [queuedAlerts, setQueuedAlerts] = useState([ - // sample queued alert for demo - // { id: '1', time: '2025-09-18 14:22', type: 'Panic', details: 'User pressed panic button at Park Avenue.' } - ]) - - // helper to add a demo queued alert - const pushDemoAlert = () => { - const id = Date.now().toString() - const now = new Date().toLocaleString() - setQueuedAlerts(prev => [{ id, time: now, type: 'Panic', details: 'Demo: Panic pressed at Park Avenue.' }, ...prev]) - } - - const [lastSharedLocation, setLastSharedLocation] = useState(null) - - // Share current location (web) and queue a Location Share alert - const shareLocation = () => { - if (!navigator.geolocation) { - window.alert('Geolocation is not supported in this browser.') - return - } - - navigator.geolocation.getCurrentPosition( - (pos) => { - const { latitude, longitude } = pos.coords - const coords = `${latitude.toFixed(6)}, ${longitude.toFixed(6)}` - const id = Date.now().toString() - const now = new Date().toLocaleString() - setQueuedAlerts(prev => [{ id, time: now, type: 'Location Share', details: `Shared location: ${coords}` }, ...prev]) - setLastSharedLocation(coords) - window.alert('Location shared: ' + coords) - }, - (err) => { - window.alert('Unable to get location: ' + (err?.message || 'error')) - }, - { enableHighAccuracy: true, timeout: 10000 } - ) - } - - const toggleStatus = () => { - if (status === 'online') setStatus('offline') - else if (status === 'offline') setStatus('mesh') - else setStatus('online') - } - - const sendQueued = () => { - setQueuedAlerts([]) - setStatus('online') - window.alert('Alerts Sent\nAll queued alerts have been sent to authorities.') - } - - const [showPolice, setShowPolice] = useState(false) - - const handleDispatch = (unit) => { - const id = Date.now().toString() - const now = new Date().toLocaleString() - setQueuedAlerts(prev => [{ id, time: now, type: 'Dispatch', details: `Dispatch requested to ${unit.name} (ETA ${unit.eta})` }, ...prev]) - } - - return ( -
-
-
-
Alert System
-
{status === 'online' ? 'Online' : status === 'mesh' ? 'Mesh' : 'Offline'}
-
-
- -
-
- -
-
-
- {status === 'online' ? : status === 'mesh' ? : } -
-
-
{status === 'online' ? 'Online' : status === 'mesh' ? 'Mesh Fallback' : 'Offline'}
-
- {status === 'online' && 'All alerts are sent instantly to authorities.'} - {status === 'offline' && 'No internet. Alerts will be queued and sent via SMS or mesh when possible.'} - {status === 'mesh' && 'Mesh fallback active. Alerts are relayed via nearby users/devices.'} -
-
-
-
- - -
-
- {showPolice && ( - { handleDispatch(unit) }} - onClose={() => setShowPolice(false)} - /> - )} - -
-
-
Queued Alerts
-
- - -
-
- {queuedAlerts.length === 0 ? ( -
No alerts queued.
- ) : ( -
- {queuedAlerts.map(a => ( -
-
-
-
{a.type} Alert
-
{a.details}
-
{a.time}
-
-
- - -
-
- ))} -
- )} -
- -
-
Features
-
-
{if(e.key==='Enter')shareLocation()}}> - -
Share Location
- {lastSharedLocation &&
Last: {lastSharedLocation}
} -
- -
setShowPolice(true)} onKeyDown={(e)=>{if(e.key==='Enter')setShowPolice(true)}}> - -
Nearby Police
Units
-
Tap to view nearby units
-
- -
- -
Video/Audio
Recording
-
- -
- -
Silent Alert
-
- -
- -
Mesh
Communication
-
-
-
- -
-
Research & About
-
This app uses advanced mesh networking and SMS fallback to ensure alerts reach authorities even without internet. Mesh communication relays alerts via nearby users/devices, while SMS queue ensures delivery when back online. Your privacy is protected—no personal data is shared without consent.
-
For more info, visit our website or read the research on mesh networks and emergency response.
-
-
- ) -} diff --git a/ShieldX- Web/src/pages/Chat.jsx b/ShieldX- Web/src/pages/Chat.jsx deleted file mode 100644 index 30f45d2..0000000 --- a/ShieldX- Web/src/pages/Chat.jsx +++ /dev/null @@ -1,112 +0,0 @@ -import React, { useState, useRef, useEffect } from 'react' -import { FiUser } from 'react-icons/fi' -import { IoIosAlert, IoMdSend } from 'react-icons/io' - -export default function Chat({}) { - const [messages, setMessages] = useState([ - { id: '1', sender: 'ai', text: "Hello, I'm your AI assistant. How can I help you today?" } - ]) - const [input, setInput] = useState('') - const [loading, setLoading] = useState(false) - const endRef = useRef(null) - - useEffect(() => { - scrollToBottom() - }, []) - - const scrollToBottom = () => { - endRef.current?.scrollIntoView({ behavior: 'smooth' }) - } - - const sendMessage = async () => { - if (!input.trim() || loading) return - const userMsg = { id: Date.now().toString(), sender: 'user', text: input } - setMessages(prev => [...prev, userMsg]) - setInput('') - setLoading(true) - setTimeout(scrollToBottom, 100) - - // AI response logic mirroring the RN version - let aiText = '' - const text = userMsg.text.toLowerCase() - if (/panic|sos|urgent|immediate|danger|attack|assault|robbery|theft|violence|shooting|gun|weapon/.test(text)) { - aiText = 'Emergency detected. Are you in immediate danger? Please confirm your safety and share your location.' - } else if (/crime|report|help|emergency|police|officer|911/.test(text)) { - aiText = 'Please provide details about the incident, including your location, type of crime, and any injuries.' - } else if (/location|where|address|gps|map/.test(text)) { - aiText = 'Can you share your current location or describe where the incident occurred? You can also use the Live GPS Map feature.' - } else if (/injur|hurt|medical|ambulance|doctor/.test(text)) { - aiText = 'If anyone is injured, please describe the injuries and if medical help is needed. Emergency services can be dispatched.' - } else if (/officer|response|eta|arrive|coming/.test(text)) { - aiText = 'An officer is being dispatched. You will receive live updates on their location and estimated arrival time.' - } else if (/thank|thanks|grateful|appreciate/.test(text)) { - aiText = 'You are welcome. Stay safe! If you need further help, just type your question.' - } else if (/cancel|mistake|false alarm/.test(text)) { - aiText = 'If this was a false alarm, please confirm so we can update the response team.' - } else { - aiText = "I'm here to assist you with emergencies, police alerts, and safety information. Please describe your situation or question." - } - - // Simulate delay like RN - setTimeout(() => { - setMessages(prev => [...prev, { id: Date.now().toString(), sender: 'ai', text: aiText }]) - setLoading(false) - setTimeout(scrollToBottom, 100) - }, 1200) - } - - return ( -
-
- -
AI Assistant
-
-
- -
-
- avatar{e.target.onerror=null; e.target.style.display='none'}} /> - -
-
-
- -
- {messages.map(item => ( -
- {item.sender === 'ai' &&
} -
- {item.sender === 'ai' &&
AI Assistant
} -
{item.text}
-
- {item.sender === 'user' &&
} -
- ))} - {loading && ( -
-
-
AI is typing...
-
- )} -
-
- -
- setInput(e.target.value)} - onKeyDown={e => { if (e.key === 'Enter') sendMessage() }} - disabled={loading} - /> - - -
-
- ) -} diff --git a/ShieldX- Web/src/pages/Evidence.jsx b/ShieldX- Web/src/pages/Evidence.jsx deleted file mode 100644 index 6fb98b3..0000000 --- a/ShieldX- Web/src/pages/Evidence.jsx +++ /dev/null @@ -1,67 +0,0 @@ -import React, { useState, useRef } from 'react' -import { FaCamera, FaVideo } from 'react-icons/fa' - -export default function Evidence() { - const [media, setMedia] = useState([]) // { url, type } - const [uploading, setUploading] = useState(false) - const fileRef = useRef(null) - - const pickMedia = (type) => { - if (fileRef.current) fileRef.current.click() - } - - const onFileChange = (e) => { - const f = e.target.files[0] - if (!f) return - const url = URL.createObjectURL(f) - const t = f.type.startsWith('image') ? 'photo' : 'video' - setMedia(prev => [...prev, { url, type: t }]) - } - - const uploadEvidence = () => { - if (media.length === 0) return - setUploading(true) - setTimeout(() => { - setUploading(false) - setMedia([]) - window.alert('Evidence Uploaded\nYour evidence has been securely sent to authorities.') - }, 1800) - } - - return ( -
-
- -
Upload Evidence
-
-
- -
- - - -
- -
- {media.length === 0 ? ( -
No evidence selected.
- ) : ( - media.map((m, idx) => ( -
- {m.type === 'photo' ? ( - media - ) : ( - - )} -
{m.type === 'photo' ? 'Photo' : 'Video'}
-
- )) - )} -
- - -
- ) -} diff --git a/ShieldX- Web/src/pages/Home.jsx b/ShieldX- Web/src/pages/Home.jsx deleted file mode 100644 index 140d9f3..0000000 --- a/ShieldX- Web/src/pages/Home.jsx +++ /dev/null @@ -1,76 +0,0 @@ -import React, { useState, useRef, useEffect } from 'react' -import { FiShield } from 'react-icons/fi' -import { MdSettings } from 'react-icons/md' -import { IoIosAlert } from 'react-icons/io' -import { MdChat, MdNotificationsActive } from 'react-icons/md' -import { IoMdLocate } from 'react-icons/io' -import { useNavigate } from 'react-router-dom' - -export default function Home() { - const [status, setStatus] = useState('Safe') - const [panicActive, setPanicActive] = useState(false) - const timerRef = useRef(null) - - useEffect(() => { - return () => { if (timerRef.current) clearTimeout(timerRef.current) } - }, []) - - const navigate = useNavigate() - - const handlePanic = () => { - setPanicActive(true) - setStatus('Alert Sent! Officer Notified') - timerRef.current = setTimeout(() => setStatus('Officer En Route (ETA: 2 min)'), 2000) - timerRef.current = setTimeout(() => { setStatus('Help Arrived'); setPanicActive(false) }, 6000) - } - - return ( -
-
-
- icon{e.target.onerror=null; e.target.style.display='none'}} /> - -
AI Police Alert
-
- -
- -
-
{panicActive ? : }
-
{status}
-
- -
- -
{panicActive ? 'Alert in progress...' : 'Tap to send instant police alert.'}
-
- -
-
Quick Actions
-
-
navigate('/chat')} onKeyDown={(e)=>{if(e.key==='Enter')navigate('/chat')}} aria-label="Open AI Chat Assistant"> - -
AI Chat Assistant
-
-
navigate('/location')} onKeyDown={(e)=>{if(e.key==='Enter')navigate('/location')}} aria-label="Open Live GPS Map"> - -
Live GPS Map
-
-
-
-
navigate('/alerts')} onKeyDown={(e)=>{if(e.key==='Enter')navigate('/alerts')}} aria-label="View Recent Alerts"> - -
Recent Alerts
-
-
navigate('/alerts')} onKeyDown={(e)=>{if(e.key==='Enter')navigate('/alerts')}} aria-label="Safety and Research"> - -
Safety & Research
-
-
-
-
- ) -} diff --git a/ShieldX- Web/src/pages/Location.jsx b/ShieldX- Web/src/pages/Location.jsx deleted file mode 100644 index e803f8b..0000000 --- a/ShieldX- Web/src/pages/Location.jsx +++ /dev/null @@ -1,88 +0,0 @@ -import React, { useState } from 'react' -import { IoIosShareAlt } from 'react-icons/io' -import { MdSettings, MdPlace } from 'react-icons/md' - -const dummyLocations = [ - { id: '1', name: 'Police Station', address: 'Sector 21, Main Road' }, - { id: '2', name: 'Hospital', address: 'City Hospital, Block B' }, - { id: '3', name: 'Your Last Location', address: 'Park Avenue, Sector 17' }, -] -const emergencyContacts = [ - { id: '1', name: 'Police', phone: '100' }, - { id: '2', name: 'Ambulance', phone: '102' }, - { id: '3', name: 'Fire', phone: '101' }, -] - -export default function Location() { - const [search, setSearch] = useState('') - const [officerStatus, setOfficerStatus] = useState('No active alert') - - const triggerAlert = () => { - setOfficerStatus('Officer dispatched (ETA: 2 min)') - window.alert('Police Alert Sent\nAn officer is being dispatched to your location.') - setTimeout(() => setOfficerStatus('Officer en route (ETA: 1 min)'), 2000) - setTimeout(() => setOfficerStatus('Officer arrived'), 6000) - } - - const shareLocation = () => { - window.open('https://maps.google.com', '_blank') - } - - const callEmergency = (phone) => window.alert(`Call ${phone}`) - - return ( -
-
-
Location
- -
- -
- setSearch(e.target.value)} /> -
- -
-
- -
Map placeholder for web. Use mobile app for live map features.
-
-
- -
-
🛡️
-
{officerStatus}
-
- -
- - - -
- -
-
Emergency Contacts
-
- {emergencyContacts.map(c => ( - - ))} -
-
- -
-
Nearby & Recent Locations
- {dummyLocations.map(item => ( -
-
-
-
{item.name}
-
{item.address}
-
-
- ))} -
-
- ) -} diff --git a/ShieldX- Web/src/pages/Login.jsx b/ShieldX- Web/src/pages/Login.jsx deleted file mode 100644 index 8a10638..0000000 --- a/ShieldX- Web/src/pages/Login.jsx +++ /dev/null @@ -1,90 +0,0 @@ -import React, { useState } from 'react'; -import { FaGoogle, FaFacebook } from 'react-icons/fa'; -import { IoMdHome, IoMdMap } from 'react-icons/io'; -import { MdNotifications } from 'react-icons/md'; -import { FaUser } from 'react-icons/fa'; -import { useNavigate } from 'react-router-dom'; -import { FiShield } from 'react-icons/fi'; - -export default function Login() { - const [remember, setRemember] = useState(false); - const navigate = useNavigate(); - const [id, setId] = useState(''); - const [password, setPassword] = useState(''); - const [error, setError] = useState(null); - const [loading, setLoading] = useState(false); - - - const doLogin = async (e) => { - if (e && typeof e.preventDefault === 'function') e.preventDefault() - setError(null) - if (!id || !password) { setError('Enter username/email and password'); return } - // prefer Vite env, then CRA env, fallback to localhost for local dev - const api = (typeof import.meta !== 'undefined' && import.meta.env && import.meta.env.VITE_API_URL) - || (typeof process !== 'undefined' && process.env && process.env.REACT_APP_API_URL) - || 'http://localhost:4000' - - setLoading(true) - try { - const base = String(api).replace(/\/$/, '') - const res = await fetch(base + '/api/login', { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ username: id, password }) - }) - const data = await res.json() - if (!res.ok) { setError(data.message || 'Login failed'); setLoading(false); return } - localStorage.setItem('authUser', JSON.stringify({ token: data.token, ...data.user })) - navigate('/home', { replace: true }) - } catch (err) { - setError('API error: ' + (err.message || err)) - } finally { - setLoading(false) - } - } - - return ( -
-
-
-
ShieldX
-
Instant Police Alerts
-
- -
- {error &&
{error}
} - setId(e.target.value)} /> - setPassword(e.target.value)} /> - -
- - -
- - - -
-
-
Or continue with
-
-
- -
- - -
- - - -
- -
- - - -
- ) -} diff --git a/ShieldX- Web/src/pages/Signup.jsx b/ShieldX- Web/src/pages/Signup.jsx deleted file mode 100644 index dbfe1fd..0000000 --- a/ShieldX- Web/src/pages/Signup.jsx +++ /dev/null @@ -1,87 +0,0 @@ -import React, { useState } from 'react' -import { useNavigate } from 'react-router-dom' - -export default function Signup() { - const [fullName, setFullName] = useState('') - const [email, setEmail] = useState('') - const [password, setPassword] = useState('') - const [error, setError] = useState(null) - const [loading, setLoading] = useState(false) - const navigate = useNavigate() - - const doSignup = async (e) => { - if (e && typeof e.preventDefault === 'function') e.preventDefault() - setError(null) - if (!email || !password) { setError('Please enter email and password'); return } - // prefer Vite env, then CRA env, fallback to localhost for local dev - const api = (typeof import.meta !== 'undefined' && import.meta.env && import.meta.env.VITE_API_URL) - || (typeof process !== 'undefined' && process.env && process.env.REACT_APP_API_URL) - || 'http://localhost:4000' - - setLoading(true) - try { - const base = String(api).replace(/\/$/, '') - const res = await fetch(base + '/api/register', { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ username: email, password, name: fullName }) - }) - const data = await res.json() - if (!res.ok) { setError(data.message || 'Signup failed'); setLoading(false); return } - - const loginRes = await fetch(base + '/api/login', { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ username: email, password }) - }) - const loginData = await loginRes.json() - if (!loginRes.ok) { setError(loginData.message || 'Auto-login failed'); setLoading(false); navigate('/login'); return } - - localStorage.setItem('authUser', JSON.stringify({ token: loginData.token, username: email, name: fullName || (email && email.split && email.split('@')[0]) })) - navigate('/home', { replace: true }) - } catch (err) { - setError('API error: ' + (err.message || err)) - } finally { - setLoading(false) - } - } - - return ( -
- -
-

Sign Up

-
- -
-
- ℹ️ -
-
- -
- {error &&
{error}
} - setFullName(e.target.value)} /> - setEmail(e.target.value)} /> - setPassword(e.target.value)} /> - - - -
-
-
Or sign up with
-
-
- -
- - -
- -
- -
- -
- ) -} diff --git a/ShieldX- Web/src/styles/index.css b/ShieldX- Web/src/styles/index.css deleted file mode 100644 index ac31539..0000000 --- a/ShieldX- Web/src/styles/index.css +++ /dev/null @@ -1,949 +0,0 @@ -:root { - --red: #E53935; - --muted: #888; - --bg: #fff -} - -* { - box-sizing: border-box -} - -html, -body, -#root { - height: 100%; - margin: 0; - font-family: Inter, system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial -} - -.app-root { - min-height: 100vh; - background: var(--bg) -} - -.main-content { - padding: 16px -} - -/* Bottom tabs */ -.bottom-tabs { - position: fixed; - left: 0; - right: 0; - bottom: 0; - height: 64px; - background: #fff; - border-top: 1px solid #eee; - display: flex; - align-items: center; - justify-content: space-around; - padding: 8px 12px -} - -.bottom-tabs .tab { - display: flex; - flex-direction: column; - align-items: center; - color: #777; - text-decoration: none -} - -.bottom-tabs .tab.active { - color: var(--red) -} - -.bottom-tabs .tab-label { - font-size: 12px; - margin-top: 4px -} - -/* Ensure main content doesn't hide behind bottom tabs */ -.main-content { - padding-bottom: 88px -} - -.safe-area { - min-height: 80vh; - padding: 8px -} - -.header-row { - display: flex; - align-items: center; - justify-content: space-between; - padding: 8px 12px; - margin-bottom: 8px -} - -.header-title { - font-size: 20px; - font-weight: 700; - color: #222 -} - -.header-icon { - background: #f5f5f5; - border-radius: 20px; - padding: 8px; - border: none -} - -.status-bar { - display: flex; - align-items: center; - gap: 8px; - background: #f7f7fa; - border-radius: 12px; - border: 1px solid #e0e0e0; - padding: 10px 14px; - margin: 8px 0 -} - -.status-bar.panic { - background: #fff3f3; - border-color: var(--red) -} - -.status-text { - font-size: 16px; - color: #222; - font-weight: 600 -} - -.status-text.panic { - color: var(--red); - font-weight: 700 -} - -.sos-container { - text-align: center; - margin: 14px 0 -} - -.sos-button { - width: 220px; - height: 220px; - border-radius: 110px; - background: var(--red); - color: #fff; - display: inline-flex; - flex-direction: column; - align-items: center; - justify-content: center; - border: 0; - box-shadow: 0 8px 16px rgba(229, 57, 53, 0.18); - cursor: pointer -} - -.sos-button:disabled { - opacity: 0.85; - cursor: default -} - -.sos-button.active { - background: #fff; - border: 4px solid var(--red) -} - -.sos-text { - color: #fff; - font-size: 36px; - font-weight: 700; - margin-top: 8px; - letter-spacing: 2px -} - -.sos-text.active { - color: var(--red) -} - -.sos-subtext { - color: var(--muted); - font-size: 16px; - margin-top: 10px -} - -.quick-actions-section { - margin-top: 10px; - padding: 0 4px -} - -.quick-actions-title { - font-size: 18px; - font-weight: 700; - margin-bottom: 12px -} - -.quick-actions-grid { - display: flex; - gap: 16px; - margin-bottom: 16px -} - -.quick-action-box { - flex: 1; - background: #f7f7fa; - border-radius: 18px; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - padding: 16px; - min-height: 96px; - cursor: pointer; - transition: box-shadow .15s ease, transform .12s ease; - text-align: center; -} - -.quick-action-label { - margin-top: 10px; - font-size: 15px; - font-weight: 600; - color: #222 -} - -.auth-screen { - max-width: 420px; - margin: 20px auto; - padding: 16px; - background: #fff; - border-radius: 12px; - box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05) -} - -.auth-form { - display: flex; - flex-direction: column; - gap: 12px -} - -.auth-form input { - padding: 10px; - border-radius: 8px; - border: 1px solid #e0e0e0 -} - -.auth-form button { - background: var(--red); - color: #fff; - padding: 10px; - border-radius: 8px; - border: 0; - cursor: pointer -} - -@media(max-width:600px) { - .quick-actions-grid { - flex-direction: column - } - - .quick-action-box { - width: 100% - } -} - -.quick-action-box:focus,.quick-action-box:hover{box-shadow:0 8px 20px rgba(0,0,0,0.06);transform:translateY(-4px);outline:none} -.quick-action-box svg{display:block} -.quick-action-label{line-height:1.1} - -/* Chat styles */ -.chat-screen { - display: flex; - flex-direction: column; - height: calc(100vh - 64px); - max-height: 100vh -} - -.chat-header { - display: flex; - align-items: center; - justify-content: space-between; - padding: 10px -} - -.back-btn { - background: none; - border: 0; - font-size: 20px; - cursor: pointer -} - -.chat-title { - font-size: 20px; - font-weight: 700; - color: #222 -} - -.avatar-row { - display: flex; - justify-content: center; - margin-bottom: 8px -} - -.avatar-circle { - width: 60px; - height: 60px; - border-radius: 30px; - background: #eee; - display: flex; - align-items: center; - justify-content: center; - position: relative -} - -.avatar-status { - position: absolute; - right: 8px; - bottom: 8px; - width: 12px; - height: 12px; - border-radius: 6px; - background: #3ecf4a; - border: 2px solid #fff -} - -.chat-area { - flex: 1; - overflow: auto; - padding: 10px -} - -.bubble-row { - display: flex; - align-items: flex-end; - margin-bottom: 12px -} - -.bubble-row.user { - justify-content: flex-end -} - -.bubble-avatar, -.bubble-avatar-user { - width: 36px; - height: 36px; - border-radius: 18px; - background: #ddd; - display: flex; - align-items: center; - justify-content: center -} - -.bubble-avatar { - margin-right: 8px -} - -.bubble-avatar-user { - margin-left: 8px -} - -.bubble-left { - background: #f7f7fa; - border-radius: 16px; - padding: 12px; - max-width: 70% -} - -.bubble-right { - background: #E53935; - border-radius: 16px; - padding: 12px; - max-width: 70% -} - -.bubble-sender { - font-size: 12px; - color: #b71c1c; - font-weight: 700; - margin-bottom: 6px -} - -.bubble-text { - font-size: 15px; - color: #222 -} - -.bubble-text-user { - font-size: 15px; - color: #fff -} - -.typing-indicator { - display: flex; - align-items: center; - justify-content: center; - margin: 8px 0 -} - -.spinner { - width: 16px; - height: 16px; - border-radius: 8px; - background: var(--red); - animation: spin 1s linear infinite; - margin-right: 8px -} - -.typing-text { - color: var(--red); - font-size: 13px -} - -@keyframes spin { - from { - transform: rotate(0) - } - - to { - transform: rotate(360deg) - } -} - -.input-bar { - display: flex; - align-items: center; - padding: 10px; - border-top: 1px solid #eee; - background: #fff -} - -.chat-input { - flex: 1; - background: #f7f7fa; - border-radius: 20px; - padding: 10px 14px; - font-size: 15px; - border: 1px solid #eee; - margin-right: 8px -} - -.input-mic { - background: none; - border: 0; - margin-right: 8px -} - -.input-send { - background: var(--red); - border: 0; - border-radius: 20px; - padding: 8px; - display: flex; - align-items: center; - justify-content: center; - color: #fff; - cursor: pointer -} - -/* Alerts styles reuse many of the feature styles already present */ -.status-card { - background: #f7f7fa; - border-radius: 14px; - padding: 16px; - margin: 12px -} - -.status-card.offline { - background: #fff3f3 -} - -.status-card.mesh { - background: #e3f2fd -} - -.queued-section { - background: #fff8f0; - border-radius: 14px; - padding: 14px; - margin: 12px -} - -.queued-title { - font-size: 15px; - font-weight: 700; - color: var(--red); - margin-bottom: 8px -} - -.queued-alert-box { - display: flex; - align-items: flex-start; - margin-bottom: 8px -} - -.send-btn { - display: inline-flex; - align-items: center; - background: var(--red); - color: #fff; - border: 0; - padding: 8px 12px; - border-radius: 20px; - cursor: pointer -} - -/* Alerts page styles */ -.status-pill { - padding: 6px 10px; - border-radius: 14px; - font-weight: 700; - background: #f0f0f0; - color: #222; - font-size: 13px -} - -.status-pill.online { - background: #e8f8ee; - color: #0b8a39 -} - -.status-pill.offline { - background: #fff3f3; - color: #c62828 -} - -.status-pill.mesh { - background: #eaf4ff; - color: #1565c0 -} - -.icon-btn { - background: #fff; - border: 1px solid #eee; - padding: 8px; - border-radius: 10px; - cursor: pointer -} - -.alert-controls { - display: flex; - gap: 12px; - margin-top: 12px -} - -.btn { - background: var(--red); - color: #fff; - border: 0; - padding: 8px 12px; - border-radius: 8px; - cursor: pointer -} - -.btn.outline { - background: #fff; - border: 1px solid #ddd; - color: #333 -} - -.btn.small { - padding: 6px 8px; - border-radius: 6px -} - -.btn.primary { - background: var(--red); - padding: 6px 8px -} - -.btn.tiny { - padding: 6px 8px; - font-size: 12px -} - -.queued-section { - background: #fff; - border-radius: 12px; - padding: 12px; - margin: 12px 0 -} - -.queued-header { - display: flex; - justify-content: space-between; - align-items: center; - margin-bottom: 10px -} - -.queued-title { - font-size: 16px; - font-weight: 700; - color: #222 -} - -.queued-actions { - display: flex; - gap: 8px -} - -.empty-queued { - color: #888; - font-style: italic; - padding: 12px -} - -.queued-list { - display: flex; - flex-direction: column; - gap: 10px -} - -.queued-alert-box { - display: flex; - align-items: flex-start; - gap: 12px; - padding: 10px; - border-radius: 10px; - background: #fff8f0; - border: 1px solid #ffe6e0 -} - -.queued-left { - flex: 0 0 36px; - display: flex; - align-items: center; - justify-content: center -} - -.queued-body { - flex: 1 -} - -.queued-type { - font-weight: 700; - color: var(--red); - margin-bottom: 6px -} - -.queued-details { - color: #333 -} - -.queued-time { - color: #888; - font-size: 12px; - margin-top: 6px -} - -.queued-actions { - display: flex; - flex-direction: column; - gap: 6px -} - -.features-section { - margin-top: 16px -} - -.features-grid { - display: grid; - grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); - gap: 12px; - margin-bottom: 12px -} - -.feature-box { - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - padding: 16px; - border-radius: 12px; - background: #f7f7fa; - min-height: 96px; - text-align: center -} - -.feature-box svg { - width: 36px; - height: 36px -} - -.feature-label { - text-align: center; - margin-top: 8px; - font-weight: 600; - font-size: 14px; - color: #222 -} - -.feature-subtext { - font-size: 12px; - color: #666; - margin-top: 6px -} - -/* feature box interaction polish */ -.feature-box{transition:box-shadow .18s ease,border-color .18s ease,transform .12s ease} -.feature-box:focus,.feature-box:hover{box-shadow:0 6px 18px rgba(0,0,0,0.06);transform:translateY(-4px);outline:none} - -/* Map panel for Nearby Police Units */ -.map-panel{margin-top:12px;background:#fff;border-radius:12px;border:1px solid #eee;padding:12px} -.map-panel-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px} -.map-panel-body{display:flex;gap:12px} -.map-area{flex:1;position:relative;background:linear-gradient(180deg,#eaf3ff, #fff);height:260px;border-radius:10px;overflow:hidden;border:1px solid #dcecff} -.center-dot{position:absolute;width:14px;height:14px;border-radius:7px;background:#1976d2;border:2px solid #fff;transform:translate(-50%,-50%)} -.marker{position:absolute;width:30px;height:30px;border-radius:15px;background:transparent;border:0;cursor:pointer;display:flex;align-items:center;justify-content:center} -.marker .marker-dot{width:12px;height:12px;border-radius:6px;background:#E53935;border:2px solid #fff;box-shadow:0 2px 6px rgba(0,0,0,0.12)} -.marker.selected .marker-dot{background:#1976d2} -.unit-list{width:280px;display:flex;flex-direction:column;gap:8px} -.unit-list-title{font-weight:700;margin-bottom:6px} -.unit-item{display:flex;justify-content:space-between;align-items:center;padding:8px;border-radius:8px;border:1px solid #f0f0f0;background:#fafcff;cursor:pointer} -.unit-item.active{box-shadow:0 6px 18px rgba(25,118,210,0.08);border-color:#d0e8ff} -.selected-details{margin-top:10px;padding:8px;border-radius:8px;background:#f7f7fa;border:1px solid #eee} - -@media(max-width:720px){.map-panel-body{flex-direction:column}.unit-list{width:100%}} - - -/* Evidence styles reuse media preview definitions already present */ -.evidence-screen .actions-row { - display: flex; - gap: 12px; - justify-content: center; - margin: 16px -} - -.action-btn { - background: var(--red); - color: #fff; - border: 0; - padding: 10px 14px; - border-radius: 20px; - cursor: pointer -} - -.media-preview { - display: flex; - flex-wrap: wrap; - justify-content: center; - margin: 12px -} - -.media-box { - width: 110px; - height: 110px; - background: #f7f7fa; - border-radius: 14px; - margin: 8px; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - padding: 6px -} - -.media-img { - width: 90px; - height: 90px; - object-fit: cover; - border-radius: 10px -} - -.media-type { - color: #1976d2; - font-weight: 700; - margin-top: 6px -} - -.upload-btn { - background: #1976d2; - color: #fff; - border: 0; - padding: 12px 20px; - border-radius: 22px; - display: block; - margin: 16px auto; - cursor: pointer -} - -/* Location styles reuse many existing classes */ -.map-view { - height: 28vh; - border-radius: 18px; - margin: 12px; - padding: 12px; - background: #fff -} - -.action-row { - display: flex; - gap: 12px; - justify-content: space-evenly; - margin: 12px -} - -.action-btn.alt { - background: #1976d2 -} - -.emergency-row { - display: flex; - gap: 8px; - margin-top: 8px -} - -.emergency-btn { - flex: 1; - background: #fff0f0; - border-radius: 14px; - padding: 12px; - border: 0; - cursor: pointer -} - -.list-section { - padding: 12px -} - -.list-item { - display: flex; - align-items: center; - background: #f7f7fa; - border-radius: 14px; - padding: 12px; - margin-bottom: 10px -} - -.list-item-name { - font-size: 15px; - font-weight: 600 -} - -.list-item-address { - font-size: 13px; - color: #888 -} - -/* Login/Signup styles adjustments */ -.input { - display: block; - width: 100%; - padding: 10px; - border-radius: 8px; - border: 1px solid #e0e0e0; - margin-bottom: 12px -} - -.remember-row { - display: flex; - justify-content: space-between; - align-items: center; - margin-bottom: 12px -} - -.forgot { - background: none; - border: 0; - color: red; - cursor: pointer -} - -.login-btn { - background: red; - color: #fff; - padding: 12px; - border-radius: 30px; - border: 0; - display: block; - width: 100%; - cursor: pointer -} - -.divider-row { - display: flex; - align-items: center; - margin: 12px 0 -} - -.divider { - flex: 1; - height: 1; - background: #ddd -} - -.or-text { - margin: 0 10px; - color: #900 -} - -.social-row { - display: flex; - gap: 12px; - justify-content: center; -} - -.social-btn { - border: 1px solid #ddd; - padding: 10px 14px; - border-radius: 30px; - background: #fff; - cursor: pointer -} - -.bottom-nav { - display: flex; - justify-content: space-around; - padding: 12px; - border-top: 1px solid #eee; - background: #fff -} - -.nav-text { - font-size: 12px; - color: #777; - text-align: center -} - -.nav-text-active { - font-size: 12px; - color: red; - text-align: center -} - -.signup-btn { - background: red; - color: #fff; - padding: 12px; - border-radius: 30px; - border: 0; - display: block; - width: 100%; - cursor: pointer -} - -.dividerContainer { - display: flex; - align-items: center; - margin: 12px 0 -} - -.line { - flex: 1; - height: 1; - background: #ccc -} - -.orText { - margin: 0 10px; - color: #777 -} - -.socialContainer { - display: flex; - justify-content: space-evenly; - margin-bottom: 20px -} - -.socialBtn { - border: 1px solid #ccc; - padding: 10px 14px; - border-radius: 10px; - background: #fff; - cursor: pointer -} - -.link { - background: none; - border: 0; - cursor: pointer -} \ No newline at end of file diff --git a/vercel.json b/vercel.json deleted file mode 100644 index cfe1444..0000000 --- a/vercel.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "github": { - "productionBranch": "prod" - } -} - From bc4dcfb0bfdee27d134b21c1a77a767abd6449db Mon Sep 17 00:00:00 2001 From: Kushal mahawar Date: Thu, 25 Sep 2025 22:54:33 +0530 Subject: [PATCH 08/13] fix: minor fixes in web (#23) * chore: test (#10) * chore: added ci jobs (#13) * chore: test (#9) * chore: added labeler * fix: fix minor issues * chore: testing jobs * chore: updated workflows * chore: updated wordflows (#11) * chore: added labeler * fix: fix minor issues * chore: testing jobs * chore: updated workflows * chore: updated ci jobs (#15) * chore: added labeler * fix: fix minor issues * chore: updated ci jobs * chore: update workflows (#17) * chore: added labeler * fix: fix minor issues * feat: #01 Auth Working and complete signup and login Funtionallity * fix : Fix Bugs or error * Fix : Env Variable Hided * Fix * init * chore: update workflows * chore: update workflows --------- Co-authored-by: kushal * chore: updated ci jobs (#18) * chore: added labeler * fix: fix minor issues * feat: #01 Auth Working and complete signup and login Funtionallity * fix : Fix Bugs or error * Fix : Env Variable Hided * Fix * init * chore: update workflows * chore: update workflows * chore: fix ci jobs * chore: Trigger CI re-run --------- Co-authored-by: kushal * Kushal (#19) * feat: #01 Auth Working and complete signup and login Funtionallity * fix : Fix Bugs or error * Fix : Env Variable Hided * Fix * init * chore: fix file name * chore: Trigger CI re-run * fix: updated package json * fix: added eslint * chore(web): run eslint on src and add minimal config * fix : eslint --------- Co-authored-by: Mohit Kumhar * chore: test (#10) * chore: fix authMiddlewere case-sensitive error * fix: conflicts * feat: Profile Section With All user detail Added * feat: Location Page Updated * fix: fix conflicts 2 --------- Co-authored-by: Mohit Kumhar --- ShieldX-Web/src/App.jsx | 8 + ShieldX-Web/src/components/BottomTabs.jsx | 2 +- ShieldX-Web/src/pages/AlertPreferences.jsx | 30 ++ ShieldX-Web/src/pages/Home.jsx | 22 +- ShieldX-Web/src/pages/Location.jsx | 468 ++++++++++++++++++--- ShieldX-Web/src/pages/PrivacySettings.jsx | 27 ++ ShieldX-Web/src/pages/Profile.jsx | 291 +++++++++++++ ShieldX-Web/src/pages/Settings.jsx | 23 + ShieldX-Web/src/styles/index.css | 372 +++++++++++++++- server/models/UserR.js | 12 + server/routes/auth.js | 30 +- server/src/index.js | 4 +- server/test_register.js | 25 -- 13 files changed, 1206 insertions(+), 108 deletions(-) create mode 100644 ShieldX-Web/src/pages/AlertPreferences.jsx create mode 100644 ShieldX-Web/src/pages/PrivacySettings.jsx create mode 100644 ShieldX-Web/src/pages/Profile.jsx create mode 100644 ShieldX-Web/src/pages/Settings.jsx delete mode 100644 server/test_register.js diff --git a/ShieldX-Web/src/App.jsx b/ShieldX-Web/src/App.jsx index 119f7ad..5717a8f 100644 --- a/ShieldX-Web/src/App.jsx +++ b/ShieldX-Web/src/App.jsx @@ -7,7 +7,11 @@ import Chat from './pages/Chat' import Location from './pages/Location' import Alerts from './pages/Alerts' import Evidence from './pages/Evidence' +import Profile from './pages/Profile' import BottomTabs from './components/BottomTabs' +import AlertPreferences from './pages/AlertPreferences' +import PrivacySettings from './pages/PrivacySettings' +import Settings from './pages/Settings' export default function App() { const isAuth = () => !!localStorage.getItem('authUser') @@ -28,6 +32,10 @@ export default function App() { } /> } /> } /> + } /> + } /> + } /> + } /> {isAuth() && } diff --git a/ShieldX-Web/src/components/BottomTabs.jsx b/ShieldX-Web/src/components/BottomTabs.jsx index 52ee901..edb2ab8 100644 --- a/ShieldX-Web/src/components/BottomTabs.jsx +++ b/ShieldX-Web/src/components/BottomTabs.jsx @@ -13,7 +13,7 @@ export default function BottomTabs(){
Chat
Location
Alerts
- + {/* Logout moved to Profile page */} ) } diff --git a/ShieldX-Web/src/pages/AlertPreferences.jsx b/ShieldX-Web/src/pages/AlertPreferences.jsx new file mode 100644 index 0000000..af3e6d0 --- /dev/null +++ b/ShieldX-Web/src/pages/AlertPreferences.jsx @@ -0,0 +1,30 @@ +import React from 'react' +import { useNavigate } from 'react-router-dom' + +export default function AlertPreferences(){ + const navigate = useNavigate() + return ( +
+
+ +
Alert Preferences
+
+
+ +
+

Alert Preferences

+
+ + + +
+
+
+ ) +} diff --git a/ShieldX-Web/src/pages/Home.jsx b/ShieldX-Web/src/pages/Home.jsx index 140d9f3..60b1078 100644 --- a/ShieldX-Web/src/pages/Home.jsx +++ b/ShieldX-Web/src/pages/Home.jsx @@ -24,6 +24,21 @@ export default function Home() { timerRef.current = setTimeout(() => { setStatus('Help Arrived'); setPanicActive(false) }, 6000) } + // load user from localStorage to show avatar + const [user, setUser] = useState(null) + useEffect(() => { + try { + const raw = localStorage.getItem('authUser') + if (raw) { + const parsed = JSON.parse(raw) + setUser(parsed) + } + } catch (e) { /* ignore */ } + }, []) + + const initials = (user?.name || user?.username || 'U').split(' ').map(s => s[0]).slice(0,2).join('').toUpperCase() + const avatar = user?.avatar || null + return (
@@ -32,7 +47,12 @@ export default function Home() {
AI Police Alert
- +
+ + +
diff --git a/ShieldX-Web/src/pages/Location.jsx b/ShieldX-Web/src/pages/Location.jsx index e803f8b..7229bc9 100644 --- a/ShieldX-Web/src/pages/Location.jsx +++ b/ShieldX-Web/src/pages/Location.jsx @@ -1,88 +1,438 @@ -import React, { useState } from 'react' +import React, { useState, useEffect, useRef, useCallback } from 'react' import { IoIosShareAlt } from 'react-icons/io' -import { MdSettings, MdPlace } from 'react-icons/md' +import { MdSettings, MdPlace, MdMyLocation, MdDirections, MdOutlineSafetyCheck } from 'react-icons/md' +import { FiAlertTriangle } from 'react-icons/fi' + +// NOTE: This file implements a prototype of an advanced Location page. +// Many production features (real AI models, secure APIs, websocket endpoints) +// are simulated or stubbed here. Replace stubs with your server endpoints / models. const dummyLocations = [ - { id: '1', name: 'Police Station', address: 'Sector 21, Main Road' }, - { id: '2', name: 'Hospital', address: 'City Hospital, Block B' }, - { id: '3', name: 'Your Last Location', address: 'Park Avenue, Sector 17' }, + { id: 'ps1', type: 'police', name: 'Sector 21 Police Station', address: 'Sector 21, Main Road', lat: 28.6168, lng: 77.2090 }, + { id: 'h1', type: 'hospital', name: 'City Hospital', address: 'Block B', lat: 28.6140, lng: 77.2070 }, + { id: 'f1', type: 'fire', name: 'Central Fire Station', address: 'Depot Rd', lat: 28.6185, lng: 77.2130 }, ] + const emergencyContacts = [ - { id: '1', name: 'Police', phone: '100' }, - { id: '2', name: 'Ambulance', phone: '102' }, - { id: '3', name: 'Fire', phone: '101' }, + { id: 'c1', name: 'Local Police', phone: '100' }, + { id: 'c2', name: 'Ambulance', phone: '102' }, + { id: 'c3', name: 'Fire', phone: '101' }, ] +function haversineDistance(a, b) { + const toRad = v => v * Math.PI / 180 + const R = 6371 // km + const dLat = toRad(b.lat - a.lat) + const dLon = toRad(b.lng - a.lng) + const lat1 = toRad(a.lat), lat2 = toRad(b.lat) + const x = Math.sin(dLat/2)*(Math.sin(dLat/2)) + Math.cos(lat1)*Math.cos(lat2)*Math.sin(dLon/2)*(Math.sin(dLon/2)) + const c = 2 * Math.atan2(Math.sqrt(x), Math.sqrt(1-x)) + return R * c +} + export default function Location() { + // COMMON const [search, setSearch] = useState('') - const [officerStatus, setOfficerStatus] = useState('No active alert') + const [suggestions, setSuggestions] = useState([]) + const [searching, setSearching] = useState(false) + const [recentSearches, setRecentSearches] = useState([]) + const [sharingEnabled, setSharingEnabled] = useState(() => { try { return JSON.parse(localStorage.getItem('shareLocation')) || false } catch(e){return false} }) + + // Map and location + const mapRef = useRef(null) + const mapInstance = useRef(null) + const markerRef = useRef(null) + const watchIdRef = useRef(null) + const [userLoc, setUserLoc] = useState({ lat: 28.6139, lng: 77.2090 }) + const [accuracy, setAccuracy] = useState(null) + const [hasGoogleKey, setHasGoogleKey] = useState(false) + const [placesService, setPlacesService] = useState(null) + + // Nearby services and recent + const [nearby, setNearby] = useState([]) + const [savedLocations, setSavedLocations] = useState(() => { try { return JSON.parse(localStorage.getItem('savedLocations')) || [] } catch(e){return []} }) + + // AI / realtime stubs + const [policeUnits, setPoliceUnits] = useState([]) + const [aiSafety, setAiSafety] = useState({ score: 7, color: 'green' }) + const [notifications, setNotifications] = useState([]) + const [toast, setToast] = useState(null) - const triggerAlert = () => { - setOfficerStatus('Officer dispatched (ETA: 2 min)') - window.alert('Police Alert Sent\nAn officer is being dispatched to your location.') - setTimeout(() => setOfficerStatus('Officer en route (ETA: 1 min)'), 2000) - setTimeout(() => setOfficerStatus('Officer arrived'), 6000) + const GOOGLE_KEY = (typeof import.meta !== 'undefined' && import.meta.env && import.meta.env.VITE_GOOGLE_MAPS_KEY) || '' + + // UTIL + const showToast = (msg, ms = 3000) => { setToast(msg); setTimeout(()=>setToast(null), ms) } + + // Load Google maps script if key available + const loadGoogleMaps = useCallback((key) => new Promise((resolve, reject) => { + if (!key) return reject(new Error('No API key')) + if (typeof window === 'undefined') return reject(new Error('No window')) + if (window.google && window.google.maps) return resolve(window.google.maps) + const script = document.createElement('script') + script.src = `https://maps.googleapis.com/maps/api/js?key=${key}&libraries=places,geometry` + script.async = true + script.defer = true + script.onload = () => { if (window.google && window.google.maps) resolve(window.google.maps); else reject(new Error('Google maps failed to load')) } + script.onerror = () => reject(new Error('Google maps script load error')) + document.head.appendChild(script) + }), []) + + // Init map when available + const initMap = useCallback((maps, center) => { + if (!mapRef.current) return + mapInstance.current = new maps.Map(mapRef.current, { center, zoom: 14, disableDefaultUI: true }) + markerRef.current = new maps.Marker({ position: center, map: mapInstance.current, title: 'You' }) + setPlacesService(new maps.places.PlacesService(mapInstance.current)) + }, []) + + // Center map helper + const centerMap = (lat, lng) => { + const pos = { lat: Number(lat), lng: Number(lng) } + setUserLoc(pos) + if (mapInstance.current) { + mapInstance.current.panTo(pos) + if (markerRef.current) markerRef.current.setPosition(pos) + else markerRef.current = new window.google.maps.Marker({ position: pos, map: mapInstance.current }) + } } - const shareLocation = () => { - window.open('https://maps.google.com', '_blank') + // Geocode (basic) via Google Geocode (client) - replace with server proxy in production + const geocodeAddress = async (q) => { + if (!GOOGLE_KEY) throw new Error('No key') + const url = `https://maps.googleapis.com/maps/api/geocode/json?address=${encodeURIComponent(q)}&key=${GOOGLE_KEY}` + const res = await fetch(url) + const body = await res.json() + if (body.status === 'OK' && body.results && body.results.length) return body.results[0] + throw new Error('Not found') } - const callEmergency = (phone) => window.alert(`Call ${phone}`) + // Autocomplete using Google Places AutocompleteService when available + const getAutocomplete = useCallback((input) => { + if (!input) { setSuggestions([]); return } + if (window.google && window.google.maps && window.google.maps.places) { + const service = new window.google.maps.places.AutocompleteService() + service.getPlacePredictions({ input, types: ['geocode','establishment'] }, (preds, status) => { + if (status === window.google.maps.places.PlacesServiceStatus.OK && preds) setSuggestions(preds.map(p => ({ id: p.place_id, description: p.description }))) + else setSuggestions([]) + }) + } else { + // fallback: simple debounced geocode suggestions via Geocoding API (expensive) + geocodeAddress(input).then(r => setSuggestions([{ id: r.place_id || input, description: r.formatted_address }])).catch(()=>setSuggestions([])) + } + }, []) - return ( -
-
-
Location
- -
+ // Fetch nearby places: prefer Google Places, otherwise compute from dummy list + const fetchNearby = useCallback(async (lat, lng) => { + const center = { lat, lng } + if (placesService && window.google && window.google.maps) { + const request = { location: new window.google.maps.LatLng(lat, lng), radius: 3000, type: ['police','hospital','fire_station'] } + placesService.nearbySearch(request, (results, status) => { + if (status === window.google.maps.places.PlacesServiceStatus.OK && results) { + const out = results.map(r => ({ id: r.place_id, name: r.name, address: r.vicinity || r.formatted_address, lat: r.geometry.location.lat(), lng: r.geometry.location.lng(), type: r.types && r.types[0] })) + setNearby(out) + } + }) + return + } + // fallback: dummy list with distances + const computed = dummyLocations.map(d => ({ ...d, distanceKm: haversineDistance(center, { lat: d.lat, lng: d.lng }), open24: Math.random() > 0.2 })) + setNearby(computed) + }, [placesService]) -
- setSearch(e.target.value)} /> -
+ // AI safety score stub (replace with ML endpoint). Uses simple heuristics for demo + const computeSafetyScore = useCallback((pos) => { + // score 1-10: closer to police -> higher score; night reduces score + const nearestPolice = dummyLocations.filter(d => d.type === 'police').map(p => haversineDistance(pos, { lat: p.lat, lng: p.lng })).sort((a,b)=>a-b)[0] || 5 + const hour = new Date().getHours() + let base = Math.max(1, 10 - Math.round(nearestPolice)) + if (hour < 6 || hour > 20) base = Math.max(1, base - 2) + const color = base >= 8 ? 'green' : base >=5 ? 'yellow' : 'red' + setAiSafety({ score: base, color }) + }, []) -
-
- -
Map placeholder for web. Use mobile app for live map features.
-
-
+ // Simulated real-time police units via WebSocket or fallback simulated updates + useEffect(() => { + let ws + const url = (typeof import.meta !== 'undefined' && import.meta.env && import.meta.env.VITE_POLICE_WS) || 'ws://localhost:4000/police' + try { + ws = new WebSocket(url) + ws.onopen = () => console.log('WS connected') + ws.onmessage = (ev) => { + try { const data = JSON.parse(ev.data); setPoliceUnits(data.units || []) } catch(e){} + } + ws.onclose = () => { console.log('WS closed') } + } catch (e) { + // fallback: simulate units + const sim = [ + { id: 'u1', lat: userLoc.lat + 0.002, lng: userLoc.lng + 0.003, status: 'available', etaMin: 2 }, + { id: 'u2', lat: userLoc.lat - 0.004, lng: userLoc.lng - 0.001, status: 'busy', etaMin: 8 } + ] + setPoliceUnits(sim) + const t = setInterval(()=>{ + // jitter positions + setPoliceUnits(prev => prev.map(p=>({ ...p, lat: p.lat + (Math.random()-0.5)*0.0005, lng: p.lng + (Math.random()-0.5)*0.0005 }))) + }, 3000) + return ()=>clearInterval(t) + } + return ()=>{ try{ ws.close() }catch(e){} } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []) -
-
🛡️
-
{officerStatus}
-
+ // watch user location + useEffect(() => { + if (!('geolocation' in navigator)) { showToast('Geolocation not supported'); return } + watchIdRef.current = navigator.geolocation.watchPosition(pos => { + const lat = pos.coords.latitude, lng = pos.coords.longitude + setAccuracy(pos.coords.accuracy) + setUserLoc({ lat, lng }) + centerMap(lat, lng) + computeSafetyScore({ lat, lng }) + fetchNearby(lat, lng) + }, err => { showToast('Location error: ' + (err.message||err.code)) }, { enableHighAccuracy: true, maximumAge: 5000, timeout: 5000 }) + return ()=>{ if (watchIdRef.current) navigator.geolocation.clearWatch(watchIdRef.current) } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [computeSafetyScore, fetchNearby]) -
- - - -
+ // load maps if key present + useEffect(()=>{ + if (!GOOGLE_KEY) { setHasGoogleKey(false); return } + setHasGoogleKey(true) + loadGoogleMaps(GOOGLE_KEY).then(maps=>initMap(maps, userLoc)).catch(e=>{ console.warn('Maps failed', e); setHasGoogleKey(false) }) + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [GOOGLE_KEY]) + + // search handlers + useEffect(()=>{ const t = setTimeout(()=>getAutocomplete(search), 250); return ()=>clearTimeout(t) }, [search, getAutocomplete]) + + const onSelectSuggestion = async (s) => { + setSearch(s.description) + setSuggestions([]) + try { + if (window.google && window.google.maps && window.google.maps.places && s.id) { + const ps = new window.google.maps.places.PlacesService(document.createElement('div')) + ps.getDetails({ placeId: s.id }, (res, status) => { if (status === window.google.maps.places.PlacesServiceStatus.OK) centerMap(res.geometry.location.lat(), res.geometry.location.lng()) }) + } else { + const g = await geocodeAddress(s.description) + const loc = g.geometry.location + centerMap(loc.lat, loc.lng) + } + setRecentSearches(prev => { const next = [s.description, ...prev.filter(x=>x!==s.description)].slice(0,8); localStorage.setItem('recentSearches', JSON.stringify(next)); return next }) + } catch (e) { showToast('Could not locate') } + } + + useEffect(()=>{ try{ const r = JSON.parse(localStorage.getItem('recentSearches')||'[]'); setRecentSearches(Array.isArray(r)?r:[]) }catch(e){} }, []) + + // toggle sharing + const toggleSharing = () => { const n = !sharingEnabled; setSharingEnabled(n); localStorage.setItem('shareLocation', JSON.stringify(n)); showToast(n ? 'Location sharing enabled' : 'Location sharing disabled') } + + // Quick actions + const reportIncident = () => { + const text = window.prompt('Quick report (what happened?)') + if (!text) return + // In production, POST to server /reports + setNotifications(prev => [{ id: Date.now().toString(), text: 'Incident reported: ' + text, time: Date.now() }, ...prev].slice(0,20)) + showToast('Incident reported — help on the way') + } + + const safeModeToggle = () => { showToast('Safe mode enabled'); /* implement continuous monitoring hooks here */ } + + // share with emergency contacts (simulated) + const shareWithContacts = () => { + if (!sharingEnabled) { showToast('Enable sharing first'); return } + // in prod, send to server or directly to contacts via SMS/Push + showToast('Location shared with emergency contacts') + } + + // ====== Missing helpers (search, location, call, directions) ====== + const doSearch = async (q) => { + if (!q || !q.trim()) { showToast('Enter a search term'); return } + try { + setSearching(true) + if (hasGoogleKey) { + // Try client-side geocode (small demo). In production, proxy this server-side. + const res = await geocodeAddress(q) + const loc = res.geometry.location + centerMap(loc.lat, loc.lng) + } else { + // fallback simple name/address match + const low = q.toLowerCase() + const found = dummyLocations.find(d => (d.name||'').toLowerCase().includes(low) || (d.address||'').toLowerCase().includes(low)) + if (found) centerMap(found.lat, found.lng) + else showToast('No results') + } + // save to recent searches + setRecentSearches(prev => { const next = [q, ...prev.filter(x=>x!==q)].slice(0,8); localStorage.setItem('recentSearches', JSON.stringify(next)); return next }) + } catch (e) { + console.warn(e) + showToast('Search failed') + } finally { + setSearching(false) + } + } + + const useMyLocation = () => { + if (!('geolocation' in navigator)) { showToast('Geolocation not available'); return } + navigator.geolocation.getCurrentPosition(p => { + const lat = p.coords.latitude, lng = p.coords.longitude + setAccuracy(p.coords.accuracy) + centerMap(lat, lng) + computeSafetyScore({ lat, lng }) + fetchNearby(lat, lng) + }, err => showToast('Could not get location: ' + (err.message||err.code)), { enableHighAccuracy: true, timeout: 8000 }) + } + + const handleCall = async (phone) => { + if (!phone) return + try { + // mobile first: attempt tel: scheme + const isMobile = /Mobi|Android/i.test(navigator.userAgent) + if (isMobile) { + window.location.href = `tel:${phone}` + return + } + // desktop fallback: copy to clipboard and notify + await navigator.clipboard.writeText(phone) + showToast('Phone number copied: ' + phone) + } catch (e) { + // last-resort fallback + prompt('Call number', phone) + } + } -
-
Emergency Contacts
-
- {emergencyContacts.map(c => ( - - ))} + const openDirections = (lat, lng) => { + if (!lat || !lng) return showToast('Invalid destination') + const g = `https://www.google.com/maps/dir/?api=1&destination=${lat},${lng}` + window.open(g, '_blank') + } + + const removeSaved = (id) => { + setSavedLocations(prev => { + const next = prev.filter(x=>x.id!==id) + try { localStorage.setItem('savedLocations', JSON.stringify(next)) } catch(e){} + return next + }) + } + + + // UI helpers + const safetyBadge = () => ( +
+ +
{aiSafety.score}/10
+
+ ) + + // minimal responsive layout and accessibility + return ( +
+
+
+
Location
+ {safetyBadge()}
+
+ + +
+
+ +
+ setSearch(e.target.value)} /> + + +
-
-
Nearby & Recent Locations
- {dummyLocations.map(item => ( -
-
-
-
{item.name}
-
{item.address}
+
+
+ {/* If Google Maps loaded we attach the map to this div via ref; otherwise show OSM iframe fallback */} + {hasGoogleKey ? ( +
+ ) : ( +
+