yassinekolsi commited on
Commit
de77cc2
·
1 Parent(s): 680788a

docs: Updated README

Browse files
Files changed (2) hide show
  1. README.md +132 -14
  2. ui/pnpm-lock.yaml +36 -0
README.md CHANGED
@@ -1,27 +1,145 @@
1
- DeepPurpose002 Training & Prediction (DTI)
2
 
3
- Ce repo contient un pipeline DeepPurpose pour :
4
 
5
- entraîner un modèle Drug–Target Interaction (DTI) à partir de paires (SMILES, séquence protéique, label),
 
 
 
6
 
7
- évaluer le modèle (métriques + logs),
8
 
9
- prédire des interactions/affinités sur de nouvelles paires et exporter les résultats.
 
 
 
 
10
 
11
- Contenu
12
 
13
- deeppurpose002.py : chargement données preprocessing/encodage entraînement évaluation → sauvegarde modèle + outputs
 
 
 
 
14
 
15
- prediction_test.py (ou équivalent) : chargement du modèle sauvegardé → prédictions → export CSV
16
 
17
- Utilisation
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
18
  python deeppurpose002.py
19
- python prediction_test.py
20
 
21
- Format attendu
 
 
 
 
 
 
 
 
 
22
 
23
- Train (supervisé) : drug_smiles, target_sequence, label
24
 
25
- Predict : drug_smiles, target_sequence
26
 
27
- Outputs : modèles dans models/, résultats/logs dans outputs/.
 
1
+ # 🧬 Multimodal Biological Design & Discovery Intelligence
2
 
3
+ > Drug-Target Interaction prediction platform powered by DeepPurpose ML + Qdrant vector search + Next.js visualization
4
 
5
+ ![Python](https://img.shields.io/badge/Python-3.10-blue)
6
+ ![Next.js](https://img.shields.io/badge/Next.js-16-black)
7
+ ![CUDA](https://img.shields.io/badge/CUDA-11.8-green)
8
+ ![License](https://img.shields.io/badge/License-MIT-yellow)
9
 
10
+ ## 🎯 Overview
11
 
12
+ This platform enables **drug discovery** through:
13
+ - **Deep Learning** — Morgan fingerprints + CNN protein encoding (DeepPurpose)
14
+ - **Vector Search** — Similarity search via Qdrant embeddings
15
+ - **3D Visualization** — Real PCA projections of drug-target space
16
+ - **Interactive UI** — Next.js dashboard with Recharts
17
 
18
+ ## 📊 Model Performance
19
 
20
+ | Dataset | Concordance Index | Pearson | MSE |
21
+ |---------|-------------------|---------|-----|
22
+ | **KIBA** | 0.7003 | 0.5219 | 0.0008 |
23
+ | **BindingDB_Kd** | 0.8083 | 0.7679 | 0.6668 |
24
+ | **DAVIS** | 0.7914 | 0.5446 | 0.4684 |
25
 
26
+ ## 🏗️ Architecture
27
 
28
+ ```
29
+ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
30
+ │ TDC Dataset │────▶│ DeepPurpose │────▶│ Qdrant │
31
+ │ (KIBA/DAVIS) │ │ Morgan + CNN │ │ 256D Vectors │
32
+ └─────────────────┘ └─────────────────┘ └────────┬────────┘
33
+
34
+ ┌─────────────────┐ ┌─────────────────┐ │
35
+ │ Next.js UI │◀────│ FastAPI │◀─────────────┘
36
+ │ localhost:3000│ │ localhost:8001│ Similarity Search
37
+ └─────────────────┘ └─────────────────┘
38
+ ```
39
+
40
+ ## 🚀 Quick Start
41
+
42
+ ### Prerequisites
43
+ - Python 3.10
44
+ - Node.js 18+
45
+ - Docker Desktop (for Qdrant)
46
+ - CUDA 11.8 (optional, for GPU)
47
+
48
+ ### 1. Setup Python Environment
49
+ ```bash
50
+ python -m venv .venv
51
+ .venv\Scripts\activate # Windows
52
+ pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
53
+ pip install DeepPurpose qdrant-client fastapi uvicorn scikit-learn
54
+ ```
55
+
56
+ ### 2. Start Qdrant (Vector Database)
57
+ ```bash
58
+ docker run -d --name qdrant -p 6333:6333 -p 6334:6334 qdrant/qdrant:latest
59
+ ```
60
+
61
+ ### 3. Ingest Data (One-time)
62
+ ```bash
63
+ python ingest_qdrant.py
64
+ # Loads KIBA dataset, generates embeddings, uploads to Qdrant
65
+ # ~23,531 drug-target pairs indexed
66
+ ```
67
+
68
+ ### 4. Start API Server
69
+ ```bash
70
+ python -m uvicorn server.api:app --host 0.0.0.0 --port 8001
71
+ ```
72
+
73
+ ### 5. Start Frontend
74
+ ```bash
75
+ cd ui
76
+ pnpm install
77
+ pnpm dev
78
+ # Open http://localhost:3000
79
+ ```
80
+
81
+ ## 📁 Project Structure
82
+
83
+ ```
84
+ ├── config.py # Shared configuration (model paths, Qdrant settings)
85
+ ├── ingest_qdrant.py # ETL: TDC → DeepPurpose → Qdrant
86
+ ├── deeppurpose002.py # Model training script
87
+ ├── server/
88
+ │ └── api.py # FastAPI backend (/health, /api/points, /api/search)
89
+ ├── runs/
90
+ │ └── 20260125_104915_KIBA/ # Best model checkpoint
91
+ │ ├── model.pt
92
+ │ └── config.pkl
93
+ ├── ui/ # Next.js 16 + Shadcn UI
94
+ │ ├── app/
95
+ │ │ ├── explorer/ # 3D scatter plot visualization
96
+ │ │ ├── discovery/ # Drug discovery interface
97
+ │ │ └── data/ # Data browser
98
+ │ └── lib/
99
+ │ └── explorer-service.ts # API client
100
+ └── data/
101
+ └── kiba.tab # Cached TDC dataset
102
+ ```
103
+
104
+ ## 🔌 API Endpoints
105
+
106
+ | Endpoint | Method | Description |
107
+ |----------|--------|-------------|
108
+ | `/health` | GET | Service health + metrics |
109
+ | `/api/points` | GET | Get 3D PCA points for visualization |
110
+ | `/api/search` | POST | Similarity search by SMILES/sequence |
111
+
112
+ ### Example: Get Points
113
+ ```bash
114
+ curl "http://localhost:8001/api/points?limit=100&view=combined"
115
+ ```
116
+
117
+ ### Example: Search Similar
118
+ ```bash
119
+ curl -X POST "http://localhost:8001/api/search" \
120
+ -H "Content-Type: application/json" \
121
+ -d '{"smiles": "CC(=O)OC1=CC=CC=C1C(=O)O", "top_k": 10}'
122
+ ```
123
+
124
+ ## 🧪 Training New Models
125
+
126
+ ```bash
127
+ # Edit deeppurpose002.py to change dataset/encoding
128
  python deeppurpose002.py
 
129
 
130
+ # Re-ingest with new model
131
+ python ingest_qdrant.py
132
+ ```
133
+
134
+ ## 👥 Contributors
135
+
136
+ - **Hamza Sammoud** — ML Pipeline & Backend
137
+ - **Rami Troudi** — Frontend UI
138
+
139
+ ## 📄 License
140
 
141
+ MIT License - See [LICENSE](LICENSE) for details.
142
 
143
+ ---
144
 
145
+ *Built for Hackathon 2026* 🏆
ui/pnpm-lock.yaml CHANGED
@@ -393,89 +393,105 @@ packages:
393
  resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==}
394
  cpu: [arm64]
395
  os: [linux]
 
396
 
397
  '@img/sharp-libvips-linux-arm@1.2.4':
398
  resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==}
399
  cpu: [arm]
400
  os: [linux]
 
401
 
402
  '@img/sharp-libvips-linux-ppc64@1.2.4':
403
  resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==}
404
  cpu: [ppc64]
405
  os: [linux]
 
406
 
407
  '@img/sharp-libvips-linux-riscv64@1.2.4':
408
  resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==}
409
  cpu: [riscv64]
410
  os: [linux]
 
411
 
412
  '@img/sharp-libvips-linux-s390x@1.2.4':
413
  resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==}
414
  cpu: [s390x]
415
  os: [linux]
 
416
 
417
  '@img/sharp-libvips-linux-x64@1.2.4':
418
  resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==}
419
  cpu: [x64]
420
  os: [linux]
 
421
 
422
  '@img/sharp-libvips-linuxmusl-arm64@1.2.4':
423
  resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==}
424
  cpu: [arm64]
425
  os: [linux]
 
426
 
427
  '@img/sharp-libvips-linuxmusl-x64@1.2.4':
428
  resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==}
429
  cpu: [x64]
430
  os: [linux]
 
431
 
432
  '@img/sharp-linux-arm64@0.34.5':
433
  resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==}
434
  engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
435
  cpu: [arm64]
436
  os: [linux]
 
437
 
438
  '@img/sharp-linux-arm@0.34.5':
439
  resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==}
440
  engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
441
  cpu: [arm]
442
  os: [linux]
 
443
 
444
  '@img/sharp-linux-ppc64@0.34.5':
445
  resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==}
446
  engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
447
  cpu: [ppc64]
448
  os: [linux]
 
449
 
450
  '@img/sharp-linux-riscv64@0.34.5':
451
  resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==}
452
  engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
453
  cpu: [riscv64]
454
  os: [linux]
 
455
 
456
  '@img/sharp-linux-s390x@0.34.5':
457
  resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==}
458
  engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
459
  cpu: [s390x]
460
  os: [linux]
 
461
 
462
  '@img/sharp-linux-x64@0.34.5':
463
  resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==}
464
  engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
465
  cpu: [x64]
466
  os: [linux]
 
467
 
468
  '@img/sharp-linuxmusl-arm64@0.34.5':
469
  resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==}
470
  engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
471
  cpu: [arm64]
472
  os: [linux]
 
473
 
474
  '@img/sharp-linuxmusl-x64@0.34.5':
475
  resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==}
476
  engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
477
  cpu: [x64]
478
  os: [linux]
 
479
 
480
  '@img/sharp-wasm32@0.34.5':
481
  resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==}
@@ -599,24 +615,28 @@ packages:
599
  engines: {node: '>= 10'}
600
  cpu: [arm64]
601
  os: [linux]
 
602
 
603
  '@next/swc-linux-arm64-musl@16.1.4':
604
  resolution: {integrity: sha512-3Wm0zGYVCs6qDFAiSSDL+Z+r46EdtCv/2l+UlIdMbAq9hPJBvGu/rZOeuvCaIUjbArkmXac8HnTyQPJFzFWA0Q==}
605
  engines: {node: '>= 10'}
606
  cpu: [arm64]
607
  os: [linux]
 
608
 
609
  '@next/swc-linux-x64-gnu@16.1.4':
610
  resolution: {integrity: sha512-lWAYAezFinaJiD5Gv8HDidtsZdT3CDaCeqoPoJjeB57OqzvMajpIhlZFce5sCAH6VuX4mdkxCRqecCJFwfm2nQ==}
611
  engines: {node: '>= 10'}
612
  cpu: [x64]
613
  os: [linux]
 
614
 
615
  '@next/swc-linux-x64-musl@16.1.4':
616
  resolution: {integrity: sha512-fHaIpT7x4gA6VQbdEpYUXRGyge/YbRrkG6DXM60XiBqDM2g2NcrsQaIuj375egnGFkJow4RHacgBOEsHfGbiUw==}
617
  engines: {node: '>= 10'}
618
  cpu: [x64]
619
  os: [linux]
 
620
 
621
  '@next/swc-win32-arm64-msvc@16.1.4':
622
  resolution: {integrity: sha512-MCrXxrTSE7jPN1NyXJr39E+aNFBrQZtO154LoCz7n99FuKqJDekgxipoodLNWdQP7/DZ5tKMc/efybx1l159hw==}
@@ -1495,24 +1515,28 @@ packages:
1495
  engines: {node: '>= 10'}
1496
  cpu: [arm64]
1497
  os: [linux]
 
1498
 
1499
  '@tailwindcss/oxide-linux-arm64-musl@4.1.18':
1500
  resolution: {integrity: sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==}
1501
  engines: {node: '>= 10'}
1502
  cpu: [arm64]
1503
  os: [linux]
 
1504
 
1505
  '@tailwindcss/oxide-linux-x64-gnu@4.1.18':
1506
  resolution: {integrity: sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==}
1507
  engines: {node: '>= 10'}
1508
  cpu: [x64]
1509
  os: [linux]
 
1510
 
1511
  '@tailwindcss/oxide-linux-x64-musl@4.1.18':
1512
  resolution: {integrity: sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==}
1513
  engines: {node: '>= 10'}
1514
  cpu: [x64]
1515
  os: [linux]
 
1516
 
1517
  '@tailwindcss/oxide-wasm32-wasi@4.1.18':
1518
  resolution: {integrity: sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==}
@@ -1705,41 +1729,49 @@ packages:
1705
  resolution: {integrity: sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==}
1706
  cpu: [arm64]
1707
  os: [linux]
 
1708
 
1709
  '@unrs/resolver-binding-linux-arm64-musl@1.11.1':
1710
  resolution: {integrity: sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==}
1711
  cpu: [arm64]
1712
  os: [linux]
 
1713
 
1714
  '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1':
1715
  resolution: {integrity: sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==}
1716
  cpu: [ppc64]
1717
  os: [linux]
 
1718
 
1719
  '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1':
1720
  resolution: {integrity: sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==}
1721
  cpu: [riscv64]
1722
  os: [linux]
 
1723
 
1724
  '@unrs/resolver-binding-linux-riscv64-musl@1.11.1':
1725
  resolution: {integrity: sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==}
1726
  cpu: [riscv64]
1727
  os: [linux]
 
1728
 
1729
  '@unrs/resolver-binding-linux-s390x-gnu@1.11.1':
1730
  resolution: {integrity: sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==}
1731
  cpu: [s390x]
1732
  os: [linux]
 
1733
 
1734
  '@unrs/resolver-binding-linux-x64-gnu@1.11.1':
1735
  resolution: {integrity: sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==}
1736
  cpu: [x64]
1737
  os: [linux]
 
1738
 
1739
  '@unrs/resolver-binding-linux-x64-musl@1.11.1':
1740
  resolution: {integrity: sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==}
1741
  cpu: [x64]
1742
  os: [linux]
 
1743
 
1744
  '@unrs/resolver-binding-wasm32-wasi@1.11.1':
1745
  resolution: {integrity: sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==}
@@ -3008,24 +3040,28 @@ packages:
3008
  engines: {node: '>= 12.0.0'}
3009
  cpu: [arm64]
3010
  os: [linux]
 
3011
 
3012
  lightningcss-linux-arm64-musl@1.30.2:
3013
  resolution: {integrity: sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==}
3014
  engines: {node: '>= 12.0.0'}
3015
  cpu: [arm64]
3016
  os: [linux]
 
3017
 
3018
  lightningcss-linux-x64-gnu@1.30.2:
3019
  resolution: {integrity: sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==}
3020
  engines: {node: '>= 12.0.0'}
3021
  cpu: [x64]
3022
  os: [linux]
 
3023
 
3024
  lightningcss-linux-x64-musl@1.30.2:
3025
  resolution: {integrity: sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==}
3026
  engines: {node: '>= 12.0.0'}
3027
  cpu: [x64]
3028
  os: [linux]
 
3029
 
3030
  lightningcss-win32-arm64-msvc@1.30.2:
3031
  resolution: {integrity: sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==}
 
393
  resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==}
394
  cpu: [arm64]
395
  os: [linux]
396
+ libc: [glibc]
397
 
398
  '@img/sharp-libvips-linux-arm@1.2.4':
399
  resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==}
400
  cpu: [arm]
401
  os: [linux]
402
+ libc: [glibc]
403
 
404
  '@img/sharp-libvips-linux-ppc64@1.2.4':
405
  resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==}
406
  cpu: [ppc64]
407
  os: [linux]
408
+ libc: [glibc]
409
 
410
  '@img/sharp-libvips-linux-riscv64@1.2.4':
411
  resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==}
412
  cpu: [riscv64]
413
  os: [linux]
414
+ libc: [glibc]
415
 
416
  '@img/sharp-libvips-linux-s390x@1.2.4':
417
  resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==}
418
  cpu: [s390x]
419
  os: [linux]
420
+ libc: [glibc]
421
 
422
  '@img/sharp-libvips-linux-x64@1.2.4':
423
  resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==}
424
  cpu: [x64]
425
  os: [linux]
426
+ libc: [glibc]
427
 
428
  '@img/sharp-libvips-linuxmusl-arm64@1.2.4':
429
  resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==}
430
  cpu: [arm64]
431
  os: [linux]
432
+ libc: [musl]
433
 
434
  '@img/sharp-libvips-linuxmusl-x64@1.2.4':
435
  resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==}
436
  cpu: [x64]
437
  os: [linux]
438
+ libc: [musl]
439
 
440
  '@img/sharp-linux-arm64@0.34.5':
441
  resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==}
442
  engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
443
  cpu: [arm64]
444
  os: [linux]
445
+ libc: [glibc]
446
 
447
  '@img/sharp-linux-arm@0.34.5':
448
  resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==}
449
  engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
450
  cpu: [arm]
451
  os: [linux]
452
+ libc: [glibc]
453
 
454
  '@img/sharp-linux-ppc64@0.34.5':
455
  resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==}
456
  engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
457
  cpu: [ppc64]
458
  os: [linux]
459
+ libc: [glibc]
460
 
461
  '@img/sharp-linux-riscv64@0.34.5':
462
  resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==}
463
  engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
464
  cpu: [riscv64]
465
  os: [linux]
466
+ libc: [glibc]
467
 
468
  '@img/sharp-linux-s390x@0.34.5':
469
  resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==}
470
  engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
471
  cpu: [s390x]
472
  os: [linux]
473
+ libc: [glibc]
474
 
475
  '@img/sharp-linux-x64@0.34.5':
476
  resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==}
477
  engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
478
  cpu: [x64]
479
  os: [linux]
480
+ libc: [glibc]
481
 
482
  '@img/sharp-linuxmusl-arm64@0.34.5':
483
  resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==}
484
  engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
485
  cpu: [arm64]
486
  os: [linux]
487
+ libc: [musl]
488
 
489
  '@img/sharp-linuxmusl-x64@0.34.5':
490
  resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==}
491
  engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
492
  cpu: [x64]
493
  os: [linux]
494
+ libc: [musl]
495
 
496
  '@img/sharp-wasm32@0.34.5':
497
  resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==}
 
615
  engines: {node: '>= 10'}
616
  cpu: [arm64]
617
  os: [linux]
618
+ libc: [glibc]
619
 
620
  '@next/swc-linux-arm64-musl@16.1.4':
621
  resolution: {integrity: sha512-3Wm0zGYVCs6qDFAiSSDL+Z+r46EdtCv/2l+UlIdMbAq9hPJBvGu/rZOeuvCaIUjbArkmXac8HnTyQPJFzFWA0Q==}
622
  engines: {node: '>= 10'}
623
  cpu: [arm64]
624
  os: [linux]
625
+ libc: [musl]
626
 
627
  '@next/swc-linux-x64-gnu@16.1.4':
628
  resolution: {integrity: sha512-lWAYAezFinaJiD5Gv8HDidtsZdT3CDaCeqoPoJjeB57OqzvMajpIhlZFce5sCAH6VuX4mdkxCRqecCJFwfm2nQ==}
629
  engines: {node: '>= 10'}
630
  cpu: [x64]
631
  os: [linux]
632
+ libc: [glibc]
633
 
634
  '@next/swc-linux-x64-musl@16.1.4':
635
  resolution: {integrity: sha512-fHaIpT7x4gA6VQbdEpYUXRGyge/YbRrkG6DXM60XiBqDM2g2NcrsQaIuj375egnGFkJow4RHacgBOEsHfGbiUw==}
636
  engines: {node: '>= 10'}
637
  cpu: [x64]
638
  os: [linux]
639
+ libc: [musl]
640
 
641
  '@next/swc-win32-arm64-msvc@16.1.4':
642
  resolution: {integrity: sha512-MCrXxrTSE7jPN1NyXJr39E+aNFBrQZtO154LoCz7n99FuKqJDekgxipoodLNWdQP7/DZ5tKMc/efybx1l159hw==}
 
1515
  engines: {node: '>= 10'}
1516
  cpu: [arm64]
1517
  os: [linux]
1518
+ libc: [glibc]
1519
 
1520
  '@tailwindcss/oxide-linux-arm64-musl@4.1.18':
1521
  resolution: {integrity: sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==}
1522
  engines: {node: '>= 10'}
1523
  cpu: [arm64]
1524
  os: [linux]
1525
+ libc: [musl]
1526
 
1527
  '@tailwindcss/oxide-linux-x64-gnu@4.1.18':
1528
  resolution: {integrity: sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==}
1529
  engines: {node: '>= 10'}
1530
  cpu: [x64]
1531
  os: [linux]
1532
+ libc: [glibc]
1533
 
1534
  '@tailwindcss/oxide-linux-x64-musl@4.1.18':
1535
  resolution: {integrity: sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==}
1536
  engines: {node: '>= 10'}
1537
  cpu: [x64]
1538
  os: [linux]
1539
+ libc: [musl]
1540
 
1541
  '@tailwindcss/oxide-wasm32-wasi@4.1.18':
1542
  resolution: {integrity: sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==}
 
1729
  resolution: {integrity: sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==}
1730
  cpu: [arm64]
1731
  os: [linux]
1732
+ libc: [glibc]
1733
 
1734
  '@unrs/resolver-binding-linux-arm64-musl@1.11.1':
1735
  resolution: {integrity: sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==}
1736
  cpu: [arm64]
1737
  os: [linux]
1738
+ libc: [musl]
1739
 
1740
  '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1':
1741
  resolution: {integrity: sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==}
1742
  cpu: [ppc64]
1743
  os: [linux]
1744
+ libc: [glibc]
1745
 
1746
  '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1':
1747
  resolution: {integrity: sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==}
1748
  cpu: [riscv64]
1749
  os: [linux]
1750
+ libc: [glibc]
1751
 
1752
  '@unrs/resolver-binding-linux-riscv64-musl@1.11.1':
1753
  resolution: {integrity: sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==}
1754
  cpu: [riscv64]
1755
  os: [linux]
1756
+ libc: [musl]
1757
 
1758
  '@unrs/resolver-binding-linux-s390x-gnu@1.11.1':
1759
  resolution: {integrity: sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==}
1760
  cpu: [s390x]
1761
  os: [linux]
1762
+ libc: [glibc]
1763
 
1764
  '@unrs/resolver-binding-linux-x64-gnu@1.11.1':
1765
  resolution: {integrity: sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==}
1766
  cpu: [x64]
1767
  os: [linux]
1768
+ libc: [glibc]
1769
 
1770
  '@unrs/resolver-binding-linux-x64-musl@1.11.1':
1771
  resolution: {integrity: sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==}
1772
  cpu: [x64]
1773
  os: [linux]
1774
+ libc: [musl]
1775
 
1776
  '@unrs/resolver-binding-wasm32-wasi@1.11.1':
1777
  resolution: {integrity: sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==}
 
3040
  engines: {node: '>= 12.0.0'}
3041
  cpu: [arm64]
3042
  os: [linux]
3043
+ libc: [glibc]
3044
 
3045
  lightningcss-linux-arm64-musl@1.30.2:
3046
  resolution: {integrity: sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==}
3047
  engines: {node: '>= 12.0.0'}
3048
  cpu: [arm64]
3049
  os: [linux]
3050
+ libc: [musl]
3051
 
3052
  lightningcss-linux-x64-gnu@1.30.2:
3053
  resolution: {integrity: sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==}
3054
  engines: {node: '>= 12.0.0'}
3055
  cpu: [x64]
3056
  os: [linux]
3057
+ libc: [glibc]
3058
 
3059
  lightningcss-linux-x64-musl@1.30.2:
3060
  resolution: {integrity: sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==}
3061
  engines: {node: '>= 12.0.0'}
3062
  cpu: [x64]
3063
  os: [linux]
3064
+ libc: [musl]
3065
 
3066
  lightningcss-win32-arm64-msvc@1.30.2:
3067
  resolution: {integrity: sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==}